第5章 搜索法.ppt

  1. 1、本文档共110页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章搜索法重点讲义

算法设计与分析 授课教师:王秋芬 办公地点:7307 Email: w_qiufen@163.com 第五章 搜索法 教学目标 掌握回溯法的算法框架 理解回溯法及分支限界法的基本思想 掌握回溯法及分支限界法的异同 掌握子集树、排列树及满m叉树的算法设计模式 通过实例学习,掌握回溯法及分支限界法解决问题的方法步骤 5.1 穷举搜索 思想 针对问题的可能解是有限种的情况,逐一检查所有可能的情况,从中找到问题真正的解。 示列 给定一个有向带权图G=(V,E),权非负,如图5-1所示。找出顶点1→5的最短路径及其长度。 问题分析 该问题所有可能的路径只有三条,分别是: 1→2→4→5 1→3→4→5 1→4→5 采用穷举搜索的方法逐一检查这三条路径的长度。 最短路径为1→2→4→5,其长度为3。 5.2深度优先搜索 思想(给定图G=(V,E)) 初始时,所有顶点均未被访问过,任选一个顶点v作为源点。该方法先访问源点v,并将其标记为已访问过;然后从v出发,选择v的一个邻接点(子结点)w,如果w已访问过,则选择v的另外一个邻接点;如果w未被访问过,则标记w为已访问过,并以w为新的出发点,继续进行深度优先搜索;如果w及其子结点均已搜索完毕,则返回到v,再选择它的另外一个未曾访问过的邻接点继续搜索,直到图中所有和源点有路径相通的顶点均已访问过为止;若此时图G中仍然存在未被访问过的顶点,则另选一个尚未访问过的顶点作为新的源点重复上述过程,直到图中所有顶点均已访问过为止。 示例: 给定一个有向图G=(V,E),如图5-2所示。给出深度优先搜索该图的一个访问序列。 输出一个深度优先搜索序列:1,2,5,3,4,6,7 练习 给定一个无向图G=(V,E),如图5-4所示。给出深度优先搜索该图的一个搜索序列。 算法描述 //标记图中顶点是否被访问过 bool Visited[n+1]; for(int i=1;i=n;i++) Visited[i]=0;//用0表示顶点未被访问过 //从顶点k出发进行深度优先搜索 Dfsk(int k) { Visited[k]=1;//标记顶点k已被访问过 for(int j=1;j=n;j++) if(c[k][j]==1 Visited[j]==0)//c[][]是图G对应的邻接矩阵 Dfsk(j); } //深度优先搜索整个图G Dfs() { for(int i=1;i=n;i++) if(Visited[i]==0) Dfsk(i); } 5.3回溯法 回溯法是在仅给出初始结点、目标结点及产生子结点的条件(一般由问题题意隐含给出)的情况下,构造一个图(隐式图),然后按照深度优先搜索的思想,在有关条件的约束下扩展到目标结点,从而找出问题的解。 通俗地讲:回溯法是一种“能进则进,进不了则换,换不了则退”的基本搜索方法 用约束函数在扩展结点处剪去不满足约束的子树即:导致不可行解的结点; 用限界函数剪去得不到最优解的子树。即:导致非最优解的结点。 几个名词 扩展结点:一个正在产生儿子的结点称为扩展结点 活结点:一个自身已生成但其儿子还没有全部生成的节点称做活结点 死结点:一个所有儿子已经产生的结点称做死结点 搜索树:搜索过程中动态形成的树 回溯法的基本思想 从根开始,以深度优先搜索的方式进行搜索。 根结点是活结点并且是当前的扩展结点。在搜索的过程中,当前的扩展结点向纵深方向移向一个新结点,判断该新结点是否满足隐约束。 如果满足,则新结点成为活结点,并且成为当前的扩展结点,继续深一层的搜索; 如果不满足,则换该新结点的兄弟结点(扩展结点的其它分支)继续搜索; 如果新结点没有兄弟结点,或其兄弟结点已全部搜索完毕,则扩展结点成为死结点,搜索回溯到其父结点处继续进行。 搜索过程直到找到问题的解或根结点变成死结点为止。 5.3.2子集树 当所给的问题是从n个元素组成的集合S中找出满足某种性质的一个子集时,相应的解空间树称为子集树。 此类问题解的形式为n元组(x1,x2,…,xn),分量xi(i=1,2,…,n)表示第i个元素是否在要找的子集中。 xi的取值为0或1,xi=0表示第i个元素不在要找的子集中;xi=1表示第i个元素在要找的子集中。 树的根结点:初始状态 中间结点:某种情况下的中间状态 叶子结点:结束状态 分支:从一个状态过渡到另一个状态的行为 从根结点到叶子结点的路径:一个可能的解(一个子集) 子集树的深度:等于问题的规模。 子集树的算法模式 void Backtrack (int t) { if (tn) output(x); if(constraint(t))//判断能否沿着扩展结点的左分

文档评论(0)

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

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

1亿VIP精品文档

相关文档