我有两个变量 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。
任何人都知道如何在线性程序中编写它?
答案 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则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 。
接下来,考虑先前条件的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;
}