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

时间:2017-12-02 21:32:27

标签: model julia interrupt solver gurobi

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

我使用的解算器是Gurobi:

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

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

db.car.aggregate([
    { $project : { city_state : { $split: ["$City/State/Zip", " "] } } },
    { $unwind : "$city_state" },
    { $match : { city_state : /[A-Z]{2}/ } },
    { $group : {_id:{ "state" : "$city_state" }, count:{$sum:1}}}
])

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

2 个答案:

答案 0 :(得分:2)

声明:

这是非常广泛的,并且错过了很多细节,为什么提到无关紧要的事情(Atom as Editor)。

另外:认为这是有根据的猜测。

可以做

  • 显示内容并在终端中等待
  • 在用户输入后继续

这应该可以通过定义一个回调来轻松实现,该回调符合您的条件并根据这些条件行事(例如,等待几秒钟或用户输入)。

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

要了解您的条件,您需要使用内容的值(请参阅上述文档)。

可行的候选人:

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

现在投票通常不允许您查询值。这使得它对你的任务毫无用处,我们不会考虑它。唯一的好处是它可能经常被调用,而且调用之间没有潜在的巨大差异。

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

这里的核心假设是:Gurobi没有回调时限,并且会终止你的回调(类似于保护措施)。我不认为有类似的东西(至少在文档中没有警告)!

不能做

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

可以做

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

立即

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

可以做

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

这些事情,最重要的是你可以在以后用于完全新开始的优化过程的MIP start vector

您需要决定如何序列化此数据。数据库,HDF5,文本文件和co。!

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

立即

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

答案 1 :(得分:0)

将SolutionLimit或TimeLimit设置为GurobiSolver参数