Skip to content

方法Method

回溯法

施工中 · 内容逐步修订

Backtracking

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

形式陈述 ​

回溯法把候选解空间组织成一棵搜索树:根是空部分解,每个节点是一个部分解,扩展操作枚举下一个决策的所有取值以生成孩子,叶子对应完整候选解。算法按深度优先搜索的次序遍历这棵隐式树,并配备可行性谓词:一旦谓词证明当前部分解不可能延伸为任何完整解,就剪掉整棵子树并回退,撤销最近的选择。

先明确搜索目标。若要枚举全部可行解,正确性要求每个输出都满足约束,且每个可行解至少对应一条未被剪断的根叶路径;此时可行性剪枝必须证明所有后代都不可行。若只需判断存在性或找一个解,分支与约简只须保证有解时至少保留一个见证;找到它即可停止。求最优解时,则要保留至少一个能达到最优值的候选,允许用有效目标界排除不可能改进的子树。

假定隐式搜索树有限且每次扩展、检查、撤销与结果输出均终止,遍历便会结束。总运行时间是各访问节点的扩展、检查与撤销成本之和,再加全部输出的写出成本;枚举时每个叶子可能写出一个很长的解,不能只计一次叶访问。访问节点数最坏仍可能是指数级。递归栈深度由搜索深度决定,此外还需计算部分解与辅助状态的存储;若保留全部解,还须计入输出存储。

直觉

回溯一边构造部分解,一边用约束判断它还能否完成:砍掉一个深度为 d 的节点,等于免去其下方可能指数多的叶子。与先生成全部组合再逐一检验的朴素做法相比,回溯把约束检查推进到构造过程内部,失败发现得越早越便宜。撤销保证兄弟分支从相同的父状态出发,因此通常可以复用状态存储,无需为每个兄弟保留完整副本。

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

N 皇后问题逐行放置皇后,扩展时只生成与已放皇后不同列、不同两条对角线的位置。以 4 皇后为例:不检查冲突的逐行枚举有 44=256 个完整候选。只生成合法前缀时,各深度的节点数为 1,4,6,4,2,共 17 个。第一行放第 1 列后,第二行可放第 3 或第 4 列;前者在第三行无路可走,后者还能在第三行放第 2 列,但第四行失败。另两条根叶路径给出全部 2 个解。数独求解常配合“候选值最少的空格优先分支”的启发式,它只改变子节点的枚举次序与分支因子,不改变解集,因而不损害完备性。

枚举全部解时,剪枝必须是不可行性的证明:把“启发式评分低”当作剪枝条件会砍掉真解、破坏完备性;若接受这种启发式截断,就失去了枚举全部可行解的保证。

原地修改共享状态时必须在返回前完全撤销(包括所有辅助标记),否则兄弟分支相互污染,产生难以复现的错误。

模式匹配的回溯字节码提供一种固定候选顺序的应用:失败标签转下一模式,成功标签共享后续检查。它在行入口清空临时绑定,or两臂成功时覆盖相同名字集合;guard失败进入下一源行,不能重新尝试已经提交的or替代。这套有限无环IR的状态约束须单独证明,不能从“用了回溯”四个字自动得到。

回溯与动态规划的适用面不同:回溯遍历彼此不同的部分解,动态规划靠重叠子问题的缓存获利;记忆化的收益取决于重复子问题的数量及重新求解它们的成本。

推论与应用

回溯是组合生成(排列、子集、划分的枚举)与约束满足求解的骨架:图着色、数独、拼图与调度都可写成逐变量赋值加剪枝。现代 SAT 求解器的祖先 DPLL 就是命题赋值上的回溯加单元传播。优化问题还允许另一类剪枝证书:整数规划分支定界用松弛界证明整棵子树不可能改善当前可行解,即使该子树仍有可行点也可以停止探索;这时目标是证明一个最优值,不是枚举全部解。与约束传播、对称性消除结合后,回溯在许多 NP 难问题的实际实例上远快于最坏界,但这仍不是多项式最坏保证。

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

参考资料
  • Jeff Erickson, Algorithms, 2019,Chapter 2 “Backtracking”:作者教材。隐式递归搜索、状态恢复与 N 皇后。
关系图谱9 个相邻概念 · 4 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

上位 / 更一般

暂未标注直接上位概念。

下位 / 直接特例

类型化关系