我正在尝试在MIP中建模以下约束:
x_1 +x_2 + ... +x_n != d
我们的想法是引入一个变量z,如果x_1 + x_2 + ... + x_n = d则为1,并添加约束
z <= 0.
但我无法弄清楚如何建模约束
(x_1 +x_2 + ... +x_n = d) ==> z=1
在整数程序中。
答案 0 :(得分:5)
我假设所有x_i
都是整数。让L
和U
成为常量
L <= x_1+x_2 + ... +x_n <= U
和y
二进制变量。这些约束表达了您的期望:
x_1+x_2 + ... +x_n >= d+1 + (L-d-1)y
x_1+x_2 + ... +x_n <= d-1 + (U-d+1)(1-y)
如果y=0
,那么第一个约束x_1 +x_2 + ... +x_n >= d+1
必须成立,x_1+x_2 + ... +x_n <= U
的定义符合第二个约束U
。
如果y=1
那么第二个约束x_1 +x_2 + ... +x_n <= d-1
必须成立,x_1+x_2 + ... +x_n >= L
的定义符合第一个约束L
。
(请检查拼写错误。)
这是整数编程中的臭名昭着的大M方法。它可能导致不良松弛,也可能导致病态问题。
进一步的技巧,谷歌“整数编程技巧”。特别是,请参阅AIMMS Modeling Guide - Integer Programming Tricks了解这个大M方法技巧。