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

Posted

技术标签:

【中文标题】Google OR-Tools(使用 SCIP 求解器) - 如何访问求解器找到的中间解决方案?【英文标题】:Google OR-Tools (using SCIP solver) - How to access the intermediate solutions found by the solver? 【发布时间】:2021-01-11 09:15:33 【问题描述】:

我是 Google OR-Tools 的新手。

我使用 Python 实现了一个 MIP 模型,其中 SCIP 作为求解器。目标函数用于最小化 (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() 只给出最终解决方案。

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

恐怕我面临另一个问题。解决方案池有效,但我的目标函数(solver.Minimize(C))实际上并没有随着时间的推移而减少,而是在增加。我在solver.Solve()之后添加了代码“while solver.NextSolution(): localtime = solver.wall_time() makepan_evolution[localtime] = C.solution_value()”。我做错了什么?提前致谢。 我想它会按照找到的相反顺序打印出解决方案。 你是对的@LaurentPerron!但是,NextSolution() 上的循环无法访问/输出最佳值(我事先知道我的 MIP 问题的最佳值)。例如,如果最佳值为 262。循环输出:263、264、268,... 换句话说,它“跳过”262。关于如何“获取”该值的任何建议?谢谢。 忘了提到我尝试使用solver.Objective().Value() 达到最佳值,但它也返回“263”。 Solve() 之后达到第一个(最佳)解决方案。然后可以通过NextSolution() 找到以前的解决方案。

以上是关于Google OR-Tools(使用 SCIP 求解器) - 如何访问求解器找到的中间解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

OR-Tools / SCIP - 如何使用指标约束来解决 MIP 问题?

OR-Tools:获取每一个最优解

Google Or-Tools:UnsatisfiedLinkError

在 Eclipse 中使用 google or-tools

如何获取 Google OR-Tools 的进度日志?

google or-tools 无法获得最佳 LP 结果,如 gurobi 示例