我有两个变量:x> = 0和y二进制(0或1),我有一个常数z> = 0.如何使用线性约束来描述以下条件:
CollapsingToolbarLayout
我试图通过定义另一个二进制变量i和一个足够大的正常数U并添加约束来解决这个问题
Android Design Support Library
这是对的吗?
答案 0 :(得分:2)
你要问的是有两类约束:
y=1
,则x=z
。对于某些大常量M
,您可以添加以下两个约束来实现此目的:x-z <= M*(1-y)
z-x <= M*(1-y)
如果y=1
那么这些约束相当于x-z <= 0
和z-x <= 0
,意思是x=z
,如果是y=0
,则这些约束是{{1} }和x-z <= M
,如果我们选择了足够大的z-x <= M
值,则不应该绑定。
M
则y=0
。从技术上讲,您可以通过添加另一个控制x != z
(q
)或x > z
(q=1
)的二进制变量x < z
来强制执行此约束。然后,您可以添加以下约束,其中q=0
是一个小的正值,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=0
获得最终解决方案,则可以调整x=z
以获取值x
或x+epsilon
,以获得一些极小的{{} {1}}。
答案 1 :(得分:0)
所以我将条件约束更改为
if x = z then y = 0 else y = 1
然后答案将是
x - z <= M * y;
x - z >= m * y;
其中M是足够大的正数,m是足够小的正数。