2014-10-02 173 views
0

我试图让Gurobi在找到最佳解决方案(使用Java接口)后回调。最佳解决方案后Gurobi回调

背景:我正在研究一种方法,它需要(1)找到一个(非常好的)解决方案,然后(2)为该问题添加一个懒惰约束。首先要找到一个好的解决方案,因为确定一个合理的新的懒惰约束条件在我的情况下需要一个好的解决方案。

一般来说,这并不是一个问题,因为古罗比用MIP,MIPSOL等回来;然后,我可以检查当前解决方案的差距,并决定添加下一个懒惰约束。然而,当寻找一个非常好的解决方案时,Gurobi有时会找到一个最佳解决方案(例如在切断节点后)。在这种情况下,没有额外的MIP,MIPSOL或任何其他可用的回调,我可以添加一个额外的惰性约束。

我已经发现使用MIPNODE_STATUS可以识别出截断点。然而,我还没有找到一种方法来检查这种切断是否导致当前的解决方案被证明是最佳的。

有没有人知道识别这种情况,仍然添加一个懒惰的约束?

回答

0

一种方法是检查模型是否最优并且在完成optimize()-方法后未添加惰性约束。在这种情况下,只需添加懒惰约束并再次调用optimize()

在这种情况下,第二次优化从第一次优化的解决方案开始。我不确定,在这种情况下绑定行为如何。

一般来说,“手动”添加懒惰约束的方法看起来有点奇怪,因为在可行解决方案违反它们的情况下会自动添加。如果你目前还没有这样做,你可以尝试在一开始就加上Lazy value为1,这样它们会被谨慎地带入模型。