1. 程式人生 > 實用技巧 >線性規劃 | 用例項展示Matlab和lingo求解線性問題的差異

線性規劃 | 用例項展示Matlab和lingo求解線性問題的差異

一、線性規劃

什麼是線性規劃問題?

線性規劃是在一系列的線性條件的約束下,從而規定了可行解,在通過具體的目標函式,求得滿足函式的最優解。
例如平常的線性規劃函式的例子:

在matlab中使用matlab標準的格式:

若是目標函式是求解最大值的話,則取-C形式:
例如線性規劃:

的MATLAB標準型為:

二、linprog函式

在matlab中,linprog函式可以求解線性規劃問題,用於尋找目標函式的最小值。
matlab中,規劃模型的標註寫法如下:

(1)[x,fval] = linprog(f,A,b)

用於求解:

(2)[x,fval] = linprog(f,A,b,Aeq,beq)
用於求解:

如果沒有等式存在,就用[]代替Aeq和beq。

(3)[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub)
用於求解:

返回的x為所求的結果,fval為最值。
linprog中fval都是求最小值,這個要記住。
A和b是不等式約束條件的引數。
Aeq和beq是等式約束條件的引數。
lb和ub為x取值的取值範圍。

例如:
a+b+c<30
c<15
b<10
函式:max f = 10a+20b+30c
因為linprog求的是最小值,我們將原式改為:
f = -(10
a+20b+30c)
這樣我們有了函式f=[-10;-20;-30];,然後:
根據約束條件不等式,有:
A = [1 1 1;
0 0 1;
0 1 0] ;
b = [30;15;10] ;
但這樣算出來的結果大家會發現是小數,也可能是負數。

因此我們加入a、b、c取值的上下限:
lb = [0 0 0]
ub = [30 30 30]
如果在計算中需要得到小數的結果,只要寫成0.00或者30.00就可以了,最後帶入函式計算就可以了。

三、intlinprog函式

intlinprog()是matlab中用於求解混合整數線性規劃(Mixed-integer linear programming)的一個函式,用法基本和linprog差不多。
語法:

x=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)

與linprog相比,多了引數intcon,代表了整數決策變數所在的位置。
例如:

四、Lingo軟體

LINGO是用來求解線性和非線性優化問題的簡易工具。

所有程式碼在 Lingo Model - Lingo 1中編寫,寫完後點擊工具條上的紅色的靶子執行。

例如:

程式碼:

max=x1+x2;
x1+9/14*x2<=51/14;
-2*x1+x2<=1/3;
@gin(x1);@gin(x2);
end

LINGO提供了大量的標準數學函式

@abs(x) 返回x 的絕對值
@sqrt() 開方
@sin(x) 返回x 的正弦值,x 採用弧度制
@cos(x) 返回x 的餘弦值
@tan(x) 返回x 的正切值
@exp(x) 返回常數e 的x 次方
@log(x) 返回x 的自然對數
@lgm(x) 返回x 的gamma 函式的自然對數
@sign(x) 如果x<0 返回-1;否則,返回1
@floor(x) 返回x的整數部分。當x>=0 時,返回不超過x 的最大整數;當x<0
時,返回不低於x 的最大整數。
@smax(x1,x2,…,xn) 返回x1,x2,…,xn 中的最大值
@smin(x1,x2,…,xn) 返回x1,x2,…,xn 中的最小值

變數界定函式
變數界定函式實現對變數取值範圍的附加限制,共4種
@bin(x) 限制x 為0 或1 — 用於0-1規劃
@bnd(L,x,U) 限制L≤x≤U
@free(x) 取消對變數x 的預設下界為0 的限制,即x 可以取任意實數
@gin(x) 限制x 為整數
在預設情況下,LINGO 規定變數是非負的,也就是說下界為0,上界為+∞。@free 取消
了預設的下界為0的限制,使變數也可以取負值。@bnd用於設定一個變數的上下界,它也可 以取消預設下界為0的約束。
注意:
LINGO總是根據“MAX=”或“MIN=”尋找目標函式;
程式語句的順序一般不重要,既可以隨意調換;
程式運用函式時都是以@開頭;
程式中的變數預設為非負數,想要改變變數型別必須有相應函式調整
程式中變數不區分大小寫;
語句必須以分號結尾;
註釋以!開始,且註釋語句後面必須也有分號,註釋預設註釋到第一個分號處,意思是分號前面會全部被註釋掉。

