利用Matlab求解线性规划问题
線性規劃是一種優化方法,Matlab優化工具箱中有現成函數linprog對如下式描述的LP問題求解:
% min f'x
% s.t .(約束條件): Ax<=b
% (等式約束條件): Aeqx=beq
% lb<=x<=ub
linprog函數的調用格式如下:
x=linprog(f,A,b)
x=linprog(f,A,b,Aeq,beq)
x=linprog(f,A,b,Aeq,beq,lb,ub)
x=linprog(f,A,b,Aeq,beq,lb,ub,x0)
x=linprog(f,A,b,Aeq,beq,lb,ub,x0,options)
[x,fval]=linprog(…)
[x, fval, exitflag]=linprog(…)
[x, fval, exitflag, output]=linprog(…)
[x, fval, exitflag, output, lambda]=linprog(…)
其中:
x=linprog(f,A,b)返回值x為最優解向量。
x=linprog(f,A,b,Aeq,beq) 作有等式約束的問題。若沒有不等式約束,則令A=[ ]、b=[ ] 。
x=linprog(f,A,b,Aeq,beq,lb,ub,x0,options) 中lb ,ub為變量x的下界和上界,x0為初值點,options為指定優化參數進行最小化。
Options的參數描述:
Display顯示水平。 選擇’off’ 不顯示輸出;選擇’Iter’顯示每一 步迭代過程的輸出;選擇’final’ 顯示最終結果。
MaxFunEvals 函數評價的最大允許次數
Maxiter 最大允許迭代次數
TolX x處的終止容限
[x,fval]=linprog(…) 左端 fval 返回解x處的目標函數值。
[x,fval,exitflag,output,lambda]=linprog(f,A,b, Aeq,beq,lb,ub,x0) 的輸出部分:
exitflag 描述函數計算的退出條件:若為正值,表示目標函數收斂于解x處;若為負值,表示目標函數不收斂;若為零值,表示已經達到函數評價或迭代的最大次數。
output 返回優化信息:output.iterations表示迭代次數;output.algorithm表示所采用的算法;outprt.funcCount表示函數評價次數。
lambda 返回x處的拉格朗日乘子。它有以下屬性:
lambda.lower-lambda的下界;
lambda.upper-lambda的上界;
lambda.ineqlin-lambda的線性不等式;
lambda.eqlin-lambda的線性等式。
下面通過具體的例子來說明:
例如:某農場I、II、III等耕地的面積分別為100 hm2、300 hm2和200 hm2,計劃種植水稻、大豆和玉米,要求三種作物的最低收獲量分別為190000kg、130000kg和350000kg。I、II、III等耕地種植三種作物的單產如表5.1.4所示。若三種作物的售價分別為水稻1.20元/kg,大豆1.50元/kg,玉米0.80元/kg。那么,(1)如何制訂種植計劃,才能使總產量最大?(2)如何制訂種植計劃,才能使總產值最大?
表1不同等級耕地種植不同作物的單產(單位:kg / hm2)
| I等耕地 | II等耕地 | III等耕地 | |
| 水稻 | 11 000 | 9 500 | 9 000 |
| 大豆 | 8 000 | 6 800 | 6 000 |
| 玉米 | 14 000 | 12 000 | 10 000 |
首先根據題意建立線性規劃模型(決策變量設置如表2所示,表中表示第種作物在第j等級的耕地上的種植面積。):
表2 作物計劃種植面積(單位:hm2)
| I等耕地 | II等耕地 | III等耕地 | |
| 水稻 | |||
| 大豆 | |||
| 玉米 |
約束方程如下:
耕地面積約束:
最低收獲量約束:
非負約束:
(1)追求總產量最大,目標函數為:
(2)追求總產值最大,目標函數為:
根據求解函數linprog中的參數含義,列出系數矩陣,目標函數系數矩陣,以及約束條件等。
這些參數中沒有的設為空。譬如,
(1)當追求總產量最大時,只要將參數
f=[-11000 –9500 –9000 –8000 –6800 –6000 –14000 –12000 -10000];
A=[1.0000 0.0000 0.0000 1.0000 0.0000 0.0000 1.0000 0.0000 0.0000;
0.0000 1.0000 0.0000 0.0000 1.0000 0.0000 0.0000 1.0000 0.0000;
0.0000 0.0000 1.0000 0.0000 0.0000 1.0000 0.0000 0.0000 1.0000;
-11000.0000 0.0000 0.0000 -9500.0000 0.0000 0.0000 -9000.0000 0.0000 0.0000;
0.0000 -8000.0000 0.0000 0.0000 -6800.0000 0.0000 0.0000 -6000.0000 0.0000;
0.0000 0.0000 -14000.0000 0.0000 0.0000 -12000.0000 0.0000 0.0000 -10000.0000];
b=[100 300 200 -190000 -130000 -350000];
lb=[0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 ];
代入求解函數,即可求得結果。
(2)當追求總產值最大時,將參數
f=[-13200 –11400 –10800 –12000 –10200 –9000 –11200 –9600 -8000];
A=[1.0000 0.0000 0.0000 1.0000 0.0000 0.0000 1.0000 0.0000 0.0000;
0.0000 1.0000 0.0000 0.0000 1.0000 0.0000 0.0000 1.0000 0.0000;
0.0000 0.0000 1.0000 0.0000 0.0000 1.0000 0.0000 0.0000 1.0000;
-11000.0000 0.0000 0.0000 -9500.0000 0.0000 0.0000 -9000.0000 0.0000 0.0000;
0.0000 -8000.0000 0.0000 0.0000 -6800.0000 0.0000 0.0000 -6000.0000 0.0000;
0.0000 0.0000 -14000.0000 0.0000 0.0000 -12000.0000 0.0000 0.0000 -10000.0000];
b=[100 300 200 -190000 -130000 -350000];
lb=[0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 ];
代入求解函數,即可得到求解結果。
線性規劃,還有其他的幾種調用函數形式,可在Matlab幫助中查找LP或者LINPROG的幫助說明。
總結
以上是生活随笔為你收集整理的利用Matlab求解线性规划问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学之美 系列十六(上) 不要把所有的鸡
- 下一篇: 什么是泛函分析?