ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:178.35KB ,
资源ID:8511337      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8511337.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(分支限界法实验单源最短路径.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

分支限界法实验单源最短路径.docx

1、分支限界法实验单源最短路径算法分析与设计实验报告第 七 次实验姓名学号班级时间12.26上午地点工训楼309 实验名称分支限界法实验(单源最短路径)实验目的1. 掌握并运用分支限界法的基本思想2. 运用分支限界法实现单源最短路径问题实验原理问题描述:在下图所给的有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径。基本思想:下图是用优先队列式分支限界法解有向图G的单源最短路径问题产生的解空间树。其中,每一个结点旁边的数字表示该结点所对应的当前路长。为了加速搜索的进程,应采用有效地方式选择活结点进行扩展。按照优先队列中规定的优先级选取优先级最高的结点成为当前扩展结点

2、。实验步骤(1)算法从图 G 的源顶点 s 和空优先队列开始。结点 s 被扩展后,它的儿子 结点被依次插入堆中;(2)算法每次从堆中取出具有最小当前路长的结点作为当前扩展结点, 并依 次检查与当前扩展结点相邻的所有顶点;(3)如果从当前扩展结点 i 到 j 有边可达,且从源出发,途经 i 再到 j 的所相应路径长度,小于当前最优路径长度,则将该顶点作为活结点插入到活结 点优先队列中;(4)结点扩展过程一直继续到活结点优先队列为空时为止。关键代码/单源最短路径问题的优先队列式分支限界法templatevoid Graph:shortest_path(int v) /定义最小堆的容量为1000 M

3、inHeapMinHeapNode H(1000); /定义源为初始扩展结点 MinHeapNode E; /初始化源结点 E.i=v; E.length=0; distv=0; while(true) /搜索问题的解空间 for(int j=1;j=n;j+) if(cE.ij!=0)&(E.length+cE.ijdistj) /顶点i到顶点j可达,且满足控制约束 /顶点i和j之间有边,且此路径小于原先从源点到j的路径长度 distj=E.length+cE.ij; /更新dist数组 prevj=E.i; /加入活结点优先队列 MinHeapNode N; N.i=j; N.length

4、=distj; H.Insert(N); /插入到最小堆中 try H.DeleteMin(E); / 取下一扩展结点 catch (int) break; if(H.currentsize=0) /优先队列空 break; 测试结果上述有向图的结果: 实验分析在实验中并没有生成多组数据,进行比较,也没有利用随机生成函数,因为在这种有实际有关联的问题中,利用随机生成函数生成的数据是十分的不合适的,在此我们只需要验证该程序是否正确即可。分支限界法求单源最短路径问题与回溯法求单源最短路径问题其大致思想是一致的,都是利用解空间树,搜索子集树,回溯法是利用深度优先搜索子集树,而分支限界法是利用广度优先

5、搜索子集树,然后利用队列或优先队列,最小堆存放可扩展的结点,然后将活结点出堆,从而直到堆空为止,找到最优解。实验心得在这一章的分支限界法中,与上一章的回溯法很相似,都是利用解空间树进行搜索,从而找到最优解。不同的是回溯法利用的是深度优先回溯寻找,能够找到所有的最优解;而分支限界法则是利用广度优先搜索子集树或者排序树,利用队列或者优先级队列的数据结构组织所有满足的结点,这样只要找到一种最优解就可以了,想对于回溯法来说时间上相对利用的没有那么多。在这一章的学习上,由于会利用最小堆/最大堆,所以代码看起来比较复杂,堆的实现也比较复杂,这是这一章我学习的一个难点,不过正在渐渐攻克。实验得分助教签名附录

6、:完整代码(分支限界法)Shorest_path.cpp/单源最短路径问题 分支限界法求解#include#include#include#includeMinHeap2.husing namespace std;templateclass Graph /定义图类 friend int main();public: void shortest_path(int);private: int n, /图的顶点数 *prev; /前驱顶点数组 Type *c, /图的邻接矩阵 *dist; /最短距离数组;templateclass MinHeapNode /最小堆中的元素类型为MinHeapNod

7、e friend Graph;public: operator int() constreturn length;private: int i; /顶点编号 Type length; /当前路长; /单源最短路径问题的优先队列式分支限界法templatevoid Graph:shortest_path(int v) MinHeapMinHeapNode H(1000);/定义最小堆的容量为1000 /定义源为初始扩展结点 MinHeapNode E; /初始化源结点 E.i=v; E.length=0; distv=0; while(true)/搜索问题的解空间 for(int j=1;j=n

8、;j+) if(cE.ij!=0)&(E.length+cE.ijdistj) /顶点i到顶点j可达,且满足控制约束 /顶点i和j之间有边,且此路径小于原先从源点i到j的路径长度 distj=E.length+cE.ij;/更新dist数组 prevj=E.i; /加入活结点优先队列 MinHeapNode N; N.i=j; N.length=distj; H.Insert(N);/插入到最小堆中 try H.DeleteMin(E); / 取下一扩展结点 catch (int) break; if(H.currentsize=0)/优先队列空 break; int main() int n

9、=11; int prev12=0,0,0,0,0,0,0,0,0,0,0,0;/初始化前驱顶点数组 int dist12=1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000;/初始化最短距离数组 cout单源图的邻接矩阵如下:endl; int *c=new int*n+1; for(int i=1;i=n;i+) /输入图的邻接矩阵 ci=new intn+1; for(int j=1;jcij; int v=1; /源结点为1 Graph G; G.n=n; G.c=c; G.dist=dist; G.prev=prev

10、; clock_t start,end,over; /计算程序运行时间的算法 start=clock(); end=clock(); over=end-start; start=clock(); G.shortest_path(v);/调用图的最短路径查找算法/输出从源结点到目的结点的最短路径 cout从S到T的最短路长是:dist11endl; for(int i=2;i=n;i+)/输出每个结点的前驱结点 coutprev(i)=previ endl; for(int i=2;i=n;i+) /输出从源结点到其他结点的最短路径长度 cout从1到i的最短路长是:distiendl; for

11、(int i=1;i=n;i+) /删除动态分配时的内存 delete ci; delete c; c=0; end=clock(); printf(The time is %6.3f,(double)(end-start-over)/CLK_TCK); /显示运行时间 coutendl; system(pause); return 0;MinHeap.h#includetemplateclass Graph;templateclass MinHeap /最小堆类 template friend class Graph;public: MinHeap(int maxheapsize=10);

12、/构造函数,堆的大小是10 MinHeap()delete heap; /最小堆的析构函数 int Size() constreturn currentsize; /Size()返回最小堆的个数 T Max()if(currentsize) return heap1; /第一个元素出堆 MinHeap& Insert(const T& x); /最小堆的插入函数 MinHeap& DeleteMin(T& x); /最小堆的删除函数 void Initialize(T x,int size,int ArraySize); /堆的初始化 void Deactivate(); void outpu

13、t(T a,int n);private: int currentsize,maxsize; T *heap; ;templatevoid MinHeap:output(T a,int n) /输出函数,输出a数组的元素 for(int i=1;i=n;i+) coutai ; coutendl;templateMinHeap:MinHeap(int maxheapsize) maxsize=maxheapsize; heap=new Tmaxsize+1; /创建堆 currentsize=0;templateMinHeap& MinHeap:Insert(const T& x) if(cu

14、rrentsize=maxsize) /如果堆中的元素已经等于堆的最大大小 return *this; /那么不能在加入元素进入堆中 int i= +currentsize; while(i!=1 & xheapi/2) heapi=heapi/2; i/=2; heapi=x; return *this;templateMinHeap& MinHeap:DeleteMin(T& x) /删除堆顶元素 if(currentsize=0) coutEmpty heap!endl; return *this; x=heap1; T y=heapcurrentsize-; int i=1,ci=2;

15、 while(ci=currentsize) if(ciheapci+1) ci+; if(y=heapci) break; heapi=heapci; i=ci; ci*=2; heapi=y; return *this;templatevoid MinHeap:Initialize(T x,int size,int ArraySize) /堆的初始化 delete heap; heap=x; currentsize=size; maxsize=ArraySize; for(int i=currentsize/2;i=1;i-) T y=heapi; int c=2*i; while(c=currentsize) if(cheapc+1) c+; if(y=heapc) break; heapc/2=heapc; c*=2; heapc/2=y; templatevoid MinHeap:Deactivate() heap=0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1