[英]Matlab optimization - conditional sum of optimization variable in constraint
我正在尝试使用MATLAB
(bintprog)中的二进制变量来解决ILP问题。 我需要定义如下的约束:
我想对二进制变量x<sub>i, j</sub>
求和,直到其中一个zero
,然后停止该求和。 如何在ILP中定义此约束?
在我看来,这是非常不典型的MIP约束。 这是我尝试制定的方式:
您必须考虑:
编辑
以二进制辅助变量的两倍数量为代价,也可以在没有bigM常数的情况下公式化它。
草图:
b_i >= smallConst * b_i-1 + smallConst * a_i
(smallConst in(0,0.5];不应接近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)
可以很容易地线性化(它是两个二进制变量的乘积;请参见此处 ;请注意,使用此公式,我们甚至可以将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个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.