整数编程:绝对值的赋值(取决于变量值)

时间:2015-02-12 16:38:50

标签: optimization mathematical-optimization linear-programming scientific-computing integer-programming

我对整数编程相对较新,并且(再次)陷入了约束的制定。

在我的简化模型中,我有一个(连续的)变量,其下限LB低于零,上限UB高于零。现在我想根据变量的值将变量值赋给其他变量。

我想表达的逻辑如下:

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

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

如何使用线性(in)等式来描述这个?

我觉得这有点慢......

提前致谢!

**编辑:对于建模,我使用Python,Pyomo和最新的Gurobi求解器。

***编辑:我现在通过使用二进制变量以下列方式制定它。 (我知道它是二次的,但后来可以线性化):

LB > 0
UB > 0

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

但是现在我还是要确保如果Variable2是&gt; Variable3是0。 0,反之亦然。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

首先创建一个二进制变量,如果Variable1 > 0则等于1,如果Variable1 < 0则等于0:

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

(如果Variable1 > 0,那么BinaryVar必须等于1.如果Variable1 < 0,那么BinaryVar必须等于0.请注意,如果Variable1 = 0,则为{{ 1}}可以等于0 1,但这对您的问题无关紧要,因为如果BinaryVar然后Variable1 = 0以及下面的约束可以解决问题。)

现在添加强制执行Variable2 = Variable3 = 0Variable2的值的约束:

Variable3

这些是二次约束,然后可以线性化。

线性化:

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