算法(4)回溯法

深度优先搜索是在明确给出了图中的各顶点及边(显式图)的情况下,按照深度优先搜索的思想对图中的每个顶点进行搜索,最终得出图的结构信息。
回溯法是在仅给出初始结点、目标结点及产生子结点的条件(一般由问题题意隐含给出)的情况下,构造一个图(隐式图),然后按照深度优先搜索的思想,在有关条件的约束下扩展到目标结点,从而找出问题的解。换言之,回溯法从初始状态出发,在隐式图中以深度优先的方式搜索问题的解。当发现不满足求解条件时,就回溯,尝试其他路径。通俗地讲,回溯法是一种“能进则进,进不了则换,换不了则退”的基本搜索方法。

搜索问题的解空间树的相关结点:
(1)扩展结点:一个正在生成孩子的结点称为扩展结点。
(2)活结点:一个自身已生成但其孩子还没有全部生成的结点称为活结点。
(3)死结点:一个所有孩子已经生成的结点称做死结点。

搜索思想:
从根开始,以深度优先搜索的方式进行搜索。根结点是活结点并且是当前的扩展结点。在搜索过程中,当前的扩展结点沿纵深方向移向一个新结点,判断该新结点是否满足隐约束,如果满足,则新结点成为活结点,并且成为当前的扩展结点,继续深一层的搜索;如果不满足,则换到该新结点的兄弟结点(扩展结点的其他分支)继续搜索;如果新结点没有兄弟结点,或其兄弟结点已全部搜索完毕,则扩展结点成为死结点,搜索回溯到其父结点处继续进行。搜索过程直到找到问题的解或根结点变成死结点为止。

从回溯法的搜索思想可知,搜索开始之前必须确定问题的隐约束。隐约束一般是考察解空间结构中的结点是否有可能得到问题的可行解或最优解。如果不可能得到问题的可行解或最优解,就不用沿着该结点的分支继续搜索了,需要换到该结点的兄弟结点或回到上一层结点。也就是说,在深度优先搜索的过程中,不满足隐约束的分支被剪掉,只沿着满足隐约束的分支搜索问题的解,从而避免了无效搜索,加快了搜索速度。因此,隐约束又称为剪枝函数。隐约束(剪枝函数)一般有两种:一是判断是否能够得到可行解的隐约束,称之为约束条件(约束函数);二是判断是否有可能得到最优解的隐约束,称之为限界条件(限界函数)。可见,回溯法是一种具有约束函数或限界函数的深度优先搜索方法。

总之,回溯法的算法框架主要包括三部分:
(1)针对所给问题,定义问题的解空间。
(2)确定易于搜索的解空间组织结构。
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

用回溯法解决4皇后问题
步骤1:定义问题的解空间。
设4皇后问题解的形式是4元组(x1,x2,x3,x4),其中xi(i=1,2,3,4)代表第i个皇后放置在第i行第xi列,xi的取值为1,2,3,4。
步骤2:确定解空间的组织结构。
确定显约束:第i个皇后和第j个皇后不同行,即i≠j。
步骤3:搜索解空间。
(1)确定约束条件。第i个皇后和第j个皇后不同列且不同斜线,即:xi≠xj,并且|i-j|≠|xi-xj|。
(2)确定限界条件。该问题不存在放置方案是否好坏的情况,所以不需要设置限界条件。
(3)搜索过程。根结点A是活结点,也是当前的扩展结点。扩展结点A沿着x1=1的分支生成孩子结点B,结点B满足隐约束,B成为活结点,并成为当前的扩展结点。扩展结点B沿着x2=1,x2=2的分支生成的孩子结点不满足隐约束,舍弃;沿着x2=3的分支生成的孩子结点C满足隐约束,C成为活结点,并成为当前的扩展结点。扩展结点C沿着所有分支生成的孩子结点均不满足隐约束,全部舍弃,活结点C变成死结点。开始回溯到离它最近的活结点B,结点B再次成为扩展结点。扩展结点B沿着x2=4的分支继续生成的孩子结点D满足隐约束,D成为活结点,并成为当前的扩展结点。扩展结点D沿着x3=1的分支生成的孩子结点不满足隐约束,舍弃;沿着x3=2的分支生成的孩子结点E满足隐约束,E成为活结点,并成为当前的扩展结点。扩展结点E沿着所有分支生成的孩子结点均不满足隐约束,全部舍弃,活结点E变成死结点。开始回溯到最近的活结点D,D再次成为扩展结点。扩展结点D沿着x3=3,x3=4的分支生成的孩子结点均不满足隐约束,舍弃,活结点D变成死结点。开始回溯到最近的活结点B,B再次成为扩展结点。此时扩展结点B的孩子结点均搜索完毕,活结点B成为死结点。开始回溯到最近的活结点A,结点A再次成为扩展结点。扩展结点A沿着x1=2的分支继续生成的孩子结点F满足隐约束,结点F成为活结点,并成为当前的扩展结点。扩展结点F沿着x2=1,2,3的分支生成的孩子结点均不满足隐约束,全部舍弃;继续沿着x2=4的分支生成的孩子结点G满足隐约束,结点G成为活结点,并成为当前的扩展结点。(如此类推…)
在这里插入图片描述
回溯法是一种带有约束函数或限界函数的深度优先搜索方法,搜索过程是在问题的解空间树中进行的。算法描述通常采用递归技术,也可以选用非递归技术。

注:参考书本《算法设计与分析》(由王秋芬、吕聪颖、周春光编著)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值