我有一个整数有界变量,称之为X
。 (约0<=X<=100
)
我想要一个二进制变量,称之为Y
,Y=1
X >= A
和X <= B
,否则Y=0
。
到目前为止,我提出的最好的是以下内容(其中T<x>
引入了二进制变量,而M是一个大数字)
(minimize Y)
(X - A) <= M*Ta
(B - X) <= M*Tb
Y <= Ta
Y <= Tb
Y >= Ta + Tb - 1
(换句话说,引入两个二进制变量,如果变量分别满足范围的下限和上限,则为真,并将结果设置为这些变量的二进制乘法)
这...工作,有点,但有几个主要缺陷。特别是,它没有严格定义 - 即使Y
超出范围,1
也可以X
。
所以:有更好的方法吗?特别是:有没有办法严格定义它,或者如果没有,至少可以防止误报?
修改:澄清:A
和B
是变量,而不是参数。
答案 0 :(得分:1)
我认为以下有用。
(I)A * Y <= X <= B * Y + 100 * (1 - Y)
(II)(X - A) <= M * Ta
(III)(B - X) <= M * Tb
(IV)Y >= Ta + Tb - 1
所以X < A
使:
(I)Y=0
和(II),(III),(IV)无所谓。
X > B
制作:
(I)Y = 0
和(II),(III),(IV)无所谓。
A <= X <= B
制作:
(I)Y = 1
或Y = 0
(II)Ta = 1
(III)Tb = 1
(IV)Y = 1
答案 1 :(得分:1)
通过扩展二元变量与连续变量的乘法,以线性形式重写loannis的答案:
Tc <= M*Y
Tc <= A
Tc >= A - M*(1-Y)
Tc >= 0
Tc <= X
Td <= M*Y
Td <= B
Td >= B - M*(1-Y)
Td >= 0
X <= Td + 100*(1-Y)
(X - A + 1) <= M * Ta
(B - X + 1) <= M * Tb
Y >= Ta + Tb - 1
这似乎有效,尽管我还没有机会扩展它以证明它。此外,其中一些限制可能是不必要的;我没有检查过。
我所做的扩展是根据以下规则:
如果b
是二进制变量,c
是连续变量,0 <= c <= M
,则y=b*c
等效于以下内容:
y <= M*b
y <= c
y >= c - M*(1 - b)
y >= 0