python运输问题_叶片运输优化问题学习笔记
在之前負(fù)責(zé)的風(fēng)電項(xiàng)目葉片發(fā)運(yùn)過程中,涉及到一些運(yùn)輸問題。恰好最近學(xué)習(xí)了一點(diǎn)優(yōu)化方面的知識(shí),這里對葉片的發(fā)運(yùn)問題做一個(gè)優(yōu)化。
問題背景:
當(dāng)前項(xiàng)目為一個(gè)100MW的風(fēng)電電站,場地位于B國境內(nèi)。
設(shè)計(jì)擬選用2MW的風(fēng)機(jī)50臺(tái),因此需運(yùn)輸葉片50套(單車可1套3片)。
受到生產(chǎn)日期和船期限制,葉片分別發(fā)至B國的1,2兩個(gè)碼頭,1碼頭20套,2碼頭30套,并由卡車運(yùn)輸至項(xiàng)目地。
綜合勘察后,選定施工地點(diǎn)5處,分別為1,2,3,4,5。
各地需要的葉片套數(shù)分別為5,6,11,13,15。
考慮到運(yùn)輸距離及路況,1碼頭向1-5施工地運(yùn)輸單套葉片的費(fèi)用(美元)分別為:100,200,220,150,130;
2碼頭向1-5施工地運(yùn)輸單套葉片的費(fèi)用分別為:80,210,180,120,160。
綜合以上信息,提供一個(gè)優(yōu)化的運(yùn)輸方案。
這是一個(gè)典型的運(yùn)輸問題。現(xiàn)在處理這種問題的模塊很多,由于我一直用python,所以這里我采用其pulp線性優(yōu)化模塊來進(jìn)行分析。分析的流程如下:
1.構(gòu)建數(shù)據(jù)集
導(dǎo)入模塊
from pulp import *
創(chuàng)建數(shù)據(jù)集
#創(chuàng)建一個(gè)關(guān)于碼頭的list
ports=[1,2]
#創(chuàng)建一個(gè)1,2兩碼頭供應(yīng)葉片的dict
supply={1:20,2:30}
#創(chuàng)建一個(gè)需求節(jié)點(diǎn)的dict
sites={'1':5,'2':6,'3':11,'4':13,'5':15}
#創(chuàng)建一個(gè)1,2兩碼頭向各場地運(yùn)輸葉片運(yùn)費(fèi)的dict
costs = {
1:{'1':100,'2':200,'3':220,'4':150,'5':130},
2:{'1':80,'2':210,'3':180,'4':120,'5':160}
}
2.分析問題與構(gòu)建模型
2.1明確問題
構(gòu)建問題
'''顯然本問題旨在優(yōu)化運(yùn)輸路徑,使得運(yùn)費(fèi)最小,因此是一個(gè)最小化的問題'''
prob=LpProblem('Blades transportation',LpMinimize)
構(gòu)建運(yùn)輸路徑
routes=[(i,j) for i in ports for j in sites]
routes運(yùn)輸路徑矩陣
構(gòu)建關(guān)于路徑的變量
'''由于運(yùn)輸?shù)娜~片都是整套,因此這里是個(gè)整數(shù)問題'''
route_vars=LpVariable.dicts('Route',(ports,sites),0,None,LpInteger)
route_vars構(gòu)建的運(yùn)輸路徑變量
2.2添加目標(biāo)函數(shù)與約束
構(gòu)建目標(biāo)函數(shù)—總運(yùn)輸成本
prob += lpSum([route_vars[i][j]*costs[i][j] for (i,j) in routes])
增加約束條件
#對碼頭而言,向5個(gè)場地供應(yīng)的葉片數(shù)不應(yīng)大于其葉片數(shù)量
for i in ports:
prob += (lpSum([route_vars[i][j] for j in sites]) <= supply[i])
#對施工場地而言,每個(gè)場地的供應(yīng)數(shù)應(yīng)等于其需求數(shù)
for j in sites:
prob +=(lpSum([route_vars[i][j] for i in ports])==sites[j])
上限約束問題說明:
顯然,本次分析僅對各路徑運(yùn)輸量之和進(jìn)行了約束,即每次運(yùn)送葉片數(shù)量>=0;
而有的時(shí)候,可能會(huì)對每條運(yùn)輸路徑進(jìn)行上下限的約束。如此,則有如下形式:
Route_1_1 =LpVariable("Route_1_1", 0, 1) #括號(hào)內(nèi)依次為變量名,下限,上限
約束變量系數(shù)不為1情況說明:
本次約束條件各變量系數(shù)均為1。但一般問題中,我們必然會(huì)遇到大量約束且系數(shù)不為1的情況,這種情況可以利用pulp包中的LpDot函數(shù),將變量和系數(shù)矩陣相乘計(jì)算,如下:
prob += (pulp.lpDot(route_vars, const_mat)=< upbound)
3.計(jì)算結(jié)果
計(jì)算優(yōu)化的分配結(jié)果
'''solve命令可以查看當(dāng)前問題的方程式;solve()可以進(jìn)行求解'''
prob.solve()
計(jì)算目標(biāo)運(yùn)費(fèi)
print('objective',pulp.value(prob.objective))
# objective 7100.0
獲得各變量值
for (i,j) in routes:
a=pulp.value(route_vars[i][j])
b=route_vars[i][j]
print('%s的值是%s'%(b,a))
Route_1_1的值是0.0
Route_1_2的值是5.0
Route_1_3的值是0.0
Route_1_4的值是0.0
Route_1_5的值是15.0
Route_2_1的值是5.0
Route_2_2的值是1.0
Route_2_3的值是11.0
Route_2_4的值是13.0
Route_2_5的值是0.0
感謝閱讀!
總結(jié)
以上是生活随笔為你收集整理的python运输问题_叶片运输优化问题学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python入门题目及答案_Python
- 下一篇: python 爬虫系统_实战干货:从零快