Julia 中断模型求解器并恢复它

Julia interrupt model solver and resume it

我是 运行 Atom 上的优化问题,使用 Julia。

我使用的求解器是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

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

免责声明:

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

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

可以

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

这应该可以通过定义回调轻松实现,该回调会遍历您的条件并根据这些条件采取行动(例如,等待几秒钟或等待用户输入)。

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

为了完成您的条件,您需要使用 what 的值(参见上面的文档)。

可行的候选人:

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

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

MIPSOL 将允许您访问有趣的变量,例如 MIP_OBJBST(当前最好的 objective ) 和公司

此处的核心假设:Gurobi 没有回调时间限制并会终止您的回调(类似于保护措施)。我不认为有类似的东西(至少在文档中没有警告)!

做不到

一般来说,你 can't 保存 Gurobi 的整个状态(link 适用于 Gurobi 7)。从基于软件工程的角度来看,这并不奇怪(并非不可能,但可能很棘手)。

可以

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

现在:

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

可以

如上所述使用内部状态的回调和查询,您可以使用您自己的序列化来外包当前最好的解决方案,也许更多。

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

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

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

现在:

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

将 SolutionLimit 或 TimeLimit 设置为 GurobiSolver 参数