0

私は整数プログラミングに比較的慣れていないため、(再び) 制約の定式化に行き詰まりました。

私の簡略化されたモデルでは、下限 LB がゼロ未満で上限 UB がゼロより大きい (連続) 変数があります。ここで、変数が取った値に応じて、変数値を他の変数に割り当てたいと思います。

私が表現したいロジックは次のとおりです。

LB > 0
UB > 0
-LB <= Variable1 <= UB

if Variable1 => 0:
    Variable2 = Variable1
    Variable3 = 0
else:
    Variable2 = 0
    Variable3 = abs(Variable1)

線形 (不) 等式を使用してこれをどのように説明できますか?

取り込みが少し遅いと思います..

前もって感謝します!

** 編集: モデリングには、Python、Pyomo、および最新の Gurobi ソルバーを使用しています。

*** 編集: バイナリ変数を使用して、次のように定式化しました。(二次であることは知っていますが、これは後で線形化できます):

LB > 0
UB > 0

-LB <= Variable1 <= UB
0 <= Variable2 <= UB
0 <= Variable3 <= LB
Variable4 = Variable2 * BinaryVariable - Variable3 * (1-BinaryVariable)

しかし、Variable2 が > 0 の場合、Variable3 が 0 であることを確認する必要があります。

何か案は?

4

1 に答える 1

1

Variable1 > 0まず、1 の場合と 0 の場合に等しいバイナリ変数を作成しますVariable1 < 0

Variable1 <= UB * BinaryVar
LB * (1 - BinaryVar) <= Variable1

(If Variable1 > 0, thenBinaryVarは 1 に等しくなければなりません. If Variable1 < 0, thenBinaryVarは 0 に等しくなければなりません. if Variable1 = 0, thenBinaryVarは 0またはVariable1 = 01 に等しくなる可能性がありますが、 if thenVariable2 = Variable3 = 0と以下の制約が正常に機能するため、問題にはなりません。)

Variable2との値を強制する制約を追加しますVariable3

Variable2 = Variable1 * BinaryVar
Variable3 = -Variable1 * (1 - BinaryVar)

これらは 2 次制約であり、線形化できます。

線形化:

Variable2 <= UB * BinaryVar
Variable2 >= -LB * BinaryVar
Variable2 <= Variable1 + LB * (1 - BinaryVar)
Variable2 >= Variable1 - UB * (1 - BinaryVar)
Variable3 = Variable2 - Variable1
于 2015-02-13T17:02:01.117 に答える