免责声明:
这非常宽泛,忽略了很多细节,为什么要提到无关紧要的事情(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 解决方案开始(您目前最好的解决方案)不如重用整个内部状态好(我们正在丢失大量与解决过程相关的信息)
- 但总的来说应该很有帮助(可能很大程度上取决于问题本身)
- 您可以尝试存储并重新添加目标绑定作为约束,但我认为这不会有太大帮助