繁体   English   中英

Matlab优化-约束中优化变量的条件和

[英]Matlab optimization - conditional sum of optimization variable in constraint

我正在尝试使用MATLAB (bintprog)中的二进制变量来解决ILP问题。 我需要定义如下的约束:

约束

我想对二进制变量x<sub>i, j</sub>求和,直到其中一个zero ,然后停止该求和。 如何在ILP中定义此约束?

在我看来,这是非常不典型的MIP约束。 这是我尝试制定的方式:

在此处输入图片说明

您必须考虑:

  • 处理情况B(取决于你的目标和其他约束)的必要性和BIGM的方法的挫折很好读
  • 如何实现两个二进制变量的乘积(这很容易;请参见此处

编辑

以二进制辅助变量的两倍数量为代价,也可以在没有bigM常数的情况下公式化它。

草图:

  • 与其使用单方面的含义来设置指标,不如使用等于 == 两种含义 ->没有aux-var是免费的; 全部为0或1,仅取决于x(z)
  • 现在,按照以下思路构建第二层二进制辅助变量(b_i): b_i >= smallConst * b_i-1 + smallConst * a_i (smallConst in(0,0.5];不应接近0)
  • 将b-vector用于最终的总和约束(如上文所述;但不再使用a-vector!)

我的阅读方式(有点困难,因为几乎没有解释;我想这个问题的措辞可能更清楚),这实际上是在计算第一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM