1

我想向隨機編程問題的第一階段添加一些懶惰約束。舉例來說,最佳的解決方案表明我的位置16和20一起選擇,我不想讓我想添加一個懶惰的約束如下:在python-Gurobi接口中添加懶惰約束

First Stage 
     x1 + x2 + ... + x40 = 5 
     z_i,l <= x_i i=1,..,40 and l=1,2 
    Second Stage 
     .... 
    def mycallback(model,where): 
     if where == GRB.Callback.MIPSOL: 
      sol = model.cbGetSolution([model._vars[s] for s in range(1,40)]) 
      if sol[16] + sol[20] == 2: 
      Exp = LinExpr([(1,model._vars[16]),(1,model._vars[20])]) 
      model.cbLazy(Exp <= 1) 

    model._vars = x 
    model.optimize(mycallback) 

但運行此功能後,位置16和20仍處於最佳解決方案。您能否讓我知道我應該如何解決這個問題?

+0

檢查您對range()函數的使用。 –

+0

當我檢查指定範圍的model._vars [s]時,它會正確地給出每個位置的最佳值(0-1)。你能否指定更多如何檢查範圍? – user36729

+1

在上面的代碼中,_vars [i]!= sol [i] for i = 16,20 –

回答

1

在你的代碼,測試

if sol[16] + sol[20] == 2: 

用平等的整數比較兩個浮點數的總和。即使您將決策變量聲明爲整數,解決方案值也是浮點數。浮點數甚至不需要具有整數值。 Gurobi有一個參數IntFeasTol,它確定一個值可以從0或1到多遠,仍然被認爲是二進制。默認值是1e-5,因此0.999991將被視爲一個整數。您的支票應該類似於

if sol[16] + sol[20] > 1.5: