一、線性規划
什么是線性規划問題?
線性規划是在一系列的線性條件的約束下,從而規定了可行解,在通過具體的目標函數,求得滿足函數的最優解 。
例如平常的線性規划函數的例子:
在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 = -(10a+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