【发布时间】:2021-03-18 16:51:34
【问题描述】:
下面列出了一个非常简单的背包问题。
df 的示例如下所示:
| weight | item | profit |
|--------|-------|--------|
| 1 | item1 | 3.977 |
| 2 | item2 | 3.126 |
| 3 | item3 | 2.698 |
| 4 | item4 | 2.607 |
| 5 | item5 | 2.569 |
目标是在选择总重量 >=10 的四个项目时最大化利润。我要解决的代码如下:
prob = LpProblem("Weight",LpMaximize)
player_vars = [pulp.LpVariable(f'Item_{row.item}', cat='Binary') for row in df.itertuples()]
# total items constraint
prob += pulp.lpSum(player_var for player_var in player_vars) == 4
# total weight constraint
prob += pulp.lpSum(df.Seed.iloc[i] * player_vars[i] for i in range(len(df))) >= 10
# problem
prob += pulp.lpSum([df.profit.iloc[i] * player_vars[i] for i in range(len(df))])
# solve and print the status
prob.solve()
print(LpStatus[prob.status])
#print results
for i in range(len(df)):
if player_vars[i].value() == 1:
row = df.iloc[i]
print(row.item, row.weight,row.profit)
我想知道是否有办法使用 PuLP 获得第二好的答案等等? 谢谢!
【问题讨论】:
-
一种方法是重新解决问题,添加一个额外的约束来禁止现有的最佳解决方案。例如说原始问题的解决方案存储为
player_vars_soln,然后您将添加一个约束:pulp.lpSum(player_vars_soln[i]*player_vars[i] for i in range(len(df))) <= 3 -
@kabdulla 已经回答了这个问题(不应该是评论)
标签: python optimization pulp