我有两个变量: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;
它是否正确?
实际上,您要询问两类约束:
- If
y=1
, then x=z
。对于一些大常数M
,您可以添加以下两个约束来实现此目的:
x-z <= M*(1-y)
z-x <= M*(1-y)
If y=1
那么这些约束等价于x-z <= 0
and z-x <= 0
, 意义x=z
, 而如果y=0
,那么这些约束是x-z <= M
and z-x <= M
,如果我们选择足够大的值,则不应具有约束力M
value.
- If
y=0
then x != z
。从技术上讲,您可以通过添加另一个二进制变量来强制执行此约束q
控制是否x > z
(q=1
) or x < z
(q=0
)。然后您可以添加以下约束,其中m
是一些小的正值并且M
是一些大的正值:
x-z >= mq - M(1-q)
x-z <= Mq - m(1-q)
If q=1
那么这些约束约束x-z
到范围[m, M]
, 而如果q=0
那么这些约束约束x-z
到范围[-M, -m]
.
在实践中,当使用求解器时,这通常不能真正确保x != z
,因为通常允许小的边界违规。因此,我建议不要向模型添加任何约束来强制执行此规则,而不是使用这些约束。然后,如果你得到最终的解决方案y=0
and x=z
,你可以调整x
获取价值x+epsilon
or x-epsilon
对于某个无穷小的值epsilon
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)