2014-10-02 215 views
0

我試圖讓Gurobi在找到最佳解決方案(使用Java接口)後回調。最佳解決方案後Gurobi回調

背景:我正在研究一種方法,它需要(1)找到一個(非常好的)解決方案,然後(2)爲該問題添加一個懶惰約束。首先要找到一個好的解決方案,因爲確定一個合理的新的懶惰約束條件在我的情況下需要一個好的解決方案。

一般來說,這並不是一個問題,因爲古羅比用MIP,MIPSOL等回來;然後,我可以檢查當前解決方案的差距,並決定添加下一個懶惰約束。然而,當尋找一個非常好的解決方案時,Gurobi有時會找到一個最佳解決方案(例如在切斷節點後)。在這種情況下,沒有額外的MIP,MIPSOL或任何其他可用的回調,我可以添加一個額外的惰性約束。

我已經發現使用MIPNODE_STATUS可以識別出截斷點。然而,我還沒有找到一種方法來檢查這種切斷是否導致當前的解決方案被證明是最佳的。

有沒有人知道識別這種情況,仍然添加一個懶惰的約束?

回答

0

一種方法是檢查模型是否最優並且在完成optimize()-方法後未添加惰性約束。在這種情況下,只需添加懶惰約束並再次調用optimize()

在這種情況下,第二次優化從第一次優化的解決方案開始。我不確定,在這種情況下綁定行爲如何。

一般來說,「手動」添加懶惰約束的方法看起來有點奇怪,因爲在可行解決方案違反它們的情況下會自動添加。如果你目前還沒有這樣做,你可以嘗試在一開始就加上Lazy value爲1,這樣它們會被謹慎地帶入模型。