LinearProgramming:非重叠约束?

时间:2017-11-21 06:02:54

标签: linear-programming mixed-integer-programming

我想在线性程序(或必要时的MIP)中写一个非重叠约束(即2个矩形不重叠)。我知道如何在Constraint编程中做到这一点:

对象i和j:

x [i] + dx [i]< = x [j] OR y [i] + dy [i]< = y [j] OR x [j] + dx [j]< = x [i] OR y [j] + dy [j]< = y [i] 其中x和y是包含对象坐标的数组,dx和dy是对象的尺寸。

想知道在LP / MIP中这样做的最好方法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

总结:您的约束编程约束是

x[i]+dx[i]<=x[j] OR 
y[i]+dy[i]<=y[j] OR 
x[j]+dx[j]<=x[i] OR 
y[j]+dy[j]<=y[i] 

在MIP模型中,您可以将其建模为:

x[i]+dx[i]<=x[j] + M*b[i,j,1] 
y[i]+dy[i]<=y[j] + M*b[i,j,2] 
x[j]+dx[j]<=x[i] + M*b[i,j,3]
y[j]+dy[j]<=y[i] + M*b[i,j,4]
sum(k, b[i,j,k])<=3
b[i,j,k] in {0,1}

其中M是一个足够大的常数(见link)。

如果您比较了矩形i和j,则不必再比较j和i。所以在上面的等式中我们可以使用forall i<j来利用这种对称性。