模运算可以表示为 CPLEX 中的约束吗?
Can a modulo operation be expressed as a constraint in CPLEX?
我有一种情况,如果求和是偶数,我想在我的优化函数中关联一个固定的 cost。也就是说,如果
(x1 + x2 + x3)%2 = 0
有没有办法在 CPLEX 中对其进行建模?所有的变量都是二进制的,所以真的,我只想表达x1 + x2 + x3 = 0 OR x1 + x2 + x3 = 2
是的,您可以通过引入一个新的二进制变量来做到这一点。 (请注意,我们正在修改基础公式,而不是针对模数修改 CPLEX 本身。)
你的约束是
x1 + x2 + x3 = 0 OR 2
让我们引入一个新的二进制变量Y并重写约束。
组合约束:x1 + x2 + x3 = 0(1-Y) + 2Y
这是可行的,因为如果 Y 为 0,则选择其中一个选项,如果 Y=1,则选择另一个选项。
简化后:
x1+x2+x3-2Y = 0
x_i, Y binary
附录
在您的特定情况下,约束得到了简化,因为其中一个 rhs 项为 0。相反,更一般地说,如果您有 b1 或 b2作为两个rhs的选择,
约束会变成
x1 + x2 + x3 = b1(Y) + b2(1-Y).
如果你的约束中有 不等式 (<=),你会使用 Big-M 技巧,然后引入一个新的二元变量,从而使模型选择约束之一。
希望对您有所帮助。
我有一种情况,如果求和是偶数,我想在我的优化函数中关联一个固定的 cost。也就是说,如果
(x1 + x2 + x3)%2 = 0
有没有办法在 CPLEX 中对其进行建模?所有的变量都是二进制的,所以真的,我只想表达x1 + x2 + x3 = 0 OR x1 + x2 + x3 = 2
是的,您可以通过引入一个新的二进制变量来做到这一点。 (请注意,我们正在修改基础公式,而不是针对模数修改 CPLEX 本身。)
你的约束是
x1 + x2 + x3 = 0 OR 2
让我们引入一个新的二进制变量Y并重写约束。
组合约束:x1 + x2 + x3 = 0(1-Y) + 2Y
这是可行的,因为如果 Y 为 0,则选择其中一个选项,如果 Y=1,则选择另一个选项。
简化后:
x1+x2+x3-2Y = 0
x_i, Y binary
附录
在您的特定情况下,约束得到了简化,因为其中一个 rhs 项为 0。相反,更一般地说,如果您有 b1 或 b2作为两个rhs的选择,
约束会变成
x1 + x2 + x3 = b1(Y) + b2(1-Y).
如果你的约束中有 不等式 (<=),你会使用 Big-M 技巧,然后引入一个新的二元变量,从而使模型选择约束之一。
希望对您有所帮助。