Python の PuLP モジュールを使用して混合整数プログラミングでモデル化しようとしている次の制約があります。
与えられた線形計画法変数: x1,x2,y1,y2
x1、x2、y1、y2 は最終的に整数値に解決されます
if (x1<=y2 and y1<=x2) then a=1 else b=0
Logical AND
で を処理する方法がわかりませんIF condition
。が存在しない場合はAND
、Big-M 表記を使用する必要があることがわかります。
Python の PuLP モジュールを使用して混合整数プログラミングでモデル化しようとしている次の制約があります。
与えられた線形計画法変数: x1,x2,y1,y2
x1、x2、y1、y2 は最終的に整数値に解決されます
if (x1<=y2 and y1<=x2) then a=1 else b=0
Logical AND
で を処理する方法がわかりませんIF condition
。が存在しない場合はAND
、Big-M 表記を使用する必要があることがわかります。
まず第一に、これは線形計画法ではなく混合整数計画AND
法です。制約は線形ではなく、含意でもないからです。また、 と の両方がバイナリ変数であるa
と仮定しました。b
次に、問題を次のように再定式化できます。
x1 > y2 + m*z1
y1 > x2 + m*z2
a + 1 >= z1 + z2
a <= z1
a <= z2
a - b >= 0
ここで、m
は (負の) 下限、つまりm < x1-y2
とである必要がありm < y1-x2
ます。z1
とは両方ともz2
バイナリ変数です。不等式を回避する<
には、最初の 2 つの制約にいくつかの小さなイプシロンを追加することをお勧めします。
x1 >= y2 + (m-eps)*z1 + eps
y1 >= x2 + (m-eps)*z2 + eps
IF-THEN-ELSE
与えられた問題に関係なく機能する処方を見つけました。z1, z2
回答の後半では、@ mattmilten の回答で説明されている変数を使用してAND condition
、if statement
問題が次の仕様であると仮定します。
if α > 0 then β >= 0 else γ >= 0
それから、
α - z * U_α <= 0 # (1)
α - (1 - z)(L_α - 1) > 0 # (2)
β - (1 - z)L_β >= 0 # (3)
γ - z * L_γ >= 0 # (4)
どこ、
L_α, L_β, L_γ # are constant lower bounds on α, β, γ (or values smaller than the lowest value they can take)
U_α # is a constant lower bounds on α
z # is a LP variable that can take values {0,1}
その場合、式 (1) と (4) は冗長であり、then condition
または (3) が適用されます 。
その場合、式 (2) および (3) は冗長であり、else condition
または (4) が適用されます 。
これを 2 回実行します。1 回目は α=α1 で、2 回目は α=α2 です。
どこ、
α1 = y2 - x1
z1 = decision variable for α1 with values {0,1}
α2 = y1 - x2
z2 = decision variable for α2 with values {0,1}
β # Currently unnecessary for my particular question.
γ # Currently unnecessary for my particular question.
したがって、制約は次のようになります。
α1 - z1 * U_α1 <= 0 # (1-1)
α1 - (1 - z1)(L_α1 - 1) > 0 # (1-2)
α2 - z2 * U_α2 <= 0 # (2-1)
α2 - (1 - z2)(L_α2 - 1) > 0 # (2-2)
z1=1 の場合、if 条件の最初の部分は true です。すなわち。x1<=y2
z2=1 の場合、if 条件の 2 番目の部分は true です。すなわち。x2<=y1
ここで、両方の条件を確保するために @mattmilten の定式化を使用します。
a + 1 >= z1 + z2
a <= z1
a <= z2
a - b >= 0
これにより、a=1 の場合、z1 と z2 の両方が >= 1 である必要があります。a=1 の場合、最後の条件に違反することなく、b は b=1 または b=0 のいずれかになります。
a=0 の場合、else 条件にあるため、b は 0 でなければなりません。