整数规划:绝对值的赋值(取决于变量值)
Integer programming: assignment of absolute value (depending on variable value)
我对整数规划比较陌生,并且(再次)被约束的公式所困。
在我的简化模型中,我有一个(连续)变量,其下限 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,反之亦然。
有什么想法吗?
首先创建一个二进制变量,如果 Variable1 > 0
等于 1,如果 Variable1 < 0
:
则等于 0
Variable1 <= UB * BinaryVar
LB * (1 - BinaryVar) <= Variable1
(如果Variable1 > 0
,则BinaryVar
必须等于1。如果Variable1 < 0
,则BinaryVar
必须等于0。注意,如果Variable1 = 0
,则BinaryVar
可能等于 0 或 1,但这对您的问题无关紧要,因为如果 Variable1 = 0
那么 Variable2 = Variable3 = 0
并且下面的约束可以解决.)
现在添加约束以强制执行 Variable2
和 Variable3
的值:
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
我对整数规划比较陌生,并且(再次)被约束的公式所困。
在我的简化模型中,我有一个(连续)变量,其下限 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,反之亦然。
有什么想法吗?
首先创建一个二进制变量,如果 Variable1 > 0
等于 1,如果 Variable1 < 0
:
Variable1 <= UB * BinaryVar
LB * (1 - BinaryVar) <= Variable1
(如果Variable1 > 0
,则BinaryVar
必须等于1。如果Variable1 < 0
,则BinaryVar
必须等于0。注意,如果Variable1 = 0
,则BinaryVar
可能等于 0 或 1,但这对您的问题无关紧要,因为如果 Variable1 = 0
那么 Variable2 = Variable3 = 0
并且下面的约束可以解决.)
现在添加约束以强制执行 Variable2
和 Variable3
的值:
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