五、例項

根據外場改裝合同要求,改裝備件需於每季度末分別提供10、15、25、30。已知該專業廠各季度末的生產能力及每套產品的成本構成,如果專業廠生產出的備件當季不能交付,每套積壓一季度需儲存、維護等的費用0.15萬元,建立一個數學模型,要求在完成合同的情況下,使該全年生產(包括儲存、維護)費用最小。

解:
設x_ij為第i季度生產的用於第j季度交貨產品的數量,則由題意得:
x_11=10
x_12+x_22=15
x_13+x_23+x_33=25
x_14+x_24+x_34+x_44=30

又由生產能力的要求,有
x_44<=10
x_33+x_34<=30
x_22+x_23+x_24<=35
x_11+x_12+x_13+x_14<=25

再設c_ij表示第i季度生產的用於第j季度交貨的每臺產品的實際成本,其值如下表:

目標函式為:
min f = 10.8 * x11 + 10.95 * x12 + 11.10 * x13 + 11.25*x14 + 11.10 * x22 + 11.25 * x23 + 11.40 * x24 + 11 * x33 + 11.15 * x34 + 11.30 * x44;

MATLAB求解:

上式中,Aeq為左邊的矩陣,beq為等號右邊的向量;

上式中,A為左邊的矩陣,b為等號右邊的向量;

% 線性規劃問題
% 目標函式:
% minF = 10.8 * x11 + 10.95 * x12 + 11.10 * x13 + 11.25 + x14 + ...
%    11.10 * x22 + 11.25 * x23 + 11.40 * x24 + ...
%    11 * x33 + 11.15 * x34 + ...
%    11.30 * x44;

minfun = [10.8 ,10.95 , 11.10 , 11.25 ,11.10 ,11.25,11.40 ,11,11.15,11.30]';
Aeq = zeros(10);
Aeq(1,1) = 1;
Aeq(2,2) = 1;  Aeq(2,5) = 1;
Aeq(3,3) = 1;  Aeq(3,6) = 1;  Aeq(3,8) = 1;
Aeq(4,4) = 1;  Aeq(4,7) = 1;  Aeq(4,9) = 1;  Aeq(4,10) = 1;
beq = [10,15,25,30,0,0,0,0,0,0]';
A = zeros(10);
A(1,1) = 1; A(1,2) = 1; A(1,3) = 1; A(1,4) = 1;
A(2,5) = 1; A(2,6) = 1; A(2,7) = 1;
A(3,8) = 1; A(3,9) = 1;
A(4,10) = 1;
b = [25,35,30,10,0,0,0,0,0,0]';
[x,y]=intlinprog(minfun,1:10,A,b,Aeq,beq,zeros(10,1)',[]); 
disp('x的值為:');  x
disp('最小值為:');  y

  

執行結果:

x的值為:

10
 0
15
 0
15
 0
 0
10
20
10

最小值為:

887

Lingo求解:

min=10.8 * x11 + 10.95 * x12 + 11.10 * x13 + 11.25*x14 + 11.10 * x22 + 11.25 * x23 + 11.40 * x24 + 11 * x33 + 11.15 * x34 + 11.30 * x44;
x11=10;
x12+x22=15;
x13+x23+x33=25;
x14+x24+x34+x44=30;
x11+x12+x13+x14<=25;
x22+x23+x24<=35;
x33+x34<=30;
x44<=10;
end

執行結果:

最小值為:887

由此可見,MATLAB和lingo所求的最優解一致,但是每個變數值x並不一樣,說明規劃有多組解。
不足之處,請多指教!

首發:https://blog.csdn.net/Aubrey_yt/article/details/107866348

END