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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

0033算法笔记分支限界法分支限界法与单源最短路径问题.docx

1、0033算法笔记分支限界法分支限界法与单源最短路径问题1、分支限界法 (1)描述:采用广度优先产生状态空间树的结点,并使用剪枝函数的方法称为分枝限界法。 所谓“分支”是采用广度优先的策略,依次生成扩展结点的所有分支(即:儿子结点)。 所谓“限界”是在结点扩展过程中,计算结点的上界(或下界),边搜索边减掉搜索树的某些分支,从而提高搜索效率。 (2)原理:按照广度优先的原则,一个活结点一旦成为扩展结点(E-结点)R后,算法将依次生成它的全部孩子结点,将那些导致不可行解或导致非最优解的儿子舍弃,其余儿子加入活结点表中。然后,从活结点表中取出一个结点作为当前扩展结点。重复上述结点扩展过程,直至找到问题

2、的解或判定无解为止。 (3)分支限界法与回溯法 1)求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。 2)搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。 (4)常见的分支限界法 1)FIFO分支限界法(队列式分支限界法) 基本思想:按照队列先进先出(FIFO)原则选取下一个活结点为扩展结点。 搜索策略:一开始,根结点是唯一的活结点,根结点入队。从活结点队中取出根结点后,作为当前扩展结点。对当前扩展结点,先从左到右

3、地产生它的所有儿子,用约束条件检查,把所有满足约束函数的儿子加入活结点队列中。再从活结点表中取出队首结点(队中最先进来的结点)为当前扩展结点,直到找到一个解或活结点队列为空为止。 2)LC(least cost)分支限界法(优先队列式分支限界法) 基本思想:为了加速搜索的进程,应采用有效地方式选择活结点进行扩展。按照优先队列中规定的优先级选取优先级最高的结点成为当前扩展结点。 搜索策略:对每一活结点计算一个优先级(某些信息的函数值),并根据这些优先级;从当前活结点表中优先选择一个优先级最高(最有利)的结点作为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便尽快地找出一个最优解。再从活结点

4、表中下一个优先级别最高的结点为当前扩展结点,直到找到一个解或活结点队列为空为止。 (5)分支限界法搜索应用举例 1)0-1背包问题,当n=3时,w=16,15,15, p=45,25,25, c=30 队列式分支限界法(处理法则:先进先出):AB,CC,D,E(D是不可行解,舍弃)C,EE,F,GF,G,J,K(J是不可行解,舍弃)F,G,KG,K,L,MK,L,M,N,O 优先队列式分支限界法(处理法则:价值大者优先):AB,CC,D,EC,EC,J,KCF,GG,L,MG,MGN,OO 2)旅行员售货问题 队列式分支限界法(节点B开始): BC,D,ED,E,F,GE,F,G,H,IF,G

5、,H,I,J,KG,H,I,J,K,LH,I,J,K,L,MI,J,K,L,M,NJ,K,L,M,N,OK,L,M,N,O,PL,M,N,O,P,QM,N,O,P,QN,O,P,QO,P,QP,QQ 优先队列式分支限界法:优先级是结点的当前费用: BC,D,EC,D,J,KC,J,K,H,IC,J,K,I,NC,K,I,N,PC,I,N,P,QC,N,P,Q,OC,P,Q,OC,Q,OQ,O,F,GQ,O,G,LQ,O,L,MO,L,MO,MM 2、单源最短路径问题 问题描述 在下图所给的有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径。 下图是用优先队列式分

6、支限界法解有向图G的单源最短路径问题产生的解空间树。其中,每一个结点旁边的数字表示该结点所对应的当前路长。 算法设计 算法从图G的源顶点s和空优先队列开始。结点s被扩展后,它的儿子结点被依次插入堆中。此后,算法从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点。如果从当前扩展结点i到顶点j有边可达,且从源出发,途经顶点i再到顶点j的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中。这个结点的扩展过程一直继续到活结点优先队列为空时为止。 在算法扩展结点的过程中,一旦发现一个结点的下界不小于当前找到的最短路长,则算法剪去以该结

7、点为根的子树。 在算法中,利用结点间的控制关系进行剪枝。从源顶点s出发,2条不同路径到达图G的同一顶点。由于两条路径的路长不同,因此可以将路长长的路径所对应的树中的结点为根的子树剪去。 算法具体代码如下: 1、MinHeap2.hcppview plaincopy1. #include2. 3. template4. classGraph;5. 6. template7. classMinHeap8. 9. template10. friendclassGraph;11. public:12. MinHeap(intmaxheapsize=10);13. MinHeap()deleteheap

