一、 核心思想一览:分支限界法是什么?
首先,忘掉复杂的定义,我们用一个比喻来理解:
想象你在一个巨大的迷宫里寻找最短的出口路径(最优化问题)。
- 穷举法:像无头苍蝇,把每一条路都走到死胡同,再回来,效率极低。
- 回溯法 (DFS):像个执着的探险家,选一条路就走到黑,不撞南墙不回头。这是一种“深度优先”的策略。
- 分支限界法 (BFS-like):你是一个“聪明的”探险家,站在迷宫的入口,同时派出很多个机器人去探索不同的岔路口。你有一个全局的“活结点列表”,并且每个机器人都会实时向你汇报:“我这条路估计走出去最少还要多远”。你会优先关注那些“最有前途”(估计总路程最短)的机器人,让它继续前进。这是一种“广度优先”或“最佳优先”的策略。
总结来说,分支限界法的本质是:
- 分支 (Branch):系统地探索解空间,即生成问题的各种可能状态(解)。
- 限界 (Bound):设立一个“界限”,用这个界限去剪掉那些不可能产生最优解的分支,从而避免不必要的搜索,提高效率。
二、 与回溯法的深度对比 (笔试高频考点)
这是理解分支限界法定位的关键,用一个表格来对比,方便你记忆:
| 特性 | 回溯法 (Backtracking) | 分支限界法 (Branch and Bound) |
|---|---|---|
| 搜索方式 | 深度优先 (DFS),一条路走到黑。 | 广度优先 (BFS) 或 最佳优先 (Best-First),全面铺开,择优发展。 |
| 目标任务 | 主要用于找出满足条件的所有解或任意一个解(如N皇后、数独)。 | 主要用于求解最优化问题(如TSP、0/1背包),寻找最优解。 |
| 数据结构 | 隐式地使用栈(通过系统递归实现)。 | 显式地使用队列 (Queue) 或 优先队列 (Priority Queue) 来管理活结点。 |
| 结点扩展 | 每次只扩展当前结点的一个子结点。 | 每次扩展当前结点的所有子结点,并把它们都加入活结点列表。 |
| 内存消耗 | 相对较小,因为它只保存从根到当前结点的路径。 | 相对较大,因为它需要存储所有活结点。 |
三、 分支限界法的“三驾马车”:算法核心构成
要掌握分支限界法,就要理解它的三个核心部件。这三个部件协同工作,构成了整个算法的骨架。
1. 分支策略 (如何搜索?) - 活结点表
“活结点表”存储了所有已经生成但其子结点尚未被完全探索的结点。选择下一个要探索的结点(E-结点)的方式,决定了分支限界法的不同类型:
- FIFO (先进先出) 策略:用队列 (Queue) 实现活结点表。这是一种广度优先搜索,按层级顺序探索。
- LIFO (后进先出) 策略:用栈 (Stack) 实现活结点表。这使得搜索过程类似于深度优先。
- LC (最小成本/Least Cost) 策略:这是最强大、最常用的一种,也叫优先队列式分支限界法。它使用优先队列 (Priority Queue) 来存储活结点,每次都从队列中取出“成本估计值”最优的结点进行探索。这体现了“智能搜索”的思想。机试中,99%的情况都是用这种策略。
2. 限界函数 (如何剪枝?) - 效率的关键
这是分支限界法的灵魂!限界函数的设计直接决定了算法的效率。它分为两部分:估计函数 和 剪枝规则。
-
对于【最小值】问题 (如TSP、作业排序):
- 代价估计函数
ĉ(x):对于当前结点x,我们需要估算从它出发能得到的最小总成本。这个估计值必须是真实最小成本的下界 (Lower Bound),即ĉ
- 代价估计函数

最低0.47元/天 解锁文章
2122

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



