混合整数规划(Mixed Integer Programming)

混合整数规划(Mixed Integer Programming)

混合整数规划问题是运筹优化中经常遇到的一类问题。在这类问题中自变量的类型可能是整数也可能不是整数。相比于连续优化,混合整数规划很多时候会更难求解。在学术界混合整数规划一直是一个活跃的研究领域。

Branch and Bound(分支定界法)

分支定界法是求解整数规划和混合整数规划类问题的一种经典算法。其中包含了分支(branch)和定界(bound)两个部分。分支部分作用是将问题分解为子问题,定界部分作用是寻找一个松弛过后的最优解,进而判断能否将某分支进行修剪。

我们以一个简单的背包问题为例:

混合整数规划(Mixed Integer Programming)_第1张图片

我们需要在给定背包容量的约束下最大化背包里装的物品的价值。上面这个问题中有三种物品可以选择。对于物品而言,只有0和1两种选择。但假如我们要放入的是巧克力呢,那么我们就可以将大巧克力分成小巧克力使得背包恰好被装满。在这种情况下,我们需要将单位价值更高的巧克力先放到背包里,这样才能够保证包里装的东西价值最高。当物品是巧克力时,我们相当于将原本的整数变量进行了松弛,以达到最优。

我们也可以在混合整数规划中参照上面的思路,我们可以在定界的时候对原本限制为整数的变量松弛,得到松弛过后的最优解。实际的最优解是没有松弛过后的最优解好的,即松弛过后的最优解是实际的最优解的上界(在背包问题中,目标函数需要最大化)。假如在某一分支松弛过后的最优解仍然没有当前的最优好,代表这一分支可以被舍弃。经过松弛,我们可以更好地进行剪枝,加速分支定界法的算法执行。

Cutting Planes(割平面法)

割平面法也是在混合整数规划中经常会用到的方法,其中怎么割平面有很多种方法,在这里主要介绍Gomory cuts。在割平面法中,线性规划起到了很大的作用
混合整数规划(Mixed Integer Programming)_第2张图片

假设有上述问题,我们首先对整数变量进行松弛。松弛过后原本的整数规划问题可以看作是一个线性规划问题。对于线性规划问题我们可以使用单纯形法这个经典的算法进行多项式时间内的求解(大部分情况)。对原问题进行松弛过后进行线性规划求解得到的解不一定为原问题的解,因为求出来的解可能不是整数。

混合整数规划(Mixed Integer Programming)_第3张图片

这时我们需要对解空间进行切割,切割需要满足两个条件

  • 切割过后的解空间中不包含上一次线性规划求出来的解

  • 切割没有将可行解切割掉

切割过后继续使用线性松弛,重复上面的步骤,最终得出最优解。

初看割平面法可能有些懵,在这里介绍一下Gomory Cut。还是以上面的这个问题为例子。

混合整数规划(Mixed Integer Programming)_第4张图片

我们首先使用单纯形法,求得线性规划的最优解。我们可以求得以下的结果

混合整数规划(Mixed Integer Programming)_第5张图片

从图中我们可以看出,求出来的解x2为分整数,我们需要进行第一次Gomory cut。分别将等式两边的小数部分取出来,我们可得到

1 4 x 3 + 1 4 x 4 ≥ 1 2 \frac{1}{4}x_3+\frac{1}{4}x_4 \geq \frac{1}{2} 41x3+41x421

可能有人会对这个不等式的由来有些疑问,其实是这样的。

混合整数规划(Mixed Integer Programming)_第6张图片
混合整数规划(Mixed Integer Programming)_第7张图片

当我们切了之后相当于原本的优化问题又添加了一个不等式。接着我们需要使用对偶单纯型法进行求解。注意,s1是新引入的松弛变量。

混合整数规划(Mixed Integer Programming)_第8张图片

反复重复上面的过程,最终我们能够求出问题的最优解。

参考资料:

  • coursera discrete optimization

你可能感兴趣的:(优化,算法)