【S8-回溯法】

回溯法

回溯算法主要针对于**搜索问题**或优化问题,这类问题的满足显示约束)尝分布在一个解空间中,因此也就是在解空间中找到一个可行解(最优解)或者所有的可行解(最优解)。
回溯算法通常将此搜索空间看作一定的树形结构,称之为解空间树,采用一种“走不通就掉头的搜索策略”,相当于从根节点开始对解空间树进行深度优先搜索,。

回溯法的基本概念

回溯法的解需要满足一组综合的约束条件,通常分为:显式约束隐式约束

  • 显式约束条件: 限定每个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所生成结点数

在这里插入图片描述
要会求状态空间树的结点总数不受限的结点总数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ImSev7en_1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值