本博客參考:
- 《python數(shù)學(xué)實(shí)驗(yàn)與建模》
- 《MATLAB數(shù)學(xué)建模經(jīng)典案例實(shí)戰(zhàn)》
數(shù)學(xué)問(wèn)題:線(xiàn)性規(guī)劃問(wèn)題
m a x ? z = 8 x 1 ? 2 x 2 + 3 x 3 ? x 4 ? 2 x 5 { x 1 + x 2 + x 3 + x 4 + x 5 ≤ 400 x 1 + 2 x 2 + 2 x 3 + x 4 + 6 x 5 ≤ 800 2 x 1 + x 2 + 6 x 3 ≤ 200 x 3 + x 4 + 5 5 ≤ 200 0 ≤ x i ≤ 99 , i = 1 , 2 , 3 , 4 x 5 ≥ ? 10 max \ z=8x_1-2x_2+3x_3-x_4-2x_5\\ \left\{ \begin{aligned} &x_1+x_2+x_3+x_4+x_5\leq 400\\ & x_1+2x_2+2x_3+x_4+6x_5\leq800\\ &2x_1+x_2+6x_3\leq200\\ &x_3+x_4+5_5\leq200\\ &0\leq x_i\leq99,i=1,2,3,4\\ &x_5\geq-10\\ \end{aligned} \right. max?z=8x1??2x2?+3x3??x4??2x5?? ? ???x1?+x2?+x3?+x4?+x5?≤400x1?+2x2?+2x3?+x4?+6x5?≤8002x1?+x2?+6x3?≤200x3?+x4?+55?≤2000≤xi?≤99,i=1,2,3,4x5?≥?10?
程序設(shè)計(jì)
from scipy.optimize import linprog
c=[-8,2,-3,1,2]
A=[[1,1,1,1,1],[1,2,2,1,6],[2,1,6,0,0],[0,0,1,1,5]]
b=[[400],[800],[200],[200]]
aeq=None
beq=None
bounds=((0, 99),(0, 99),(0, 99),(0, 99),(-10,None))
res=linprog(c=c, A_ub=A, b_ub=b, A_eq=aeq, b_eq=beq, bounds=bounds,)
運(yùn)行結(jié)果
結(jié)果分析
從中我們看出,目標(biāo)函數(shù)z的最大值應(yīng)為823左右,此時(shí)決策變量 x 1 ? x 5 x_1-x_5 x1??x5?的值分別為[99,0,0.3,0,-10]
實(shí)際應(yīng)用1:加工廠的生產(chǎn)計(jì)劃
一家加工廠使用牛奶生產(chǎn)A,B兩種奶制品,1桶牛奶經(jīng)甲機(jī)器加工12小時(shí)得到3kgA,也可以經(jīng)過(guò)乙機(jī)器8小時(shí)得到4kgB,根據(jù)市場(chǎng)需求,生產(chǎn)的A、B可以全部出售并且每kgA獲利24元、每kgB獲利16元?,F(xiàn)在該工廠每天獲得50桶牛奶供應(yīng),所有工人的最大勞動(dòng)時(shí)間之和為480x小時(shí),甲機(jī)器每天最多加工100kgA,乙機(jī)器加工不限量,請(qǐng)你為該工廠設(shè)計(jì)生產(chǎn)計(jì)劃,使得每天的利潤(rùn)最大
設(shè)置未知數(shù)
假設(shè)每天用于生產(chǎn)A產(chǎn)品的牛奶為 x 1 x_1 x1?桶,用于生產(chǎn)B產(chǎn)品的牛奶為 x 2 x_2 x2?桶,每天的利潤(rùn)為 z z z元,根據(jù)題意建立數(shù)學(xué)模型
建立數(shù)學(xué)模型
m
a
x
?
z
=
3
?
24
x
1
+
4
?
16
x
2
{
x
1
+
x
2
≤
50
12
x
1
+
8
x
2
≤
800
3
x
1
≤
100
x
1
≥
0
,
x
2
≥
0
max \ z=3*24x_1+4*16x_2\\ \left\{ \begin{aligned} x_1+x_2\leq 50\\ 12x_1+8x_2\leq800\\ 3x_1\leq100\\ x_1\geq0,x_2\geq0 \end{aligned} \right.
max?z=3?24x1?+4?16x2??
?
??x1?+x2?≤5012x1?+8x2?≤8003x1?≤100x1?≥0,x2?≥0?
轉(zhuǎn)化為標(biāo)準(zhǔn)形式
m
i
n
?
z
=
?
3
?
24
x
1
?
4
?
16
x
2
{
x
1
+
x
2
≤
50
12
x
1
+
8
x
2
≤
800
3
x
1
≤
100
x
1
≥
0
,
x
2
≥
0
min \ z=-3*24x_1-4*16x_2\\ \left\{ \begin{aligned} x_1+x_2\leq 50\\ 12x_1+8x_2\leq800\\ 3x_1\leq100\\ x_1\geq0,x_2\geq0 \end{aligned} \right.
min?z=?3?24x1??4?16x2??
?
??x1?+x2?≤5012x1?+8x2?≤8003x1?≤100x1?≥0,x2?≥0?
程序設(shè)計(jì)
from scipy.optimize import linprog
c=[-72,-64]
A=[[1,1],[12,8]]
b=[[50],[480]]
bounds=((0,100/3.0),(0,None))
res=linprog(c=c, A_ub=A, b_ub=b, A_eq=None, b_eq=None, bounds=bounds)
運(yùn)行結(jié)果
結(jié)果分析
從上面我們可以看出,利潤(rùn)最大值在3360元左右,達(dá)到最大值時(shí),A、B產(chǎn)品的牛奶日用量分別是20桶、30桶
實(shí)際應(yīng)用2:油料加工廠的采購(gòu)和加工計(jì)劃
某加工廠加工一種油,原料為五種油(植物油1,植物油2、非植物油1,非植物油2、非植物油3),每種油的價(jià)格、硬度如圖表所示,最終生產(chǎn)的成品將以150英鎊/噸
植物油1 | 植物油2 | 非植物油1 | 非植物油2 | 非植物油3 | |
---|---|---|---|---|---|
進(jìn)貨價(jià)格 | 110 | 120 | 130 | 110 | 115 |
硬度值 | 8.8 | 6.1 | 2.0 | 4.2 | 5.0 |
每個(gè)月能夠提煉的植物油不超過(guò)200噸、非植物油不超過(guò)250噸,假設(shè)提煉過(guò)程中油料沒(méi)有損失,提煉費(fèi)用忽略不計(jì),并且最終的產(chǎn)品的硬度需要在(3-6)之間(假設(shè)硬度的混合時(shí)線(xiàn)性的)。根據(jù)以上信息,請(qǐng)你為加工廠指定月采購(gòu)和加工計(jì)劃
設(shè)置未知數(shù)
假設(shè) x 1 , x 2 , x 3 , x 4 , x 5 x_1,x_2,x_3,x_4,x_5 x1?,x2?,x3?,x4?,x5?分別為每月需要采購(gòu)的原料油噸數(shù), x 6 x_6 x6?為每個(gè)月加工的成品油噸數(shù),根據(jù)題意建立數(shù)學(xué)模型
建立數(shù)學(xué)模型
m a x ? z = ? 110 x 1 ? 120 x 2 ? 130 x 3 ? 110 x 4 ? 115 x 5 + 150 x 6 { x 1 + x 2 ≤ 200 x 3 + x 4 + x 5 ≤ 250 8.8 x 1 + 6.1 x 2 + 2.0 x 3 + 4.2 x 4 + 5.0 x 5 ≤ 6 x 6 8.8 x 1 + 6.1 x 2 + 2.0 x 3 + 4.2 x 4 + 5.0 x 5 ≥ 3 x 6 x 1 + x 2 + x 3 + x 4 + x 5 = x 6 x i ≥ 0 , i = 1 , 2 , 3 , . . . , 6 max \ z=-110x_1-120x_2-130x_3-110x_4-115x_5+150x_6\\ \left\{ \begin{aligned} x_1+x_2\leq 200\\ x_3+x_4+x_5\leq250\\ 8.8x_1+6.1x_2+2.0x_3+4.2x_4+5.0x_5\leq6x_6\\ 8.8x_1+6.1x_2+2.0x_3+4.2x_4+5.0x_5\geq3x_6\\ x_1+x_2+x_3+x_4+x_5=x_6\\ x_i\geq0,i=1,2,3,...,6 \end{aligned} \right. max?z=?110x1??120x2??130x3??110x4??115x5?+150x6?? ? ??x1?+x2?≤200x3?+x4?+x5?≤2508.8x1?+6.1x2?+2.0x3?+4.2x4?+5.0x5?≤6x6?8.8x1?+6.1x2?+2.0x3?+4.2x4?+5.0x5?≥3x6?x1?+x2?+x3?+x4?+x5?=x6?xi?≥0,i=1,2,3,...,6?
程序設(shè)計(jì)
from scipy.optimize import linprog
c=[110,120,130,110,115,-150]
A=[[1,1,0,0,0,0],[0,0,1,1,1,0],[8.8,6.1,2.0,4.2,5.0,-6],[-8.8,-6.1,-2.0,-4.2,-5.0,3]]
b=[[200],[250],[0],[0]]
aeq=[[1,1,1,1,1,-1]]
beq=[[0]]
bounds=((0, None),(0, None),(0, None),(0, None),(0,None),(0,450))
# bounds=((0, None),(0, None),(0, None),(0, None),(0,None),(0,None))
res=linprog(c=c, A_ub=A, b_ub=b, A_eq=aeq, b_eq=beq, bounds=bounds)
運(yùn)行結(jié)果
結(jié)果分析
從上面我們可以看到,五種原料油的采購(gòu)量分別為[159.25,40.7407,0,250,0](噸),此時(shí)總利潤(rùn)可以達(dá)到最大,約為17592英鎊/月
筆者發(fā)現(xiàn)的一個(gè)沒(méi)有用的小技巧:我們知道 x 6 x_6 x6?變量代表的是每個(gè)月的噸數(shù),bounds參數(shù)設(shè)置決策變量的取值區(qū)間,當(dāng)在bounds中對(duì)x_6的上界不加限制時(shí),即(0,None),模型返回的結(jié)果中仍然將 x 6 x_6 x6?收斂至450,你知道這是為什么嗎?
遺留的問(wèn)題
經(jīng)過(guò)這么多的應(yīng)用,我們已經(jīng)大致明白了scipy.optimize.linprog()
函數(shù)的使用過(guò)程,也驚嘆于它的便利之處,但是不知道你是否能發(fā)現(xiàn)該函數(shù)的缺點(diǎn)?
我們來(lái)看下面一個(gè)問(wèn)題
鋼管加工用料問(wèn)題
某零售商從鋼管廠進(jìn)貨后將鋼管切割后賣(mài)給客戶(hù),某次進(jìn)貨該零售商得到了若干1850mm長(zhǎng)的原料鋼管?,F(xiàn)有一客戶(hù)需要15根290mm、28根315mm、21根350mm、30根455mm的鋼管。對(duì)于一個(gè)原料鋼管有四種切割模式,每次切割模式下的切割次數(shù)不能太多(一根原料鋼管最多生產(chǎn)5根產(chǎn)品),為減少余料浪費(fèi),每種切割模式下的余料浪費(fèi)不能超過(guò)100mm。(要完成該客戶(hù)的需求,需要若干根原料鋼管,可能用到四種切割模式,現(xiàn)規(guī)定使用頻率最多的切割模式按照一根原料鋼管價(jià)格的1/10收取加工費(fèi),使用頻率次之的切割模式按照一根原料鋼管價(jià)格的2/10收取加工費(fèi),依次類(lèi)推)?,F(xiàn)在求使得該零售商總費(fèi)用最小的切割計(jì)劃?
分析
仔細(xì)分析我們會(huì)發(fā)現(xiàn),這個(gè)問(wèn)題的線(xiàn)性規(guī)劃和上面的兩個(gè)實(shí)際問(wèn)題有很大不同。
在上面的問(wèn)題中,決策變量只有一種 x 1 ? x n x_1-x_n x1??xn?,而且決策變量的系數(shù)的都是常數(shù)(比如 x 3 + x 4 + x 5 ≤ 250 x_3+x_4+x_5\leq250 x3?+x4?+x5?≤250中的每個(gè)自變量系數(shù)都是1)。但是在該問(wèn)題中似乎有兩種決策變量:切割模式的使用頻次 x i x_i xi?、每種切割模式下對(duì)于一根原料鋼管產(chǎn)生的成品鋼管種類(lèi)及數(shù)量 r i j r_{ij} rij?(i表示第i種切割模式,j表示第j種成品鋼管)。
scipy.optimize.linprog()的缺陷?
這就讓我們?cè)诹信e約束條件時(shí)遇到了很大的困難,比如其中一個(gè)不等式是這樣的
∑
i
=
1
4
x
i
×
r
1
i
≥
15
(
i
=
1...4
)
\sum^4_{i=1}x_i\times r_{1i}\geq15(i=1...4)
∑i=14?xi?×r1i?≥15(i=1...4),看到這里我們發(fā)現(xiàn)兩個(gè)決策變量相乘,如果繼續(xù)使用scipy.optimize.linprog()
函數(shù),參數(shù)A_ub怎么???參數(shù)bounds到底該以誰(shuí)作為決策變量?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-412615.html
現(xiàn)在我們似乎遇到了困難,實(shí)際上并不是linprog()函數(shù)的問(wèn)題,因?yàn)楹瘮?shù)就是用來(lái)求解線(xiàn)性規(guī)劃問(wèn)題的,而我們現(xiàn)在提出的這個(gè)問(wèn)題是一個(gè)非線(xiàn)性規(guī)劃問(wèn)題,所以,要解決它我們需要“另辟蹊徑”了!下一個(gè)博客我們將用另外一個(gè)第三方庫(kù)解決這個(gè)問(wèn)題文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-412615.html
到了這里,關(guān)于python數(shù)學(xué)建模--線(xiàn)性規(guī)劃問(wèn)題案例及求解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!