目前,我正在使用PuLP
来解决最大化问题。它工作正常,但我希望能够获得N-best解决方案,而不仅仅是一个。有没有办法在PuLP
或任何其他免费/ Python解决方案中执行此操作?我想到了从最佳解决方案中随机挑选一些变量并将它们抛出并重新运行的想法,但这似乎完全是黑客攻击。
答案 0 :(得分:3)
如果您的问题可以快速解决,您可以尝试逐步限制目标。例如,如果最优解的目标值为X
,请尝试使用其他约束重新运行问题:
problem += objective <= X - eps, ""
减少步骤eps
取决于您对问题的了解。
当然,如果你只是盲目挑选一些eps
并获得解决方案,你就不知道解决方案是第二好的,第十好的还是第一好的......但是你可以在eps
参数上进行一些系统搜索(二进制,网格)(如果问题真的很快解决)。
答案 1 :(得分:2)
所以我想出了(通过RTFM)如何获得多个灵魂。在我的代码中,我基本上有:
number_unique = 1 # The number of variables that should be unique between runs
model += objective
model += constraint1
model += constraint2
model += constraint3
for i in range(1,5):
model.solve()
selected_vars = []
for p in vars:
if p_vars[p].value() != 0:
selected_vars.append(p)
print_results()
# Add a new constraint that the sum of all of the variables should
# not total up to what I'm looking for (effectively making unique solutions)
model += sum([p_vars[p] for p in selected_vars]) <= 10 - number_unique
这很好用,但我意识到我确实需要走随机路线。我有10个不同的变量,只丢掉了几个变量,我的解决方案往往在所有排列中都有相同的重加权变量(这是预期的)。