我有一个简单的求解器,可以用来解决类似背包的问题。我希望在牢记约束的同时最大化价值
self.solver = pywraplp.Solver(
'FD',
pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING
)
self.objective = self.solver.Objective()
self.objective.SetMaximization()
self.solver.solve()
我省去了定义变量的代码,但我的问题是:运行此代码将使我获得最佳阵容。有没有办法找到第二,第三等最佳解决方案?
答案 0 :(得分:0)
具有CBC编号 CPLEX,Gurobi确实支持保留更多解决方案,但这只能通过NextSolution()方法在Gurobi的OR-Tools中使用。
如果您的模型是纯粹积分的,则可以看看CP-SAT求解器。
诀窍是除非您探索所有解决方案,否则第二好的解决方案最多只能是启发式的。
答案 1 :(得分:0)
在类似背包的问题中,直接在迭代过程中获得次佳解决方案是很容易的。
首次解决问题后,您可以添加一个约束,其中左侧总和包含在最佳解决方案中,而右侧总和限制为少于包含在最佳解决方案中的项目总数最佳解决方案。
从本质上讲,这是一个割线,它从解空间中排除了第一个最佳解。因此,在添加附加约束之后通过解决该问题将获得不同的解决方案。