“它是回溯法在命题约束上的具体化。撤销必须覆盖该决策层之后的所有传播赋值,却不能删除更早层的事实。变量选择与先试极性可以极大改变树大小,但只要两个分支最终都能被探索,它们不改变判定结果。”
形式陈述 ​
回溯法把候选解空间组织成一棵搜索树:根是空部分解,每个节点是一个部分解,扩展操作枚举下一个决策的所有取值以生成孩子,叶子对应完整候选解。算法按深度优先搜索的次序遍历这棵隐式树,并配备可行性谓词:一旦谓词证明当前部分解不可能延伸为任何完整解,就剪掉整棵子树并回退,撤销最近的选择。其正确性分两半:可靠性——每个输出都满足全部约束;完备性——每个满足约束的完整解都对应一条从根到叶、未被剪枝切断的路径。因此剪枝条件必须是“所有后代都不可行”的充分条件。最坏运行时间与实际访问的节点数成正比,通常仍是指数级;空间只需存放当前路径及各层待选分支,为搜索深度量级。
直觉
回溯的口号是“试一个选择,走不通就撤销”,但它的真正价值不在枚举本身,而在于每一步维护的部分解不变量使“走不通”能够被尽早证明:砍掉一个深度为
例子与边界
N 皇后问题逐行放置皇后,扩展时只生成与已放皇后不同列、不同两条对角线的位置。以
边界有三。其一,剪枝必须是不可行性的证明:把“启发式评分低”当作剪枝条件会砍掉真解、破坏完备性;若为求近似解而接受这种截断,得到的是有损的启发式搜索,而非回溯。其二,原地修改共享状态时必须在返回前完全撤销(包括所有辅助标记),否则兄弟分支相互污染,产生难以复现的错误。其三,回溯与动态规划的适用面不同:回溯遍历彼此不同的部分解,动态规划靠重叠子问题的缓存获利;子问题大量重复时应改用记忆化,几乎不重复时缓存只是浪费。
推论与应用
回溯是组合生成(排列、子集、划分的枚举)与约束满足求解的骨架:图着色、数独、拼图与调度都可写成逐变量赋值加剪枝。现代 SAT 求解器的祖先 DPLL 就是命题赋值上的回溯加单元传播;博弈树搜索中的 alpha–beta 剪枝、组合优化中的分支限界,都是“回溯加更强剪枝证书”的变体。与约束传播、对称性消除结合后,回溯在许多 NP 难问题的实际实例上远快于最坏界,但这仍不是多项式最坏保证。
若把搜索深度限制在参数
参考资料
- 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。