分支限界法完整学习笔记:框架、与回溯区别、两种剪枝机制
1. 分支限界(Branch and Bound,简称 B&B)
分支限界是一种用于求解离散最优化问题的通用算法框架。它把解空间组织成一棵“状态树”,在树上做系统搜索,但用“限界”信息把不可能产生最优解的分支剪掉,从而比穷举或回溯更高效。核心思想可概括为:
1.1 分支(Branch)
把原问题分解成若干互斥且覆盖全部可行解的子问题(子集),通常表现为在状态树上再向下扩展一层。
1.2 限界(Bound)
对每个子问题计算一个“乐观估值”——即该子问题所能达到的最优目标函数值的上界(最大化问题)或下界(最小化问题)。
同时维护一个全局“当前最好解”对应的真实目标值。
如果某子问题的界限比全局最好值还差,就剪掉该分支,不再展开。
1.3 搜索顺序
常用优先队列(Best-First)每次挑“界限最乐观”的结点先扩展,以期尽快找到高质量可行解,从而更早地剪掉更多分支。
1.4 终止
当优先队列空或待扩展结点的界限都不优于已证实的最优值时结束,保证得到全局最优。
2. 与回溯(Backtracking)的主要区别
2.1 求解目标
回溯:判定性问题(存在解?)或枚举所有解;分支限界:最优化问题(找最优解)。
2.2 搜索方式
回溯:深度优先(DFS),沿一条路走到底再回退;
分支限界:通常 Best-First,用优先队列选“最有希望”的结点先扩展。
2.3 剪枝依据
回溯:用约束条件(constraint)剪去“不可行”分支;
分支限界:除可行性外,再用“界限”剪去“不可能更优”的分支。
2.4 内存特征
回溯:栈式递归,内存 O(树深);
分支限界:优先队列存放活结点,最坏 O(活结点数),内存通常更大。
2.5 找到解的时机
回溯:第一次到达叶结点即可返回(判定性),或继续枚举;
分支限界:第一次出现可行解并不停止,需等到队列空或界限被“闭合”才能确认全局最优。
一句话总结:回溯是“深度优先+约束剪枝”,用于找可行解;分支限界是“最佳优先+界限剪枝”,用于找最优解。
3. 界限剪枝(Bound Pruning)和约束剪枝(Constraint Pruning)
两者都发生在搜索树的扩展过程中,但触发条件、剪枝目的和所需信息完全不同:
3.1 触发条件
约束剪枝:只要发现某结点已经违反题目的“硬性规定”(容量超重、颜色冲突、路径不连通……)就立即剪掉。
界限剪枝:必须等算完该子问题的“乐观估值”(上/下界)后,拿它与“当前已知的最好可行解”比较;估值比已证实的还差才剪。
3.2 剪枝目的
约束剪枝:剔除“不可行”分支,保证后续只考虑可能得到合法解的路径。
界限剪枝:剔除“不可能更优”分支,保证最终不会错过全局最优,同时减少搜索量。
3.3 所需信息
约束剪枝:只需要局部约束条件,无需任何目标函数值或全局最优参考。
界限剪枝:必须能计算或估计子问题的目标函数界限,并且维护一个“全局当前最优值”(初始可用 ∞ 或某个快速启发式解)。
3.4 使用阶段
约束剪枝:回溯和分支限界都会用,通常先判断;
界限剪枝:只有分支限界(或任何求最优的 B&B 类算法)才会用,判断顺序一般放在“可行性”之后。
3.5 举例对比
0-1 背包:
– 约束剪枝:若已选物品总重 > 容量,直接剪掉;
– 界限剪枝:计算该结点剩余物品按“单位价值降序能装多少”的乐观上界,若上界 ≤ 已找到的最好价值,则剪掉。
一句话:
约束剪枝看“能不能行”,界限剪枝看“值不值得继续”;前者是“硬淘汰”,后者是“性价比淘汰”。
1232

被折叠的 条评论
为什么被折叠?



