【问题标题】:Is there a way to retrieve the next best optimal solution in PuLP?有没有办法在纸浆中检索下一个最佳最佳解决方案?
【发布时间】: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


【解决方案1】:

这样做的一种方法是重新解决问题,添加一个额外的约束以禁止现有的最佳解决方案。例如,假设原始问题的解决方案存储为player_vars_soln,那么您将添加一个约束:

prob += pulp.lpSum(player_vars_soln[i]*player_vars[i] for i in range(len(df))) <= 3

【讨论】:

    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 2023-03-13
    • 2018-04-06
    • 1970-01-01
    • 2011-04-08
    • 2020-04-12
    • 2016-11-08
    • 2014-09-18
    相关资源
    最近更新 更多