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 问题?