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

时间:2015-10-14 19:59:44

标签: linear-programming

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

CollapsingToolbarLayout

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

Android Design Support Library

这是对的吗?

2 个答案:

答案 0 :(得分:2)

你要问的是有两类约束:

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

    如果y=1那么这些约束相当于x-z <= 0z-x <= 0,意思是x=z,如果是y=0,则这些约束是{{1} }和x-z <= M,如果我们选择了足够大的z-x <= M值,则不应该绑定。

    1. 如果My=0。从技术上讲,您可以通过添加另一个控制x != zq)或x > zq=1)的二进制变量x < z来强制执行此约束。然后,您可以添加以下约束,其中q=0是一个小的正值,m是一个大的正值:
    2. 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 != zy=0获得最终解决方案,则可以调整x=z以获取值xx+epsilon,以获得一些极小的{{} {1}}。

答案 1 :(得分:0)

所以我将条件约束更改为

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

然后答案将是

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

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