我有一个混合整数线性程序(MIP或MILP)。 最后我想要一个线性程序的布尔变量,它具有以下属性。
我有两个变量:
boolean b.
real x, with x being 0 or larger.
我想要实现的目标是:
b == false if x == 0.
b == true if x > 0.
我找到了一种方法,通过以下方式描述x是否在特定范围内(例如2到3之间):
2*b <= x
x <= 3*b
上述测试公式的问题是,如果x在给定范围内,则b为真;如果在该范围之外,则为假。
如果x == 0,是否有人知道将布尔变量设置为false的方法,如果x大于0,是否知道设置为true?
答案 0 :(得分:2)
如果U
是x
的上限,那么
if x > 0 ==> b == 1
可以作为
x <= U*b
第二部分(x == 0 => b == 0
)需要修改为
x < epsilon ==> b == 0
可以作为
b <= 1 + x - epsilon
其中epsilon
是一个小数字。除了良好实践之外,这是必要的,因为求解器不适用于有理算术(although there are some research efforts to make them do so),但具有一定的精度阈值,因此10e-12
等量被视为零。
我希望这有帮助!
答案 1 :(得分:-1)
你可以使用signum函数http://en.wikipedia.org/wiki/Signum_function取绝对值并否定它。由于你没有命名特定的编程语言,所以我保持一般。