一、基本概念
1、回溯法的定义
在问题的解空间树中,按深度优先搜索的策略,从根结点出发搜索解空间树。搜索至解空间树的任一节点时,先判断该节点是否包含问题的解。如果包含,则进入该节点的子树,继续按深度优先策略搜索;如果不包含,则跳过对该节点的子树的搜索,逐层向其祖先节点回溯。
相比于穷举式的搜索,回溯法能避免许多不必要的搜索,因此,回溯法适用于解一些组合数比较大的问题。
2、回溯法的解题步骤
- 针对所给问题,定义问题的解空间;
- 确定易于搜索的解空间结构;
- 以深度优先搜索的方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
(1)解空间树:
用回溯法求解问题,重点是设计问题的解空间树,解题过程即是深度遍历解空间树的过程。
根据待求解问题的特性,用树结构表示问题的解结构、用叶子表示问题所有可能的解的一棵树,即为解空间树。
解空间树的形成过程:
把求解问题的过程当作一系列的决定来考虑,系统地分析每一个决定的所有可能的结果。每一个决定即为解空间树中的一个分支节点,各种可能的结果即为子树,问题最终所有可能的解即为所有的叶子。这便是解空间树的形成过程。
对解空间树进行遍历搜索,即可得到问题的全部解。
(2)剪枝函数:
在深度搜索解空间树的过程中,搜索至解空间树的任一节点时,要先判断该节点是否包含问题的解,如果不包含,则要进行“剪枝”,从而避免无效搜索。
回溯法的两个剪枝策略:
- 用约束函数剪去不满足约束的子树;
- 用限界函数剪去得不到最优解的子树。
Tips:
回溯法求解的特点是在搜索过程中动态产生问题的解空间。在任意时刻,算法只保存从根结点到当前结点的路径。