1. 程式人生 > >數學建模之線性規劃問題(含整數規劃和0-1規劃)

數學建模之線性規劃問題(含整數規劃和0-1規劃)

線性規劃問題

線性規劃是數學規劃中的一類最簡單規劃問題,常見的線性規劃是一個有約束的,變數範圍為有理數的線性規劃。

如:

為了便於表達,將上面的式子寫成矩陣形式:

於是約束就表達為了一個不等式。

求解MATLAB線性規劃時,最常用的函式是linprog函式

由於MATLAB中求解的是目標函式是最小值的問題,但如果我們的目標函式是求最大值,可以通過對目標函式中每一項中乘以-1,將求最大值問題轉化為求最小值問題

A,b分別為不等式約束中的係數矩陣。Aeq和beq分別為等式約束中的係數矩陣,lb,和ub分別為每個變數的上下區間;最後f為目標函式中各變數的係數矩陣。

Matlab例項

f=[-7,-12];
A=[9 4;4 5;3 10];
b=[300;200;300];
lb=zeros(2,1);% 生成一個2行1列的全0矩陣,很顯示,上面例子中的x,y的最小值為0
[x,fval]=linprog(f,A,b,[],[],lb,[])

我們來解釋下linprog函式中每引數的意義,linprog中的一個原型如下:

[x,fval,exitflag] = linprog(f,A,b,Aeq,beq,lb,ub)

這7個引數的意義和上面f、A、b的意義是一樣的。f為目標函式的係數矩陣,A為線性規劃不等式約束的變數係數矩陣,b為不等式約束的資源數(如上面的[300;200;300]),這是一個N行1列的矩陣,N為變數的個數。Aeq

beq是相應等式約束的變數係數矩陣和資源數(很明顯,上面的例子中並沒有等式約束)。lbub分別為保變數的上下區間。在上面的例子中,x和y和最小值都為0但都無最大值約束。而linprog的返回值x為求得的各變數的值,這是一個向量,fval為最優化的值,一般是一個標量,exitflag意為函式的退出標誌。

上面所示的程式碼[x,fval]=linprog(f,A,b,[],[],lb,[])中,[]代表不存在或空,因為在上面的例子中不存在等式約束,所以Aeqbeq的位置為[]。而ub也為空,是因為變數沒有最大值約束。

執行上面的程式,行到結果為:

x =20.0000

      24.0000

fval = -428.0000

解釋為:

當x=20,y=24時,可以求得最優化的值,最大值為428(因為這裡的求目標最大值,但MATLAB只能求目標函式最小值,所以對目標函式進行了乘-1處理,所以也要對最後的結果乘以-1才是目標函式所求).

上面解決了簡單的線性規劃問題的求解,線性規範有兩種比較特殊的情況,即整數規劃和0-1整數規劃。

MATLAB提供了一個比較新的、專用於求解整數規劃和0-1整數規劃的函式——intlinprog。

intlinprog的一個原型為:

[x,fval,exitflag]= intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)

該函式的使用和linprog函式的使用十分相似,其僅僅在linprog函式的基礎上多了一個引數——intcon。我們來通過下面的例子來學習該引數的意義。

在這裡例子中,變數的取值範圍不再是有理數集,而是整數集。

求解此規劃問題的MATLAB程式如下:

f_13=[-1,-1];
ic_13=[1,2];
A_13=[-4,2;4,2;0,-2];
b_13=[-1;11;-1];
lb_13=zeros(2,1);
[x_13,fval_13,flag_13]=intlinprog(f_13,ic_13,A_13,b_13,[],[],lb_13,[])

在函式intlinprog中,intcon的意義為整數約束變數的位置。如上例中,因為x1和x2都要是整數,intcon引數位置ic_13的值為[1,2]。這個位置是按照目標函式和約束條件中變數位置來排列的。如果上式中僅有x2為整數約束,那麼ic_13的值應該為2。

我們解決了在MATLAB上求解一般的整數規劃問題,但要是遇到0-1整數規劃問題呢?到這裡,我們只要轉換一下思維,就可以利用MATLAB求解0-1整數規劃了,這裡先賣個關子,請大家看下面的例子是怎麼用MATLAB求解0-1整數規劃的。

MATLAB程式如下:

f_12=[7 5 9 6 3];
ic_12=[1,2,3,4,5];
A_12=[56,20,54,42,15;1,4,1,0,0;-1,-2,0,-1,-2];
b_12=[100;4;-2];
lb_12=zeros(5,1);
ub_12=ones(5,1);
[x_12,fval_12,flag_12]=intlinprog(f_12,ic_12,A_12,b_12,[],[],lb_12,ub_12)

與上面整數規劃不同的地方只有一個,就是多了ub_12=ones(5,1),也就是說求解0-1整數規劃只要在求解整數規劃的基礎上加上一個對變數最大值約束為1就可以。

 

參考連結:

[1]:https://blog.csdn.net/u010155023/article/details/48058391