过去一段时间里小编一直接触启发式算法,自从学习了运筹学以后,就对运筹学的精确方法垂涎已久,像什么单纯形法啦,分支定界啦,割平面啦… 就在小编一边做梦一边睡大觉的时候,boss发来一个任务:用割平面法求解混合整数规划问题。于是小编马上从床上跳起来,挑灯夜战为大家整出了这个代码…
内容提要:
- 混合整数规划问题;
- 单纯形法和对偶单纯形法;
- 割平面法;
- 割平面法Java代码。
什么是混合整数规划
混合整数规划问题(Mixed Integer Programming,MIP)属于线性规划的一种。关于线性规划,过去的推文里我们有介绍过,还不懂的同学可以参考这篇推文:
运筹学教学|十分钟快速掌握单纯形法(附C++代码及算例)
整数规划,顾名思义,就是优化问题里的变量要求取整数。比如老板们要雇佣咱们打工人,只能雇佣整数个,不能雇佣半个。混合整数规划,就是决策变量即有整数又有小数,比如买西瓜,可以买半个,也可以买一个、两个。
在线性规划模型中,我们直接用“整数”两个大字来描述这种约束。

解决整数规划问题要比解决一般线性规划问题困难得多,因为整数部分的处理无法用简单的大于、小于号描述,只能简单粗暴的检查解是否有小数部分。现在还没有已知的多项式时间算法来解决广义的MILP问题。
常见的解决MIP的方法有分支定界法和割平面法。有关分支定界法可以看这些推文的介绍:
干货 | 10分钟带你全面掌握branch and bound(分支定界)算法-概念篇
干货 | 10分钟搞懂branch and bound算法的代码实现附带java代码
干货 | 10分钟教你用branch and bound(分支定界)算法求解TSP旅行商问题
运筹学教学|分枝定界求解旅行商问题
单纯形法和对偶单纯形法
在介绍割平面法前,我们还要介绍两种基本方法:对偶单纯形法和单纯形法。
有关单纯形法,也是很基础的知识啦,不懂的照惯例回去看上面的推文。
这里小编简单介绍下对偶单纯形法。
对偶单纯形法是用来补充纯粹的单纯形法无法解决特殊问题的缺陷。而且对偶单纯形法更加“强大”,因为它可以在等式右端(b)为负值时直接求解,这也是选择使用它的大多数场景。
我们直接用这个例子来看:

单纯形法当然还是有单纯形表,不过在新的单纯形表中,本来在右侧的theta栏变到的下侧。

每次更新单纯形表时,我们先从最右侧的B^-1b一栏找到最小的负数(如果都为正数,则最优解以找到),确定为第y行;
第二,依照单纯形法的方法更新检验数;
第三,对第y行的所有小于0的数,计算theta = 检验数 / 对应的y值,取最小的theta,记为第x行。
最后,用单纯形法同样的方法,将x列对应的变量入基,y行对应的变量出基。
不断迭代,知道所有B^-1b都大于0。
怎么样,是不是很简单呢~

割平面法
无论是分支定界还是割平面法,解决整数约束的方法只有一个:“看”解中的变量是否为整数。
分支定界和割平面法利用各自的方法不断增加约束、缩小解空间,再通过单纯形法得出新的解空间下的最优解,最后判断新解是否为整数,不是则继续迭代。

割平面法利用每次新解里的非整数部分得到一个新的不等式。具体来说,就是这样的东西:

本文介绍了混合整数规划(MIP)及其在运筹学中的重要性,对比了单纯形法与对偶单纯形法,并详细阐述了割平面法的原理和步骤,包括如何处理非整数解得到新的约束。通过Java代码示例展示了割平面法的实现过程,强调了其在解决MIP问题时可能存在的局限性和计算误差。文章还提供了代码下载链接供读者深入研究。
最低0.47元/天 解锁文章
6845





