1

我有一个整数值有界变量,调用它X。(周围某处0<=X<=100

我想要一个二进制变量,调用它Y,例如Y=1ifX >= AX <= B, else Y=0

到目前为止,我想出的最好的是以下(在哪里T<x>引入了二进制变量,M 是一个很大的数)

(minimize Y)
(X - A) <= M*Ta
(B - X) <= M*Tb
Y <= Ta
Y <= Tb
Y >= Ta + Tb - 1

(换句话说,如果变量分别满足范围的下限和上限,则引入两个为真的二进制变量,并将结果设置为这些变量的二进制乘法)

这...工作,有点,但有几个主要缺陷。特别是,它没有严格定义-即使超出范围Y也可以。1X

那么:有没有更好的方法来做到这一点?特别是:有没有办法严格定义它,或者如果没有,至少可以防止误报?


编辑:澄清:A并且B是变量,而不是参数。

4

2 回答 2

1

我认为下面的作品。

(我) A * Y <= X <= B * Y + 100 * (1 - Y)

(二)(X - A) <= M * Ta

(三)(B - X) <= M * Tb

(四)Y >= Ta + Tb - 1

所以X < A使得:

(我)Y=0

和 (II)、(III)、(IV) 无关紧要。

X > B使:

(我)Y = 0

和 (II)、(III)、(IV) 无关紧要。

A <= X <= B使:

(一)Y = 1Y = 0

(二)Ta = 1

(三)Tb = 1

(四) Y = 1

于 2014-06-19T16:55:49.600 回答
1

通过扩展二进制变量与连续变量的乘法,以线性形式重写 Loannis 的答案:

  1. Tc <= M*Y
  2. Tc <= A
  3. Tc >= A - M*(1-Y)
  4. Tc >= 0
  5. Tc <= X
  6. Td <= M*Y
  7. Td <= B
  8. Td >= B - M*(1-Y)
  9. Td >= 0
  10. X <= Td + 100*(1-Y)
  11. (X - A + 1) <= M * Ta
  12. (B - X + 1) <= M * Tb
  13. Y >= Ta + Tb - 1

这似乎可行,尽管我还没有机会扩展它来证明它。此外,其中一些约束可能是不必要的;我没有检查。


我所做的扩展是根据以下规则:

Ifb是二元变量,andc是连续变量,and 0 <= c <= M, theny=b*c等价于:

  1. y <= M*b
  2. y <= c
  3. y >= c - M*(1 - b)
  4. y >= 0
于 2014-06-19T18:42:12.410 回答