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

时间:2016-07-16 15:13:44

标签: matlab constraints linear-programming

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

constraint

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

2 个答案:

答案 0 :(得分:0)

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

enter image description here

你必须考虑:

  • 处理案例B的必要性(取决于你的目标和其他限制因素)以及bigM方法的垮台nice read
  • 如何实现两个二元变量的产品(这很容易;参见here

修改

以二元辅助变量的双倍为代价,也可以在没有bigM常量的情况下制定它。

草图:

  • 使用等于 == 两种含义 - &gt;而不是使用单侧含义来设置指标。没有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!)

答案 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的序列。