回溯法
回溯法
回溯算法主要针对于**搜索问题
**或优化问题,这类问题的满足显示约束)尝分布在一个解空间
中,因此也就是在解空间中找到一个可行解(最优解)或者所有的可行解(最优解)。
回溯算法通常将此搜索空间看作一定的树形结构,称之为解空间树
,采用一种“走不通就掉头的搜索策略”,相当于从根节点开始对解空间树进行深度优先搜索
,。
回溯法的基本概念
回溯法的解需要满足一组综合的约束条件,通常分为:显式约束和隐式约束。
- 显式约束条件: 限定每个x只从一个给定的集合上取值。(可能与问题实例I有关,也可能无关。)
满足显式约束的所有元组确定一个可能的解空间。
- 隐式约束条件: 规定了实例I的解空间中那些满足规范函数的元组,描述了xi必须彼此相关的情况。(与问题实例I有关)
解空间中满足隐式约束条件的元组称为可行解。
- 问题状态(problem state):树中的每一个结点确定所求解问题的一个问题状态。
- 状态空间(state space):由根结点到其他结点的所有路径确定了这个问题的状态空间。
- 解状态(solution states): 是这样一些问题状态S,对于这些问题状态,由根到S的那条路径确定了这个解空间中的一个元组。
- 答案状态(answerstates):是这样的一些解状态S,对于这些解状态而言,由根到S的这条路径确定了这问题的一个解(满足隐式约束条件)。
- in all,问题状态->解状态->答案状态。
- 状态空间树(state space tree):解空间的树结构,包括所有结点及所有边(由根到各结点的路径)。
- 算法的目标就是搜索整棵状态空间树,寻找答案结点。
- 静态树:状态空间树结构与所要解决问题的实例无关。
- 动态树:状态空间树结构与所要解决问题的实例有关。
- 活结点:一个结点如果已被生成,而它的所有儿子结点还没有全部生成,则称这个结点为“活结点”,表示开始处理但还没有完全处理完的结点;
- 死结点:其儿子已全部生成或在该结点剪枝,从而无需向下扩展的结点,称为“死结点”,表示已经处理完毕的结点;
- E-结点:当前正在生成其儿子结点的活结点,称为“E-结点”(正在扩展的结点),即正在处理的结点。
回溯法的搜索过程
从根结点出发,以深度优先方式搜索整个解空间。
首先,根结点成为一个活结点,同时也成为当前的扩展结点。
在当前扩展结点处,搜索向纵深方向移至一个新结点,该新结点成为一个新的活结点,并成为当前扩展结点。
如果在当前扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。此时应回溯至最近的一个活结点处,并使该活结点成为当前的扩展结点,继续执行第②步。
回溯法以这种方式递归地在解空间中搜索, 直至找到所要求的解或解空间中已没有活结点时为止。
问题状态的生成
第一种状态生成方法:当前的E-结点R一旦生成一个新的儿子结点C,这个C结点就变成一个新的E-结点,当检测完了子树C后,R结点就再次成为E-结点,生成下一个儿子结点。(该方法也称为深度优先结点生成法)
第二种状态生成方法:一个E-结点一直保持到变成死结点为止。它又分为两种方法:宽度优先生成方法(队列方法)和D-检索方法(栈方法)
第一种状态生成方法对应回溯法(加限界的深度优先生成方法)。
第二种状态生成方法对应分枝-限界法。
回溯算法的形象化描述
算法8.1 回溯的一般方法
BACKTRACK
算法8.2 递归回溯算法
RBACKTRACK
4皇后问题
解空间树:
xi:代表第i个皇后位于第xi列。
子集和数问题
子集和的解形式:
-
n元组:
-
n元组的解空间树:
-
k元组:
-
k元组的解空间树:
效率估计
回溯算法的效率主要取决于4个因素:
- 生成下一个X(k)的时间(生成结点的时间)
- 满足显式约束条件的X(k)的数目(子结点的数量)
- 限界函数Bi的计算时间(检验结点的时间)
- 满足Bi的X(k)的数目(通过检验的结点数量)
一旦选定了一种状态空间树结构,前三种因素与所要解决问题的实例无关,只有第四种因素,对于问题的不同实例,生成的通过检验的结点数是不相同的。
易知,回溯算法最坏情况下
的时间复杂度为O(p(n)2n)或O(q(n)n的阶乘),其中p(n)和q(n)为n的多项式。
蒙特卡罗方法进行效率估计
算法8.3 估计回溯法的效率
ESTIMATE
8皇后问题
对于判断任两个皇后是否在同一斜对角线的判定
:设有两个皇后被放置在(i, j )和(k, l )位置上, 那么当且仅当
i-j = k-l 或 i+j = k+l 时, 它们才在同一条斜角线上。将这两个等式分别变换成: j-l = i-k 或 j-l = k-i 。因此当且仅当 |j-l|=|i-k| 时( 即两个皇后所在位置的行差距等于列差距时),两个皇后在同一条斜角线上。
算法8.4 可以放置一个新皇后吗
PLACE
算法8.5 n-皇后问题的所有解
估算NQUEENS所生成结点数
要会求状态空间树的结点总数和不受限的结点总数。