Google OR-Tools(使用 SCIP 求解器)- 如何访问求解器找到的中间解?

Google OR-Tools (using SCIP solver) - How to access the intermediate solutions found by the solver?

我是 Google OR-Tools 的新手。

使用 Python,我使用 SCIP 作为求解器实现了 MIP 模型。 objective 函数用于最小化 (solver.Minimize(C)) 我正在通过 solver.Objective() 访问最终解决方案.Value().

但是,我还需要访问解算器找到的 中间解决方案,在到达最终解决方案之前,以及它们的 时间戳。 (最终目标是绘制一个图表,其中包含解决方案随时间的演变)。

我尝试使用 while 循环:

solutions_evolution = {} # dict to store miliseconds (as keys) and solutions (as values)
localtime = (solver.wall_time()) #in miliseconds
limit_break = localtime + 60*5*1000 #sets a time limit of 5 minutes 

while (localtime <= limit_break) & (status != pywraplp.Solver.OPTIMAL & status != pywraplp.Solver.FEASIBLE):
new_localtime = (solver.wall_time())
solutions_evolution[new_localtime] = solver.Objective().Value() 
localtime = new_localtime

但是它不起作用,因为 solver.Objective().Value() 只给出了最终的解决方案。

我已经挣扎了好几天了。谁能帮帮我吗?谢谢。

在非 C++ 语言中,您无法访问求解器对象,并且在 python 中无法访问现有回调。

您可以通过 SCIP 使用解决方案池。

只需 运行 Solve(),然后循环 NextSolution()

如果您的问题是纯积分问题,您可以使用 CP-SAT 求解器(直接使用,而不是通过线性求解器包装器)。它支持python.

中的解决方案回调