if线性规划中的陈述

时间:2015-11-04 16:31:30

标签: linear-programming

我有两个变量 a&gt; = 1 b = {0,1} ,所以 a 是一个整数正变量< em> / = 0 , b 是二进制变量。当 a = 1 时我想 b = 1 a> 1 b = 0 ,我需要把它写成一个线性程序。所以条件是:

if a=1 then b=1 else b=0

相当于:

if a<2 then b=1 else b=0

因为 a 因其他约束而不能为0。

任何人都知道如何在线性程序中编写它?

2 个答案:

答案 0 :(得分:3)

OP,如果M大于正整数a 的任何可能值,您在评论中建议的答案是正确的,即:

  

a&lt; = b + My; a&gt; = b + 2y; b + y = 1,其中y是二进制

为了证实,我们只需要检查这组陈述,以证明(1)期望的结果是可行的,(2)所有其他结果都是不可行的。由于在这种情况下b是二元变量,“所有其他结果”仅表示其他结果:b = 0 vs b = 1.

证明

(a = 1)=&gt; (b = 1)

首先,考虑一下条件:

  

如果a = 1则b = 1

在建议的答案中设a = 1 ,获取:

1 <= b+My; 1 >= b+2y; b+y = 1

显然, b = 1是可行的,因为我们可以找到允许所有语句为真的y值(即y = 0):

1 <= 1+M*0; 1 >= 1+2*0; 1+0 = 1

另一方面,如果我们让b = 0

1 <= 0+My; 1 >= 0+2y; 0+y = 1

这意味着 y = 1 在第二个陈述中导致矛盾

1 <= 0+M*1; 1 >= 0+2*1; 0+1 = 1

因此,如果a = 1,则必须是b = 1

(a> 1)=&gt; (b = 0)

接下来,考虑先前条件的contrapositive(以满足“else”子句):

  

如果a> 1,则b = 0

按照相同的步骤,在建议的答案中设置一个&gt; 1 - 我会放一个5,但请记住,这可能是任何大于1的整数

5 <= b+My; 5 >= b+2y; b+y = 1

我们看到 b = 0是可行的,因为我们可以找到y的值,使所有语句成立(即y = 1):

5 <= 0+M*1; 5 >= 0+2*1; 0+1 = 1

(这是重要的是M大于a的任何可能值,否则第一个陈述可能是不真实的。)

另一方面,如果我们让b = 1

5 <= 1+My; 5 >= 1+2y; 1+y = 1

这意味着 y = 0 导致第一个不等式中的矛盾

5 <= 1+M*0; 5 >= 1+2*0; 1+0 = 1

因此,如果a> 1,则必须是b = 0

结论

因此,这套陈述

a <= b+My; a >= b+2y; b+y = 1, where y is binary

满足条件

  

如果a = 1则b = 1,否则b = 0

答案 1 :(得分:-1)

C ++中的一个例子:

#include <iostream>

int main()
{
    // declare variables at top...
    int a = 1;
    int b = 0;

    // then some code that changes the initial value of a...

    // code to check the value of a and change the value of b...
    if (a == 1) {
        b = 1;
    } else if (a > 1) {
        b = 0;
    }

    // output value of b
    std::cout << "Value of b: " << b << std::endl;

    return 0;
}