1.線性規划
求線性規划問題的最優解有兩種方法,一種方法是使用linprog命令,另一種是使用optimtool工具箱,下面分別介紹這兩種方法.
①linprog命令
一般情況下,Linprog命令的參數形式為[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub,x0),下面分別介紹各參數的含義.
[x,fval]返回值中x為最優解,fval為最優值.
f表示目標函數中各個變量前面的系數向量,如果是求最小值問題,那么f就是各個變量的系數,如果是求最大值問題,那么f就是各個變量的系數的相反數.
A和b 表示不等式約束A*x <=b中的矩陣A和向量b.
Aeq和beq 表示等式約束Aeq*x =beq中的矩陣Aeq和向量beq.
lb和ub 分別表示自變量的上下界組成的向量,如果沒有上下界,該選項用[]表示,如果只有部分變量有上下界,其余的變量沒有,那么可以把沒有上下界的變量的上下界設為-inf或者inf使lb或者ub的長度符合要求.
x0 表示變量的初始值,可以缺省.
例,求如下的線性規划問題
由目標函數可知f=[-5;-4;-6];
由約束條件可知矩陣A = [1 -11;3 2 4;3 2 0];右端向量為b = [20;42;30];
由自變量都大於零可知lb =[0;0;0];
所以求該線性規划問題最優解的代碼如下
f = [-5;-4;-6];
A = [1 -1 1;3 24;3 2 0];
b = [20;42;30];
lb = [0;0;0];
[x,fval] =linprog(f,A,b,[],[],lb)
其中Aeq和beq都為空,因為沒有等式約束條件,只有不等式約束條件.
②optimtool工具箱
在Command窗口輸入optimtool,即可彈出optimtool工具箱,如下
工具箱可以大致分為5個部分.第5部分為說明文檔,第4部分為優化選項,第3部分為最優解和最優值的顯示區域,第2部分為約束條件輸入區,第1部分可以填入目標函數值,初始值等.
利用工具箱求解①的問題,填入相應的數據,然后點擊【start】按鈕,得到結果如下
可以看到,最優解與linprog命令的方式求得的結果是相同的,但最優值不是-78,因為這是迭代的結果,只有在迭代次數區域無窮的時候,才能得到准確值-78.
再舉一例,利用MATLAB求解下面這個線性規划問題
這是求最大值問題,要先將問題化為求解最小值的問題,再進行求解.
利用linprog命令求解上述問題的代碼如下
f = [-2;-3;5];
A = [-2 5 -1];b= [-10];
Aeq = [1 11];beq = [7];
lb = [0;0;0];
[x,feval] = linprog(f,A,b,Aeq,beq,lb)
利用optimtool工具箱來求解過程如下圖
可以驗證,兩種求解方法的結果是相同的.最后取最優值為圖中顯示的最優值的相反數.
——————————————————————分割線——————————————————————
2.非線性規划
也有兩種求解的方法,一種是fmincon命令,另一種是optimtool工具箱.
①fmincon命令
fmincon命令的一般參數形式為fmincon(‘fun’,x0,A,b,Aeq,beq,lb,ub,’nonlinearcondition’),其中各個參數含義如下
fun 目標函數(以求最小值為目標函數)
x0 最優解迭代的初始值
A,b 線性約束不等式A*x<= b
Aeq,beq 線性約束等式Aeq*x =beq
lb,ub 自變量的上下界
nonlinearcondition 非線性約束函數,它有兩個返回值,其中一個為非線性不等式約
束,另一個是非線性等式約束(具體舉例說明該項參數的設置)
在具體編寫代碼過程中,可以將線性約束也寫在非線性約束函數nonlinearcondition中,簡化代碼.
例1,求下面這個非線性規划問題的最優值
首先,編寫目標函數的M函數文件,並保存為fun.m代碼如下
function f =fun(x)
f = x(1)^2 + x(2)^2 + 8;
end
其次,編寫線性和非線性約束的等式或不等式,編寫M函數文件,並保存為nonlinearcondition.m,代碼如下
function [f,ceq] = nonlinearcondition(x)
f = - x(1)^2 + x(2);
ceq = - x(1) - x(2)^2 + 2; %非線性等式約束
end
最后,在Command窗口輸入如下代碼
[x,fval] =fmincon('fun',[0;0],[],[],[],[],[0;0],[],'nonlinearcondition')
即可得到最優值和最優解為x = [1;1],fval = 10.
例2,求下面這個非線性規划問題的最優值
首先,編寫目標函數的M函數文件,由於求得是最大值,所以先化為求最小值問題,再原目標函數前面添加負號即可,M函數文件如下,保存為fun.m.
function f =fun(x)
f = -(sqrt(x(1)) + sqrt(x(2)) + sqrt(x(3)) +sqrt(x(4)));
end
然后,編寫線性和非線性約束不等式已經非線性約束等式的M函數文件,保存為nonlinearcondition.m,代碼如下
function [f,ceq]= nonlinearcondition(x)
%非線性和線性不等式有4個
f(1) =x(1) - 400;
f(2) =1.1*x(1) + x(2) - 440;
f(3) =1.21*x(1) + 1.1*x(2) + x(3) - 484;
f(4) =1.331*x(1) + 1.21*x(2) + 1.1*x(3) + x(4) - 532.4;
ceq = 0;%由於沒有非線性約束等式,所以這一項寫 0
end
最后,在Command窗口輸入如下代碼
[x,fval] =fmincon('fun',[0;0;0;0],[],[],[],[],[0;0;0;0],[],'nonlinearcondition')
即可得到最優解和最優值,最優值分別為
x =
86.1883
104.2879
126.1883
152.6879
fval = -43.0860
目標函數最優值為z = -fval=43.0860.
由於線性問題也可以看做是非線性問題的特殊情況,所以可用求解非線性問題的方法求解線性規划問題.
例3,利用fmincon命令求解1.①中的線性規划問題
首先,編寫目標函數的M函數文件,M函數文件如下,保存為fun.m.
function f =fun(x)
f = -5*x(1) - 4*x(2) - 6*x(3);
end
然后,編寫線性和非線性約束不等式已經非線性約束等式的M函數文件,保存為nonlinearcondition.m,代碼如下
function [f,ceq]= nonlinearcondition(x)
%由於有3個線性約束,所以f返回一個三維向量
f(1) =x(1) - x(2) + x(3) - 20;
f(2) =3*x(1) + 2*x(2) + 4*x(3) - 42;
f(3) =3*x(1) + 2*x(2) - 30;
ceq = 0;%沒有非線性等式
end
最后,在Command窗口輸入如下代碼
[x,fval] =fmincon('fun',[0;0;0],[],[],[],[],[0;0;0],[],'nonlinearcondition')
得到的結果與1.線性規划問題的1.①中所用的線性方法所得結果相同.
②optimtool工具箱
同樣,非線性規划也可以利用optimtool工具箱,因為其中有一項是填寫非線性約束條件的,如下
利用工具箱求解在2.①中的一個問題
首先,編寫目標函數的M函數文件,由於求得是最大值,所以先化為求最小值問題,再原目標函數前面添加負號即可,M函數文件如下,保存為fun.m.
function f =fun(x)
f = -(sqrt(x(1)) + sqrt(x(2)) + sqrt(x(3)) +sqrt(x(4)));
end
然后,編寫線性和非線性約束不等式已經非線性約束等式的M函數文件,保存為nonlinearcondition.m,代碼如下
function [f,ceq]= nonlinearcondition(x)
%非線性和線性不等式有4個
f(1) =x(1) - 400;
f(2) =1.1*x(1) + x(2) - 440;
f(3) =1.21*x(1) + 1.1*x(2) + x(3) - 484;
f(4) =1.331*x(1) + 1.21*x(2) + 1.1*x(3) + x(4) - 532.4;
ceq = 0;%由於沒有非線性約束等式,所以這一項寫 0
end
在optimtool工具箱中輸入相應參數,如下,即可得到相應結果
所得結果與利用fmincon命令所得結果相同.
小結
規划問題中還有特殊的一些問題,例如特殊的線性規划問題——0-1規划,特殊的非線性規問題——二次規划問題,而線性規划問題又是特殊的非線性規划問題,所以這幾種規划問題都可以用【非線性規划問題】求解.
參考文獻
[1] 卓金武, 魏永生, 秦健, 李必文. MATLAB在數學建模中的應用[M]. 北京: 北京航空航天大學 2011: 18-24