分支限界法完整学习笔记:框架、与回溯区别、两种剪枝机制

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 背包:
– 约束剪枝:若已选物品总重 > 容量,直接剪掉;
– 界限剪枝:计算该结点剩余物品按“单位价值降序能装多少”的乐观上界,若上界 ≤ 已找到的最好价值,则剪掉。

一句话:
约束剪枝看“能不能行”,界限剪枝看“值不值得继续”;前者是“硬淘汰”,后者是“性价比淘汰”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值