1

確率的プログラミング問題の第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は依然として最適解です。この問題をどのように攻撃すべきか教えてください。

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

コードで

+0

range()関数の使用を確認してください。 –

+0

指定した範囲のmodel._vars [s]をチェックすると、各場所の最適値(0-1)が正しく与えられます。範囲を確認する方法をさらに指定してください。 – user36729

+1

上記のコードでは、_vars [i]!= sol [i] for i = 16,20 –

答えて

1

、試験は等価を使用して整数2つの浮動小数点数の和を比較しています。決定変数を整数と宣言しても、解の値は浮動小数点数になります。浮動小数点数は整数値を持つ必要はありません。 GurobiにはパラメータIntFeasTolがあります。このパラメータは、値が0または1からどれくらい離れていても、バイナリとみなせるかを決定します。デフォルトは1e-5なので、0.999991は整数とみなされます。あなたのチェックは次のようになります

if sol[16] + sol[20] > 1.5: 
関連する問題