回溯法 -数据结构与算法

1.回溯法算法思想:定义: 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。1、回溯法适用:有许多问题,当需要找出它的解集(全部解)或者要求回答什么解是满足某些约束条件的...
摘要由CSDN通过智能技术生成


1.回溯法算法思想:

定义:

        回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

1、回溯法适用:有许多问题,当需要找出它的解集(全部解)或者要求回答什么解是满足某些约束条件的最优解时,往往要使用回溯法。

2、有组织的穷举式搜索:回溯法的基本做法是搜索或者有的组织穷尽搜索。它能避免搜索所有的可能性。即避免不必要的搜索。这种方法适用于解一些组合数相当大的问题。

3、搜索解空间树:回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含(剪枝过程),则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。

为了实现回溯,我们先弄明白以下两个问题:

1)首先应该明确问题的解空间。

2)其次是组织解空间以便它能用以被搜索到。


2. 问题的解空间 和空间树

        这个空间必须至少包含一个解(可能是最优的)。 一个复杂问题的解决往往由多部分构成,即,一个大的解决方案可以看作是由若干个小的决策组成。很多时候它们构成一个决策序列。解决一个问题的所有可能的决策序列构成该问题的解空间。解空间中满足约束条件的决策序列称为可行解。一般说来,解任何问题都有一个目标,在约束条件下使目标值达到最大(或最小)的可行解称为该问题的最优解。在解空间中,前k项决策已经取定的所有决策序列之集称为k定子解空间。0定子解空间即是该问题的解空间。    

      问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。

    解空间的确定与我们对问题的描述有关。如何组织解空间的结构会直接影响对问题的求解效率。这是因为回溯方法的基本思想是通过搜索解空间来找到问题所要求的解。一般地,可以用一棵树来描述解空间,称为解空间树
       当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集合树。此时,解空间有个元素,遍历子集树的任何算法均需的计算时间。

如例:定和子集问题: 已知一个正实数的集合P= {W1,w2, ... Wn}和另一个正实数M.试求P的所有子集S,使得S中的数之和等于M。这个问题的解可以表

示成0/1数组{x1,x2,…,xn},依据W1是否属于S, X1分别取值1或0。故解空间中共有个元素。它的树结构是一棵完整二叉树。 

当所给的问题是确定n个元素的满足某种性质的排列时,相应的解空间树称为排列树,此时,解空间有个元素。遍历排列树的任何算法均需的计算时间,均需的计算时间。


我们把这个例子逐一解析:

问题的解向量:问题的解能够表示成一个n元式(x1,x2,…,xn)的形式。

显约束:对分量xi的取值限定。

隐约束:为满足问题的解而对不同分量之间施加的约束。

解空间:对于问题的一个实例,解向量满足显式约束条件的所有多元组,构成了该实例的一个解空间。

注意:同一个问题可以有多种表示,有些表示方法更简单,所需表示的状态空间更小(存储量少,搜索方法简单)。

下面是n=3时的0-1背包问题用完全二叉树表示的解空间:


       为了叙述方便,引进一些关于解空间树结构的术语。解空间树上的每个节点确定求解问题的一个问题状态,它由一条从根到该节点的路径描述。由根到所有其它节点的路径描述了这个问题的状态空间。解状态是这样一些问题状态S,对于这些问题状态,由根到S的那条路径确定了解空间的一个元组。即答案状态是这样的一些解状态S,对于这些解状态而言,由根到S的这条路径确定了这个问题的一个解(即可行解),解空间的树结构称为状态空间树

      确定了解空间的组织结构后,回溯法就从初始节点(解空间树的根节点)出发,以深度优先的方式搜索整个解空间。这个开始节点就成为一个活节点,同时也成为当前的扩展节点。在当前扩展节点处,搜索向纵深方向移至一个新节点。这个新节点就成为一个新的活节点,并且成为当前的扩展节点。如果在当前的扩展节点处不能再向纵深方向搜索,则当前的扩展节点就成为死节点。此时应往回移动(回溯)至最近一个活节点处,并使这个活节点成为当前扩展节点。如此继续。回溯法就是以这种工作方式递归地在解空间中搜索,直至找到要求的解或解空间中已无活节点时为止。 

       事实上,当我们将问题的有关数据以一定的数据结构存储好以后(例如,旅行商问题存储赋权图的邻接矩阵、定和子集问题是存储已知的n+1个数、4皇后问题用整数对(i,j)表示棋盘上各个位置,不必先建立一个解空间树),就搜索生成解空间树的一部分或全部,并寻找所需要的解。也就是说,对于实际问题不必生成整个状态空间树,然后在整个解空间中搜索,我们只需有选择地搜索。为了使搜索更加有效,常常在搜索过程中加一些判断以决定搜索是否该终止或改变路线。通常采用两种策略来避免无效的搜索,提高回溯法的搜索效率:

其一是使用约束函数,在扩展节点处剪去不满足约束的子树;

其二是用限界函数, “剪去”不能达到最优解的子树。

这两种函数统称为剪枝函数。

总结:

扩展结点:一个正在产生儿子的结点称为扩展结点

活结点:一个自身已生成但其儿子还没有全部生成的节点称做活结点

死结点:一个所有儿子已经产生的结点称做死结点

深度优先的问题状态生成法:如果对一个扩展结点R,一旦产生了它的一个儿子C,就把C当做新的扩展结点。在完成对子树C(以C为根的子树)的穷尽搜索之后,将R重新变成扩展结点,继续生成R的下一个儿子(如果存在)

宽度优先的问题状态生成法:在一个扩展结点变成死结点之前,它一直是扩展结点。

回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(bounding function)来处死(剪枝)那些实际上不可能产生所需解的活结点,以减少问题的计算量。具有限界函数的深度优先生成法称为回溯法。(回溯法 = 穷举 +</

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值