深度优先搜索方案.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
深度优先搜索 一、搜索过程 深度优先搜索的搜索过程类似树的先序遍历,也叫回溯法。搜索过程如下: 从源节点开始发现有一节点v,如果v还有未探测到的边,就沿此边继续探测下去,当节点v的所有边都被探测过,搜索过程将回溯到最初发现v点的源节点。这一过程一直进行到已发现从源节点可达的所有节点为止。这显然是一个递归过程。 为了在遍历过程中区分顶点是否被访问,往往可以引入一个数组,如以mark[1..n]作为标记。数组的元素取0和1,初值为0。当节点被访问时,与节点相应得数组元素为1,每次访问节点时,都得先检查它的标记值,找0值得节点访问,并深度继续。深度大的先得到扩展,具有“后产生先扩展”的特点,因此在数据结构上采用堆栈来存储(新节点入栈,节点不能扩展时,栈定出栈)。 二、搜索特点 由于深度搜索过程中有保留已扩展节点,则不致于重复构造不必要的子树系统。 深度优先搜索并不是以最快的方式搜索到解,因为若目标节点在第i层的某处,必须等到该节点左边所有子树系统搜索完毕之后,才会访问到该节点,因此,搜索效率还取决于目标节点在解答树中的位置。 由于要存储所有已被扩展节点,所以需要的内存空间往往比较大。 深度优先搜索所求得的是仅仅是目前第一条从起点至目标节点的树枝路径,而不是所有通向目标节点的树枝节点的路径中最短的路径。 适用范围:适用于求解一条从初始节点至目标节点的可能路径的试题。若要存储所有解答路径,可以再建立其它空间,用来存储每个已求得的解。若要求得最优解,必须记下达到目前目标的路径和相应的路程值,并与前面已记录的值进行比较,保留其中最优解,等全部搜索完成后,把保留的最优解输出。 三、算法描述 1、算法数据结构描述: 深度优先搜索时,最关键的是结点扩展(OPEN)表的生成,它是一个栈,用于存放目前搜索到待扩展的结点,当结点到达深度界限或结点不能再扩展时,栈顶结点出栈,放入CLOSE表(存放已扩展节点),继续生成新的结点入栈OPEN表,直到搜索到目标结点或OPEN栈空为止。具体算法如下: ① 把起始结点S放到非扩展结点OPEN表中(后进先出的堆栈),如果此结点为一目标结点,则得到一个解。OPEN为一空表,则搜索失败退出。OPEN表最前面(栈顶)的结点,并把它放入CLOSED的扩展结点表中,并冠以顺序编号n。 ⑤ 否则,扩展结点n,产生其全部子结点,把它们放入OPEN表的前头(入栈),并配上指向n的返回指针;如果没有后裔,则转向2。   递归过程为:   Procedure DEF-GO(step)    for i:=1 to max do     if 子结点符合条件 then       if 子结点是目标结点 then 输出 else DEF-GO(step+1);      endif; enddo;   Program DFS;    DEF-GO(1);   Program DEF(step); step:=0; repeat   step:=step+1; j:=0;p:=false repeat     j:=j+1; if 结点符合条件 then      产生子结点入栈;       if 子结点是目标结点 then 输出 else p:=true; else       if j=max then 回溯 p:=false; endif; until p=true; until step=0;   Procedure BACK; step:=step-1; if step0 then 栈顶结点出栈 else p:=true;--已知8个数的起始状态如图1(a),要得到目标状态为图1(b)。        1 6 4             8 ■ 4        7 ■ 5              7 6 5         (a)               (b) 图1 求解时,首先要生成一棵结点的搜索树,按照深度优先搜索算法,我们可以生成图2的搜索树。图中,所有结点都用相应的数据库来标记,并按照结点扩展的顺序加以编号。其中,我们设置深度界限为5。粗线条路径表示求得的一个解。从图中可见,深度优先搜索过程是沿着一条路径进行下去,直到深度界限为止,回溯一步,再继续往下搜索,直到找到目标状态或OPEN表为空为止。 图 2图2设置深度界限为5A,B,C,D,E五人从事J1,J2,J3,J4,J5五项工作,每人只能从事一项,他们的效益如下 图 3 分析:每人选择五项工作中的一项,在各种选择的组合中,找到效益最高的的一种组合输出。 :   ⒈数据库:用数组f构成堆栈存放产生的结点;数组g存放当前最高效益结点的组合;数组p作为结点是否选择过的标志位。   ⒉结点的产生:   (1)选择p(i)=0的结点

文档评论(0)

骨干 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档