提问人:Sattai 提问时间:11/12/2023 更新时间:11/12/2023 访问量:30
使用 Python pulp 优化背包 - 如何设置约束?
knapsack optimization using Python pulp - how to set constraints?
问:
我想开发库存履行优化模型。如果每个 SKU 的WH_Inv配送量低于 SS,我想从 Plt_Inv 到 WH_Inv配送,且总配送量应小于 10000KG。
我按如下方式编写代码并显示结果。但我收到的状态是“不可行”,结果与要求不符。我假设约束模型不正确。谁能帮忙看看哪里有不正确的代码。
import pandas as pd
!pip install pulp
import pulp
数据帧
df1 = pd.DataFrame({'SS':[10,20,100,5,500],'SKU':['A','B','C','D','E']})
df2 = pd.DataFrame({'WH_Inv':[30,15,200,7,300],'SKU':['A','B','C','D','E']})
df3 = pd.DataFrame({'Plt_Inv':[100,0,300,0,100],'SKU':['A','B','C','D','E']})
df4 = pd.DataFrame({'KG':[20,12,10,12,20],'SKU':['A','B','C','D','E']})
定义列表
SKU = df1['SKU'].tolist()
SS =df1['SS'].tolist()
WH =df2['WH_Inv'].tolist()
PLT = df3['Plt_Inv'].tolist()
KG = df4['KG'].tolist()
定义常量
safety = {row.SKU:row.SS for row in df1.itertuples()}
warehouse = {row.SKU:row.WH_Inv for row in df2.itertuples()}
plant = {row.SKU:row.Plt_Inv for row in df3.itertuples()}
kgs = {row.SKU:row.KG for row in df4.itertuples()}
优化模型
problem =pulp.LpProblem('Optimization',pulp.LpMaximize)
设置变量
x={}
for s in SKU:
x[s]=pulp.LpVariable(f'x_{s}',cat='Integer')
约束
for s in SKU:
problem += x[s]>=0
problem+= x[s]>= safety[s]
problem+= x[s]<= plant[s]
problem += pulp.lpDot(x[s],KG)<=10000
目的
problem += pulp.lpDot(x[s],KG)
解决
status = problem.solve()
print('status:',pulp.LpStatus[status])
for s in SKU:
print(s,x[s].value())
print('obj=', problem.objective.value())
结果:状态不可行,履行数量与要求不符
状态:不可行 一个 10.0 乙 0.0 C 100.0 深 0.0 东 500.0 obj= 37000.0
答: 暂无答案
评论