用线性规划解决仓储运输问题

Posted bkzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用线性规划解决仓储运输问题相关的知识,希望对你有一定的参考价值。

练习使用线性规划解决仓储运输问题

仓储运输问题

某啤酒经销商有两个仓库A和B,A仓库中有库存啤酒1000箱,B仓库中有库存啤酒4000箱。有5个酒吧,分别用数字1~5表示,从经销商处订啤酒,数量如下表所示,同时表中也列出了从仓库到各个酒吧每箱的运输成本:

酒吧订单数量(箱)A仓到酒吧的运输成本(元/箱)B仓到酒吧的运输成本(元/箱)
150023
290041
3180053
420022
570013

问:经销商应如何配送才能达到运输成本最小化。

解决方法

使用线性规划包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

以上是关于用线性规划解决仓储运输问题的主要内容,如果未能解决你的问题,请参考以下文章

用线性规划解决仓储运输问题

用线性规划解决仓储运输问题

用matlab求解一些简单问题!

如何在android中的地图片段内中心线性布局?

matlab编程:0-1规划问题:向高手求程序代码。

CPLEX 中的分段线性规划