分支限界法实验(单源最短路径)讲解.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法分析与设计实验报告 第 七 次实验 姓名 学号 班级 时间 12.26上午 地点 工训楼309 实验名称 分支限界法实验(单源最短路径) 实验目的 掌握并运用分支限界法的基本思想 运用分支限界法实现单源最短路径问题 实验原理 问题描述: 在下图所给的有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径。下图是用优先队列式分支限界法解有向图G的单源最短路径问题产生的解空间树。其中,每一个结点旁边的数字表示该结点所对应的当前路长。为了加速搜索的进程,应采用有效地方式选择活结点进行扩展。按照优先队列中规定的优先级选取优先级最高的结点成为当前扩展结点。 实验步骤 (1)算法从图 G 的源顶点 s 和空优先队列开始。结点 s 被扩展后,它的儿子 结点被依次插入堆中; (2)算法每次从堆中取出具有最小当前路长的结点作为当前扩展结点, 并依 次检查与当前扩展结点相邻的所有顶点; (3)如果从当前扩展结点 i 到 j 有边可达,且从源出发,途经 i 再到 j 的所相应路径长度,小于当前最优路径长度,则将该顶点作为活结点插入到活结 点优先队列中; (4)结点扩展过程一直继续到活结点优先队列为空时为止。 关键代码 //单源最短路径问题的优先队列式分支限界法 templateclass Type void GraphType::shortest_path(int v) {//定义最小堆的容量为1000 MinHeapMinHeapNodeType H(1000); //定义源为初始扩展结点 MinHeapNodeType E; //初始化源结点 E.i=v; E.length=0; dist[v]=0; while(true)//搜索问题的解空间 { for(int j=1;j=n;j++) if((c[E.i][j]!=0)(E.length+c[E.i][j]dist[j])) { //顶点i到顶点j可达,且满足控制约束 //顶点i和j之间有边,且此路径小于原先从源点到j的路径长度 dist[j]=E.length+c[E.i][j];//更新dist数组 prev[j]=E.i; //加入活结点优先队列 MinHeapNodeType N; N.i=j; N.length=dist[j]; H.Insert(N);//插入到最小堆中 } try { H.DeleteMin(E); // 取下一扩展结点 } catch (int) { break; } if(H.currentsize==0)//优先队列空 { break; } } } 上述有向图的结果: 实验分析 在实验中并没有生成多组数据,进行比较,也没有利用随机生成函数,因为在这种有实际有关联的问题中,利用随机生成函数生成的数据是十分的不合适的,在此我们只需要验证该程序是否正确即可。分支限界法求单源最短路径问题与回溯法求单源最短路径问题其大致思想是一致的,都是利用解空间树,搜索子集树,回溯法是利用深度优先搜索子集树,而分支限界法是利用广度优先搜索子集树,然后利用队列或优先队列,最小堆存放可扩展的结点,然后将活结点出堆,从而直到堆空为止,找到最优解。 实验心得 在这一章的分支限界法中,与上一章的回溯法很相似,都是利用解空间树进行搜索,从而找到最优解。不同的是回溯法利用的是深度优先回溯寻找,能够找到所有的最优解;而分支限界法则是利用广度优先搜索子集树或者排序树,利用队列或者优先级队列的数据结构组织所有满足的结点,这样只要找到一种最优解就可以了,想对于回溯法来说时间上相对利用的没有那么多。在这一章的学习上,由于会利用最小堆/最大堆,所以代码看起来比较复杂,堆的实现也比较复杂,这是这一章我学习的一个难点,不过正在渐渐攻克。 实验得分 助教签名 附录: 完整代码(分支限界法) Shorest_path.cpp //单源最短路径问题 分支限界法求解 #includeiostream #includetime.h #includeiomanip #includeMinHeap2.h using namespace std; templateclass Type class Graph //定义图类 { friend int main(); public: void shortest_path(int); private: int n, //图的顶数 *prev; //前驱顶点

文档评论(0)

shuwkb + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档