【问题标题】:Julia interrupt model solver and resume itJulia中断模型求解器并恢复它
【发布时间】:2025-11-28 18:35:01
【问题描述】:

我正在使用 Julia 在 Atom 上运行优化问题。

我使用的求解器是 Gurobi:

m=Model(solver=GurobiSolver())
...
solve(m)

我的模型可能需要数小时到数天的计算才能达到最佳值,所以我想知道在 solve() 运行时我是否可以执行以下操作:

1. Interrupt upon interrupting/stopping Julia
2. Interrupt if the objective function returns a sufficiently good result
3. Interrupt after a set time

然后显示并保存达到的当前状态,以便稍后恢复计算。

【问题讨论】:

  • 我不认为你可以。您需要保存整棵树。 Cplex 曾经有一个叫做 endtree/starttree 的东西,但是这个选项被删除了。在 unix 上,您可以使用 CRIU 之类的方法保存进程并重新启动。

标签: model julia interrupt solver gurobi


【解决方案1】:

免责声明:

这非常宽泛,忽略了很多细节,为什么要提到无关紧要的事情(Atom 作为编辑器)。

另外:将此视为有根据的猜测。

可以做

  • 显示一些东西并在终端中等待
  • 用户输入后继续

这应该很容易通过定义一个回调来实现,它会遍历您的条件并根据这些条件采取行动(例如等待几秒钟或等待用户输入)。

要决定一件事:Gurobi 的Callback Codes 类型where,它将决定何时调用您的回调。

为了检查您的条件,您需要使用 what 的值(请参阅上面的文档)。

可行的候选人:

POLLING 0   Periodic polling callback
MIPSOL  4   Found a new MIP incumbent

现在polling 一般不允许您查询what 值。这使得它对您的任务毫无用处,我们不会考虑它。唯一的优点是它可能被非常频繁地调用,调用之间没有潜在的巨大时间差异。

MIPSOL 将允许您访问有趣的变量,例如 MIP_OBJBST(当前最佳目标)和 co。

这里的核心假设:Gurobi 没有回调时间限制并且会终止你的回调(类似于安全防护)。我不认为有这样的事情(至少在文档中没有警告)!

做不到

一般来说,您can't 保存 Gurobi 的整个状态(链接适用于 Gurobi 7)。从基于软件工程的角度来看,这并不太令人惊讶(不是不可能,但可能很棘手)。

可以做

您可以关闭计算机(休眠!),同时解决或在回调中处于某种等待状态。现在我再说一遍:我们正在谈论Hibernation of Operating-systems。挂起到内存(PC 将使用更少的能源)或挂起到磁盘(完全关闭)。

现在:

  • 这将破坏内部计时(您可以在详细输出中观察到)
    • 不确定是否与您相关(可能与您的回调交互!)
    • 警告:我可以想象基于时间(因为操作更难计算)
      • 这些统计数据因休眠而完全失去平衡并非不可能!
  • 这取决于您的操作系统的核心
  • Gurobi 开发人员可能无法保证或推荐此方法,但可能有效(并且确实可以运行;但更难评估对解决方案过程的影响)
    • 我们已经看到,事情可能会在睡眠(时间)期间发生变化,而对这些事情的假设是潜在的问题

可以做

使用上面提到的内部状态的回调和查询,您可以使用自己的序列化来外包当前的最佳解决方案,甚至更多。

这些东西,最重要的是MIP start vector,您可以稍后将其用于全新启动的优化过程。

您需要决定如何序列化这些数据。数据库、HDF5、文本文件等等!

读出和重用应该遵循 Gurobi 的文档。

现在:

  • 从可行的 MIP 解决方案开始(您目前最好的解决方案)不如重用整个内部状态好(我们正在丢失大量与解决过程相关的信息)
    • 但总的来说应该很有帮助(可能很大程度上取决于问题本身)
  • 您可以尝试存储并重新添加目标绑定作为约束,但我认为这不会有太大帮助

【讨论】:

  • 我发现使用参数 SolutionLimit 和 TimeLimit 可以满足我的需求
【解决方案2】:

将 SolutionLimit 或 TimeLimit 设置为 GurobiSolver 参数

【讨论】: