模运算可以表示为 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。相反,更一般地说,如果您有 b1b2作为两个rhs的选择, 约束会变成 x1 + x2 + x3 = b1(Y) + b2(1-Y).

如果你的约束中有 不等式 (<=),你会使用 Big-M 技巧,然后引入一个新的二元变量,从而使模型选择约束之一。

希望对您有所帮助。