我有两个变量a >= 1和b = {0,1},所以a是整数正变量/=0,b是二进制变量。我想让b=1在a=1时,b=0当a>1时,我需要把它写成一个线性规划。所以条件是:
if a=1 then b=1 else b=0相当于:
if a<2 then b=1 else b=0因为由于其他约束,a不能为0。
有人知道怎么用线性规划来写吗?
发布于 2015-11-05 23:37:40
OP,如果M大于正整数a的任何可能值,则您在注释中所建议的答案是正确的,即:
A <= b+My;a >= b+2y;b+y = 1,其中y是二进制的
为了确认,我们只需要检查这组语句就可以证明:(1)期望的结果是可行的,(2)所有其他结果都是不可行的。由于b在本例中是一个二进制变量,“所有其他结果”仅仅意味着另一个结果: b=0与b=1。
证明
(a = 1) => (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) => (b = 0)
接下来,考虑前面条件的对位 (以满足“of”子句):
如果a>1那么b=0
按照相同的过程,让a>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 else b=0
发布于 2015-11-04 17:05:22
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;
}https://stackoverflow.com/questions/33527088
复制相似问题