线性规划 | 用实例展示Matlab和lingo求解线性规划问题的差异
一、線性規(guī)劃
什么是線性規(guī)劃問題?
線性規(guī)劃是在一系列的線性條件的約束下,從而規(guī)定了可行解,在通過具體的目標(biāo)函數(shù),求得滿足函數(shù)的最優(yōu)解 。
例如平常的線性規(guī)劃函數(shù)的例子:
在matlab中使用matlab標(biāo)準(zhǔn)的格式:
若是目標(biāo)函數(shù)是求解最大值的話,則取-C形式:
例如線性規(guī)劃:
的MATLAB標(biāo)準(zhǔn)型為:
二、linprog函數(shù)
在matlab中,linprog函數(shù)可以求解線性規(guī)劃問題,用于尋找目標(biāo)函數(shù)的最小值。
matlab中,規(guī)劃模型的標(biāo)注寫法如下:
(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為所求的結(jié)果,fval為最值。
linprog中fval都是求最小值,這個(gè)要記住。
A和b是不等式約束條件的參數(shù)。
Aeq和beq是等式約束條件的參數(shù)。
lb和ub為x取值的取值范圍。
例如:
a+b+c<30
c<15
b<10
函數(shù):max f = 10a+20b+30c
因?yàn)閘inprog求的是最小值,我們將原式改為:
f = -(10a+20b+30c)
這樣我們有了函數(shù)f=[-10;-20;-30];,然后:
根據(jù)約束條件不等式,有:
A = [1 1 1;
0 0 1;
0 1 0] ;
b = [30;15;10] ;
但這樣算出來的結(jié)果大家會(huì)發(fā)現(xiàn)是小數(shù),也可能是負(fù)數(shù)。
因此我們加入a、b、c取值的上下限:
lb = [0 0 0]
ub = [30 30 30]
如果在計(jì)算中需要得到小數(shù)的結(jié)果,只要寫成0.00或者30.00就可以了,最后帶入函數(shù)計(jì)算就可以了。
三、intlinprog函數(shù)
intlinprog()是matlab中用于求解混合整數(shù)線性規(guī)劃(Mixed-integer linear programming)的一個(gè)函數(shù),用法基本和linprog差不多。
語法:
與linprog相比,多了參數(shù)intcon,代表了整數(shù)決策變量所在的位置。
例如:
四、Lingo軟件
LINGO是用來求解線性和非線性優(yōu)化問題的簡(jiǎn)易工具。
所有代碼在 Lingo Model - Lingo 1中編寫,寫完后點(diǎn)擊工具條上的紅色的靶子運(yùn)行。
例如:
代碼:
LINGO提供了大量的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)
@abs(x) 返回x 的絕對(duì)值
@sqrt() 開方
@sin(x) 返回x 的正弦值,x 采用弧度制
@cos(x) 返回x 的余弦值
@tan(x) 返回x 的正切值
@exp(x) 返回常數(shù)e 的x 次方
@log(x) 返回x 的自然對(duì)數(shù)
@lgm(x) 返回x 的gamma 函數(shù)的自然對(duì)數(shù)
@sign(x) 如果x<0 返回-1;否則,返回1
@floor(x) 返回x的整數(shù)部分。當(dāng)x>=0 時(shí),返回不超過x 的最大整數(shù);當(dāng)x<0
時(shí),返回不低于x 的最大整數(shù)。
@smax(x1,x2,…,xn) 返回x1,x2,…,xn 中的最大值
@smin(x1,x2,…,xn) 返回x1,x2,…,xn 中的最小值
變量界定函數(shù)
變量界定函數(shù)實(shí)現(xiàn)對(duì)變量取值范圍的附加限制,共4種
@bin(x) 限制x 為0 或1 — 用于0-1規(guī)劃
@bnd(L,x,U) 限制L≤x≤U
@free(x) 取消對(duì)變量x 的默認(rèn)下界為0 的限制,即x 可以取任意實(shí)數(shù)
@gin(x) 限制x 為整數(shù)
在默認(rèn)情況下,LINGO 規(guī)定變量是非負(fù)的,也就是說下界為0,上界為+∞。@free 取消
了默認(rèn)的下界為0的限制,使變量也可以取負(fù)值。@bnd用于設(shè)定一個(gè)變量的上下界,它也可 以取消默認(rèn)下界為0的約束。
注意:
LINGO總是根據(jù)“MAX=”或“MIN=”尋找目標(biāo)函數(shù);
程序語句的順序一般不重要,既可以隨意調(diào)換;
程序運(yùn)用函數(shù)時(shí)都是以@開頭;
程序中的變量默認(rèn)為非負(fù)數(shù),想要改變變量類型必須有相應(yīng)函數(shù)調(diào)整
程序中變量不區(qū)分大小寫;
語句必須以分號(hào)結(jié)尾;
注釋以!開始,且注釋語句后面必須也有分號(hào),注釋默認(rèn)注釋到第一個(gè)分號(hào)處,意思是分號(hào)前面會(huì)全部被注釋掉。
五、實(shí)例
根據(jù)外場(chǎng)改裝合同要求,改裝備件需于每季度末分別提供10、15、25、30。已知該專業(yè)廠各季度末的生產(chǎn)能力及每套產(chǎn)品的成本構(gòu)成,如果專業(yè)廠生產(chǎn)出的備件當(dāng)季不能交付,每套積壓一季度需存儲(chǔ)、維護(hù)等的費(fèi)用0.15萬元,建立一個(gè)數(shù)學(xué)模型,要求在完成合同的情況下,使該全年生產(chǎn)(包括存儲(chǔ)、維護(hù))費(fèi)用最小。
解:
設(shè)x_ij為第i季度生產(chǎn)的用于第j季度交貨產(chǎn)品的數(shù)量,則由題意得:
x_11=10
x_12+x_22=15
x_13+x_23+x_33=25
x_14+x_24+x_34+x_44=30
又由生產(chǎn)能力的要求,有
x_44<=10
x_33+x_34<=30
x_22+x_23+x_24<=35
x_11+x_12+x_13+x_14<=25
再設(shè)c_ij表示第i季度生產(chǎn)的用于第j季度交貨的每臺(tái)產(chǎn)品的實(shí)際成本,其值如下表:
目標(biāo)函數(shù)為:
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為等號(hào)右邊的向量;
上式中,A為左邊的矩陣,b為等號(hào)右邊的向量;
運(yùn)行結(jié)果:
x的值為:
最小值為:
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運(yùn)行結(jié)果:
最小值為:887
由此可見,MATLAB和lingo所求的最優(yōu)解一致,但是每個(gè)變量值x并不一樣,說明規(guī)劃有多組解。
不足之處,請(qǐng)多指教!
總結(jié)
以上是生活随笔為你收集整理的线性规划 | 用实例展示Matlab和lingo求解线性规划问题的差异的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字图像处理与分析(matlab实现)—
- 下一篇: 数学建模入门篇(新手必看)