8、;14. 15. intSize()constreturncurrentsize;16. TMax()if(currentsize)returnheap1;17. 18. MinHeap&Insert(constT&x);19. MinHeap&DeleteMin(T&x);20. 21. voidInitialize(Tx,intsize,intArraySize);22. voidDeactivate();23. voidoutput(Ta,intn);24. private:25. intcurrentsize,maxsize;26. T*heap;27. ;28. 29. templa

9、te30. voidMinHeap:output(Ta,intn)31. 32. for(inti=1;i=n;i+)33. coutai;34. coutendl;35. 36. 37. template38. MinHeap:MinHeap(intmaxheapsize)39. 40. maxsize=maxheapsize;41. heap=newTmaxsize+1;42. currentsize=0;43. 44. 45. template46. MinHeap&MinHeap:Insert(constT&x)47. 48. if(currentsize=maxsize)49. 50

10、. return*this;51. 52. inti=+currentsize;53. while(i!=1&xheapi/2)54. 55. heapi=heapi/2;56. i/=2;57. 58. 59. heapi=x;60. return*this;61. 62. 63. template64. MinHeap&MinHeap:DeleteMin(T&x)65. 66. if(currentsize=0)67. 68. coutEmptyheap!endl;69. return*this;70. 71. 72. x=heap1;73. 74. Ty=heapcurrentsize-

11、;75. inti=1,ci=2;76. while(ci=currentsize)77. 78. if(ciheapci+1)79. 80. ci+;81. 82. 83. if(y=heapci)84. 85. break;86. 87. heapi=heapci;88. i=ci;89. ci*=2;90. 91. 92. heapi=y;93. return*this;94. 95. 96. template97. voidMinHeap:Initialize(Tx,intsize,intArraySize)98. 99. deleteheap;100. heap=x;101. cur

12、rentsize=size;102. maxsize=ArraySize;103. 104. for(inti=currentsize/2;i=1;i-)105. 106. Ty=heapi;107. intc=2*i;108. while(c=currentsize)109. 110. if(cheapc+1)111. c+;112. if(y=heapc)113. break;114. heapc/2=heapc;115. c*=2;116. 117. heapc/2=y;118. 119. 120. 121. template122. voidMinHeap:Deactivate()12

13、3. 124. heap=0;125. 2、6d2.cppcppview plaincopy1. /单源最短路径问题分支限界法求解2. #includestdafx.h3. #includeMinHeap2.h4. #include5. #include6. usingnamespacestd;7. 8. ifstreamfin(6d2.txt);9. 10. template11. classGraph12. 13. friendintmain();14. public:15. voidShortesPaths(int);16. private:17. intn,/图G的顶点数18. *pr

14、ev;/前驱顶点数组19. Type*c,/图G的领接矩阵20. *dist;/最短距离数组21. ;22. 23. template24. classMinHeapNode25. 26. friendGraph;27. public:28. operatorint()constreturnlength;29. private:30. inti;/顶点编号31. Typelength;/当前路长32. ;33. 34. template35. voidGraph:ShortesPaths(intv)/单源最短路径问题的优先队列式分支限界法36. 37. MinHeapMinHeapNodeH(

15、1000);38. MinHeapNodeE;39. 40. /定义源为初始扩展节点41. E.i=v;42. E.length=0;43. distv=0;44. 45. while(true)/搜索问题的解空间46. 47. for(intj=1;j=n;j+)48. if(cE.ij!=0)&(E.length+cE.ijdistj)49. 50. /顶点i到顶点j可达,且满足控制约束51. distj=E.length+cE.ij;52. prevj=E.i;53. 54. /加入活结点优先队列55. MinHeapNodeN;56. N.i=j;57. N.length=distj;

16、58. H.Insert(N);59. 60. try61. 62. H.DeleteMin(E);/取下一扩展结点63. 64. catch(int)65. 66. break;67. 68. if(H.currentsize=0)/优先队列空69. 70. break;71. 72. 73. 74. 75. intmain()76. 77. intn=11;78. intprev12=0,0,0,0,0,0,0,0,0,0,0,0;79. 80. intdist12=1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000;81

17、. 82. cout单源图的邻接矩阵如下:endl;83. int*c=newint*n+1;84. 85. for(inti=1;i=n;i+)86. 87. ci=newintn+1;88. for(intj=1;jcij;91. coutcij;92. 93. coutendl;94. 95. 96. intv=1;97. GraphG;98. G.n=n;99. 100. G.c=c;101. G.dist=dist;102. G.prev=prev;103. G.ShortesPaths(v);104. 105. cout从S到T的最短路长是:dist11endl;106. for(inti=2;i=n;i+)107. 108. coutprev(i)=previendl;109. 110. 111. for(inti=2;i=n;i+)112. 113. cout从1到i的最短路长是:distiendl;114. 115. 116. for(inti=1;i=n;i+)117. 118. deleteci;119. 120. 121. deletec;122. c=0;123. return0;124. 程序运行结果如图:

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

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