在线性规划中将条件约束转换为线性约束

Converting conditional constraints to linear constraints in Linear Programming

我有两个变量:x>= 0 和 y 二进制(0 或 1),我有一个常量 z >= 0。如何使用线性约束来描述以下条件:

If x = z then y = 1 else y = 0.

我试图通过定义另一个二进制变量 i 和一个足够大的正常数 U 并添加约束来解决这个问题

y - U * i = 0;
x - U * (1 - i) = z;

这是正确的吗?

确实有两个 类 您要问的限制条件:

  1. 如果y=1,则x=z。对于一些大常量 M,您可以添加以下两个约束来实现此目的:
x-z <= M*(1-y)
z-x <= M*(1-y)

如果y=1那么这些约束等价于x-z <= 0z-x <= 0,意思是x=z,如果y=0,那么这些约束就是x-z <= Mz-x <= M,如果我们选择了足够大的 M 值,则它们不应具有约束力。

  1. 如果 y=0x != z。从技术上讲,您可以通过添加另一个控制 x > z (q=1) 或 x < z (q=0) 的二进制变量 q 来强制执行此约束。然后你可以添加以下约束,其中 m 是一些小的正值,M 是一些大的正值:

x-z >= mq - M(1-q)
x-z <= Mq - m(1-q)

如果 q=1 则这些约束将 x-z 绑定到范围 [m, M],如果 q=0 则这些约束将 x-z 绑定到范围 [-M, -m].

在实践中,当使用求解器时,这通常不会真正确保 x != z,因为通常允许小范围违规。因此,我建议不要向您的模型添加任何约束来强制执行此规则,而不是使用这些约束。然后,如果你得到 y=0x=z 的最终解决方案,你可以调整 x 取值 x+epsilonx-epsilon 的一些无限小的值 epsilon.

所以我将条件约束更改为

if x = z then y = 0 else y = 1

那么答案就是

x - z <= M * y;
x - z >= m * y;

其中M是一个足够大的正数,m是一个足够小的正数。