我正在尝试使用MATLAB
(bintprog)中的二进制变量解决 ILP 问题。我需要定义一个类似于下面的约束:
我想对二进制变量x<sub>i, j</sub>
求和,直到其中一个等于zero
,然后停止此求和。如何在ILP中定义此约束?
答案 0 :(得分:0)
在我看来,这是一个非常典型的MIP约束。这是我尝试制定这个:
你必须考虑:
修改强>
以二元辅助变量的双倍为代价,也可以在没有bigM常量的情况下制定它。
草图:
b_i >= smallConst * b_i-1 + smallConst * a_i
(smallConst in(0,0.5);不应该接近0)答案 1 :(得分:0)
我读这个的方式(有点困难,因为几乎没有解释;我认为这个问题可以更明确地表达),这基本上是计算第一个x(k)
的1.这里我假设x(i,j)
映射到x(k)
,因此我们有一个更好的定义顺序。可以使用新的二进制变量y(k)
来完成计数:
y(k) = x(k)*y(k-1) if k>1
y(k) = x(k) if k=1
y(k) in {0,1}
例如:
x = [1 1 1 0 1 0]
y = [1 1 1 0 0 0]
非线性表达式x(k)*y(k-1)
可以很容易地线性化(它是两个二元变量的乘法;请参阅here;请注意,使用此公式我们甚至可以放松y(k)
到0之间的连续1)。优化版本可能如下所示:
y(k) >= x(k)+y(k-1)-1 if k>1
y(k) = x(k) if k=1
0 <= y(k) <= 1
现在你可以做到
sum(k, y(k)) <= c
这个表述也可以说:前导1的数量应该在c1和c2之间。
我们也可以立即写信:
x(1) + ... + x(c+1) <= c
也禁止超过c领先1,甚至更简单。
我们经常看到的一个不同的问题(例如在发电机调度中)是我们不能超过c连续x(k)
开启的条件(即发电机不能启用超过c连续周期:c周期开启后,发电机必须关闭至少1个周期)。这意味着我们不允许超过c 1的序列。