用线性规划解决仓储运输问题
Posted bkzy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用线性规划解决仓储运输问题相关的知识,希望对你有一定的参考价值。
练习使用线性规划解决仓储运输问题
仓储运输问题
某啤酒经销商有两个仓库A和B,A仓库中有库存啤酒1000箱,B仓库中有库存啤酒4000箱。有5个酒吧,分别用数字1~5表示,从经销商处订啤酒,数量如下表所示,同时表中也列出了从仓库到各个酒吧每箱的运输成本:
酒吧 | 订单数量(箱) | A仓到酒吧的运输成本(元/箱) | B仓到酒吧的运输成本(元/箱) |
---|---|---|---|
1 | 500 | 2 | 3 |
2 | 900 | 4 | 1 |
3 | 1800 | 5 | 3 |
4 | 200 | 2 | 2 |
5 | 700 | 1 | 3 |
问:经销商应如何配送才能达到运输成本最小化。
解决方法
使用线性规划包pulp解决。
安装线性规划包
pip install pulp
练习代码
from pulp import *
# 创建仓库
Warehouses = ["A","B"]
# 创建库存量
supply = {"A":1000,"B":4000}
# 创建酒吧
Bars = ["1","2","3","4","5"]
# 创建酒吧订单
demand = {"1":500,"2":900,"3":1800,"4":200,"5":700}
# 创建费用
costs = [ # Bars
# 1 2 3 4 5
[2, 4, 5, 2, 1], # A Warehouses
[3, 1, 3, 2, 3], # B
]
# 将费用数据写入字典
costs = makeDict([Warehouses, Bars], costs, 0)
# 创建问题(运输成本最小化)
prob = LpProblem("啤酒运输问题",LpMinimize)
# 创建一个包含所有可能线路的列表
Routes = [(w,b) for w in Warehouses for b in Bars]
"""
Routes中的内容为:
[('A', '1'),
('A', '2'),
('A', '3'),
('A', '4'),
('A', '5'),
('B', '1'),
('B', '2'),
('B', '3'),
('B', '4'),
('B', '5')]
"""
# 创建变量,该变量表示从不同线路应该运输的啤酒数量
vars = LpVariable.dicts("Route", (Warehouses, Bars), 0, None, LpInteger)
"""
vars中的内容:
{'A': {'1': Route_A_1,
'2': Route_A_2,
'3': Route_A_3,
'4': Route_A_4,
'5': Route_A_5},
'B': {'1': Route_B_1,
'2': Route_B_2,
'3': Route_B_3,
'4': Route_B_4,
'5': Route_B_5}}
"""
# 创建方程
prob += (
lpSum([vars[w][b] * costs[w][b] for (w,b) in Routes]),
"运输费用总和",
)
# 创建约束
# 从A仓运出的啤酒数量不能大于A仓的库存量
# 从B仓运出的啤酒数量不能大于B仓的库存量
for w in Warehouses:
prob +=(lpSum([vars[w][b] for b in Bars]) <=supply[w],"%s仓供货量不可大于该仓的库存量" % w)
# 为各个酒吧的供货量不可小于订单量
for b in Bars:
prob += (lpSum([vars[w][b] for w in Warehouses])>=demand[b],"为酒吧%s的供货总量" % b)
# 计算解决问题
prob.solve()
# 打印输出解决问题的状态
print("Status:", LpStatus[prob.status])
# 打印输出每个变量的值
for v in prob.variables():
print(v.name, "=", v.varValue)
"""
打印输出的内容:
Route_A_1 = 300.0
Route_A_2 = 0.0
Route_A_3 = 0.0
Route_A_4 = 0.0
Route_A_5 = 700.0
Route_B_1 = 200.0
Route_B_2 = 900.0
Route_B_3 = 1800.0
Route_B_4 = 200.0
Route_B_5 = 0.0
"""
# 打印输出运输总费用
print("运输总费用 = ", value(prob.objective))
"""
打印输出的结果:
运输总费用 = 8600.0
"""
参考资料
https://coin-or.github.io/pulp/CaseStudies/a_transportation_problem.html
以上是关于用线性规划解决仓储运输问题的主要内容,如果未能解决你的问题,请参考以下文章