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 if和 0 if的二进制变量Variable1 < 0

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

(如果Variable1 > 0, thenBinaryVar必须等于 1。如果Variable1 < 0, thenBinaryVar必须等于 0。注意 if Variable1 = 0, thenBinaryVar可以等于 01,但这对您的问题无关紧要,因为 if Variable1 = 0thenVariable2 = Variable3 = 0和下面的约束条件都可以。)

现在添加强制执行值的约束Variable2Variable3

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

这些是二次约束,然后您可以对其进行线性化。

线性化:

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 回答