python运输问题_叶片运输优化问题学习笔记

本文介绍了如何运用Python的PULP库解决一个风电叶片的运输优化问题。针对一个100MW风电项目,需要从两个码头向五个施工地点运输叶片。通过构建线性优化模型,确定了最小化运输成本的路径,最终得出最优运输方案,总运费为7100美元。
摘要由CSDN通过智能技术生成

在之前负责的风电项目叶片发运过程中,涉及到一些运输问题。恰好最近学习了一点优化方面的知识,这里对叶片的发运问题做一个优化。

问题背景:

当前项目为一个100MW的风电电站,场地位于B国境内。

设计拟选用2MW的风机50台,因此需运输叶片50套(单车可1套3片)。

受到生产日期和船期限制,叶片分别发至B国的1,2两个码头,1码头20套,2码头30套,并由卡车运输至项目地。

综合勘察后,选定施工地点5处,分别为1,2,3,4,5。

各地需要的叶片套数分别为5,6,11,13,15。

考虑到运输距离及路况,1码头向1-5施工地运输单套叶片的费用(美元)分别为:100,200,220,150,130;

2码头向1-5施工地运输单套叶片的费用分别为:80,210,180,120,160。

综合以上信息,提供一个优化的运输方案。

这是一个典型的运输问题。现在处理这种问题的模块很多,由于我一直用python,所以这里我采用其pulp线性优化模块来进行分析。分析的流程如下:

1.构建数据集

导入模块

from pulp import *

创建数据集

#创建一个关于码头的list

ports=[1,2]

#创建一个1,2两码头供应叶片的dict

supply={1:20,2:30}

#创建一个需求节点的dict

sites={'1':5,'2':6,'3':11,'4':13,'5':15}

#创建一个1,2两码头向各场地运输叶片运费的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.分析问题与构建模型

2.1明确问题

构建问题

'''显然本问题旨在优化运输路径,使得运费最小,因此是一个最小化的问题'''

prob=LpProblem('Blades transportation',LpMinimize)

构建运输路径

routes=[(i,j) for i in ports for j in sites]

routes运输路径矩阵

构建关于路径的变量

'''由于运输的叶片都是整套,因此这里是个整数问题'''

route_vars=LpVariable.dicts('Route',(ports,sites),0,None,LpInteger)

route_vars构建的运输路径变量

2.2添加目标函数与约束

构建目标函数—总运输成本

prob += lpSum([route_vars[i][j]*costs[i][j] for (i,j) in routes])

增加约束条件

#对码头而言,向5个场地供应的叶片数不应大于其叶片数量

for i in ports:

prob += (lpSum([route_vars[i][j] for j in sites]) <= supply[i])

#对施工场地而言,每个场地的供应数应等于其需求数

for j in sites:

prob +=(lpSum([route_vars[i][j] for i in ports])==sites[j])

上限约束问题说明:

显然,本次分析仅对各路径运输量之和进行了约束,即每次运送叶片数量>=0;

而有的时候,可能会对每条运输路径进行上下限的约束。如此,则有如下形式:

Route_1_1 =LpVariable("Route_1_1", 0, 1) #括号内依次为变量名,下限,上限

约束变量系数不为1情况说明:

本次约束条件各变量系数均为1。但一般问题中,我们必然会遇到大量约束且系数不为1的情况,这种情况可以利用pulp包中的LpDot函数,将变量和系数矩阵相乘计算,如下:

prob += (pulp.lpDot(route_vars, const_mat)=< upbound)

3.计算结果

计算优化的分配结果

'''solve命令可以查看当前问题的方程式;solve()可以进行求解'''

prob.solve()

计算目标运费

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

感谢阅读!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值