整数编程 第五章--分隔符
对于一个较复杂的-hard问题(没有特别好的数学性质直接求解),如果你在寻找一种精确求解的方法,那一定绕不开分支定界法(Branch and Bound)以及它的变种,因为几乎所有的精确求解方法都建立在分支定界的框架之上。在掌握分支定界法之后,我们可以在分支定界框架上添加各类tricks,如割平面方法、启发式算法、预求解等等,也可以衍生出分支割(Branch and Cut)、分支定价(Branch and Price)等新精确求解框架。
一、隐式遍历(implicit enumeration)
在第四章中我们提到,分支定界法运用了分解(decomposition)与隐式遍历(implicit enumeration)的思想,回顾以下命题:
Proposition (decomposition-bound):Let , , be an upper bound on and be a lower bound on . Then = , = .
从上述命题中我们想到,可以利用上界和下界进行剪枝,从而达到隐式遍历的效果。而线性松弛是一个得到上界的方法,因此我们在每个节点得到并求解线性松弛子问题,再利用上述命题更新主问题的最优解、上界与下界,通过上下界来进行剪枝,完成隐式遍历。
-
Pruned by optimality:
当某一分支已达最优解(上下界相等)时,无需再对该分支进行分解。以下是一个例子:S为主问题,目前已知S的上界,将S分解为两个子问题,解出子问题的上下界,则子问题带来的新上下界为与。新的上下界(20,25)相较于之前的上下界(13,27)明显更优(上下界更加逼近了),因此更新新上下界为。
接下来我们考虑剪枝的可能性,由于上下界相等,已经是最优解了,所以剪枝。
-
Pruned by bound:
当某一分支的上界小于主问题的下界时,该分支不可能再对上下界改进,因此无需再对该分支进行分解。以下是一个例子:S为1中一样的主问题,子问题带来的新上下界为和,更新主问题上下界为(21,26)。
由于的上界小于主问题的下界,因此将剪枝。
- Pruned by infeasible:
当某一分支无可行解时,显而易见的,无需再对该分支进行分解。
二、B&B(Branch and Bound)算法流程
分支定界法在每个未被剪枝的节点或,都要进行Bounding、Pruning和Branching三个步骤:
-
Bounding. 解该节点的LP松弛问题,得到最优值,与最优解。更新该节点的上界为,下界为;
若最优解,则最优解是一个整数可行解,提供下界。更新该节点的下界为;
更新全局,;
Pruning. 利用pruned by optimality/bound/infeasibility进行剪枝;
-
Branching. 在未被剪枝的节点上选择某一变量(一般选择非整数的变量)进行子问题分解,如果的LP松弛解为,则分支为:
三、Branch and bound算法示例
-
求解原问题的LP松弛问题可得:,。更新全局upper bound = 8.429,lower bound = 。
针对进行分支,得到与,分别加上约束和. -
求解可得:,.
求解可得: infeasible,prune by infeasibility。
更新全局upper bound不变,lower bound = 4。在节点针对进行分支,得到和,分别加上约束和.
-
求解可得:,.
求解可得:,.
更新全局upper bound不变,lower bound = 7。因为最优值6小于lower bound 7, is pruned by bound.此时完成整棵树的遍历,得到的最优值为7,最优解为(2,1)。
B&B流程图:
推荐阅读
-
[运筹学] 整数编程、分支与边界总结 ( 整数编程 | 分支与边界 | 整数编程问题 | 松弛问题 | 分支与边界 | 分支与边界概念 | 分支与边界步骤 )★★★
-
运筹学] 整数编程(整数编程问题解决方案的特点 | 整数编程问题和松弛问题示例)
-
[运筹学] 整数编程、分支与边界总结 ( 整数编程 | 分支与边界 | 整数编程问题 | 松弛问题 | 分支与边界 | 分支与边界概念 | 分支与边界步骤 )★★★
-
0-1 使用隐藏枚举的整数编程 - 感受剪枝法
-
[运筹学] 整数编程 ( 相关概念 | 整数编程 | 整数线性规划 | 整数线性规划的分类 )
-
[运筹学] 整数编程 ( 整数编程示例 | 整数编程解决的核心问题 )
-
整数编程基础
-
操作优化 (X) - 整数编程解决方案
-
[数学建模笔记] 2.整数编程
-
整数编程问题的建模技术和求解方法汇总-3 求解方法