Skip to content

回溯法

Backtracking

深度优先枚举部分解并在不可能完成时撤销选择的搜索范式。

条目类型
原则

形式陈述

回溯法把候选解空间组织成一棵搜索:根是空部分解,每个节点是一个部分解,扩展操作枚举下一个决策的所有取值以生成孩子,叶子对应完整候选解。算法按深度优先搜索的次序遍历这棵隐式树,并配备可行性谓词:一旦谓词证明当前部分解不可能延伸为任何完整解,就剪掉整棵子树并回退,撤销最近的选择。其正确性分两半:可靠性——每个输出都满足全部约束;完备性——每个满足约束的完整解都对应一条从根到叶、未被剪枝切断的路径。因此剪枝条件必须是“所有后代都不可行”的充分条件。最坏运行时间与实际访问的节点数成正比,通常仍是指数级;空间只需存放当前路径及各层待选分支,为搜索深度量级。

直觉

回溯的口号是“试一个选择,走不通就撤销”,但它的真正价值不在枚举本身,而在于每一步维护的部分解不变量使“走不通”能够被尽早证明:砍掉一个深度为 d 的节点,等于免去其下方可能指数多的叶子。与先生成全部组合再逐一检验的朴素做法相比,回溯把约束检查推进到构造过程内部,失败发现得越早越便宜。撤销这一动作保证兄弟分支在完全相同的状态下出发——这是把指数规模的搜索写成线性空间递归的代价与要点。

回溯法的剪枝与回退
例子与边界

N 皇后问题逐行放置皇后,扩展时只生成与已放皇后不同列、不同两条对角线的位置。以 4 皇后为例:完整枚举有 44=256 个叶子,而回溯树小得多——第一行放第 1 列后,第二行只剩 2 个合法位置,多数分支在第三行即告枯竭,最终恰得全部 2 个解。数独求解常配合“候选值最少的空格优先分支”的启发式,它只改变子节点的枚举次序与分支因子,不改变解集,因而不损害完备性。

边界有三。其一,剪枝必须是不可行性的证明:把“启发式评分低”当作剪枝条件会砍掉真解、破坏完备性;若为求近似解而接受这种截断,得到的是有损的启发式搜索,而非回溯。其二,原地修改共享状态时必须在返回前完全撤销(包括所有辅助标记),否则兄弟分支相互污染,产生难以复现的错误。其三,回溯与动态规划的适用面不同:回溯遍历彼此不同的部分解,动态规划靠重叠子问题的缓存获利;子问题大量重复时应改用记忆化,几乎不重复时缓存只是浪费。

推论与应用

回溯是组合生成(排列、子集、划分的枚举)与约束满足求解的骨架:图着色、数独、拼图与调度都可写成逐变量赋值加剪枝。现代 SAT 求解器的祖先 DPLL 就是命题赋值上的回溯加单元传播;博弈树搜索中的 alpha–beta 剪枝、组合优化中的分支限界,都是“回溯加更强剪枝证书”的变体。与约束传播、对称性消除结合后,回溯在许多 NP 难问题的实际实例上远快于最坏界,但这仍不是多项式最坏保证。

若把搜索深度限制在参数 k,并证明每个节点至多产生 b 个孩子,有界搜索树把运行时间写成 O(bkpoly(n)),明确指数落在哪个参数上。迭代压缩沿实例规模逐步加入元素,同时把一个略超预算的解压回大小 k测度与征服则不用粗略“剩余变量数”,而为不同分支设计下降测度以解出更紧递推。它们都建立在可靠剪枝与完整撤销之上,却分别改变构造路线或分析尺度,不是三个同义的回溯模板。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Parts I–VI。
  • Jon Kleinberg and Éva Tardos, Algorithm Design, Pearson, 2005,Chs. 1–13。
关系图谱9 个相邻概念 · 4 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置

上位 / 更一般

暂未标注直接上位概念。

下位 / 直接特例

类型化关系

被这些条目使用

并列辨析