收藏 分享(赏)

0033算法笔记——【分支限界法】分支限界法与单源最短路径问题.doc

上传人:精品资料 文档编号:10858942 上传时间:2020-01-15 格式:DOC 页数:12 大小:157.70KB
下载 相关 举报
0033算法笔记——【分支限界法】分支限界法与单源最短路径问题.doc_第1页
第1页 / 共12页
0033算法笔记——【分支限界法】分支限界法与单源最短路径问题.doc_第2页
第2页 / 共12页
0033算法笔记——【分支限界法】分支限界法与单源最短路径问题.doc_第3页
第3页 / 共12页
0033算法笔记——【分支限界法】分支限界法与单源最短路径问题.doc_第4页
第4页 / 共12页
0033算法笔记——【分支限界法】分支限界法与单源最短路径问题.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

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

2、求解目标:回溯法的求解目标是找出解空间树中满足约束条件的 所有解 ,而分支限界法的求解目标则是找出 满足约束条件的一个解 ,或是在满足约束条件的解中找出在某种意义下的最优解。 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,E C,J,KCF,GG,L,MG,MGN,OO2)旅行员售货问题队列式分支限界法( 节点 B 开始): BC,D ,ED,E,F , GE,F,G,H,I F,G ,H,I,J,

5、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 ,Q O,P,QP,Q Q 优先队列式分支限界法:优先级是结点的当前费用: 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 ,O Q,O ,F,G Q,O,G,LQ,O,L,M O, L,MO,M M 2、单源最短路径问题问题描述在下图所给的有向图 G 中,每一边都有一个非负边权。要求图 G 的从源顶点 s 到目

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

7、过程中, 一旦发现一个结点的下界不小于当前找到的最短路长,则算法剪去以该结点为根的子树 。在算法中,利用结点间的控制关系进行剪枝。从源顶点 s 出发,2条不同路径到达图 G 的同一顶点。由于两条路径的路长不同,因此可以将路长长的路径所对应的树中的结点为根的子树剪去。 算法具体代码如下:1、MinHeap2.hcpp view plain copy1. #include 2. 3. template 4. class Graph; 5. 6. template 7. class MinHeap 8. 9. template 10. friend class Graph; 11. public:

8、12. MinHeap(int maxheapsize = 10); 13. MinHeap()delete heap; 14. 15. int Size() constreturn currentsize; 16. T Max()if(currentsize) return heap1; 17. 18. MinHeap 19. MinHeap 20. 21. void Initialize(T x, int size, int ArraySize); 22. void Deactivate(); 23. void output(T a,int n); 24. private: 25. int

9、 currentsize, maxsize; 26. T *heap; 27. ; 28. 29. template 30. void MinHeap:output(T a,int n) 31. 32. for(int i = 1; i 38. MinHeap:MinHeap(int maxheapsize) 39. 40. maxsize = maxheapsize; 41. heap = new Tmaxsize + 1; 42. currentsize = 0; 43. 44. 45. template 46. MinHeap 51. 52. int i = +currentsize;

10、53. while(i != 1 81. 82. 83. if(y 97. void MinHeap:Initialize(T x, int size, int ArraySize) 98. 99. delete heap; 100. heap = x; 101. currentsize = size; 102. maxsize = ArraySize; 103. 104. for(int i = currentsize / 2; i = 1; i-) 105. 106. T y = heapi; 107. int c = 2 * i; 108. while(c heapc + 1) 111.

11、 c+; 112. if(y 122. void MinHeap:Deactivate() 123. 124. heap = 0; 125. 2、6d2.cppcpp view plain copy1. /单源最短路径问题 分支 限界法求解 2. #include “stdafx.h“ 3. #include “MinHeap2.h“ 4. #include 5. #include 6. using namespace std; 7. 8. ifstream fin(“6d2.txt“); 9. 10. template 11. class Graph 12. 13. friend int m

12、ain(); 14. public: 15. void ShortesPaths(int); 16. private: 17. int n, /图 G 的顶点数 18. *prev; /前驱顶点数组 19. Type *c, /图 G 的领接矩阵 20. *dist; /最短距离数组 21. ; 22. 23. template 24. class MinHeapNode 25. 26. friend Graph; 27. public: 28. operator int ()constreturn length; 29. private: 30. int i; /顶点编号 31. Type

13、length; /当前路长 32. ; 33. 34. template 35. void Graph:ShortesPaths(int v)/单源最短路径问题的优先队列式分支限界法 36. 37. MinHeap H(1000); 38. MinHeapNode E; 39. 40. /定义源为初始扩展节点 41. E.i=v; 42. E.length=0; 43. distv=0; 44. 45. while (true)/搜索问题的解空间 46. 47. for (int j = 1; j N; 56. N.i=j; 57. N.length=distj; 58. H.Insert(N

14、); 59. 60. try 61. 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. int main() 76. 77. int n=11; 78. int prev12 = 0,0,0,0,0,0,0,0,0,0,0,0; 79. 80. int dist12=1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,

15、1000; 81. 82. coutcij; 91. cout G; 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 (int i = 2; i = n; i+) 107. 108. cout“prev(“i“)=“previ“ “endl; 109. 110. 111. for (int i = 2; i = n; i+) 112. 113. cout“从 1 到“i“的最短路长是:“distiendl; 114. 115. 116. for(int i=1;i=n;i+) 117. 118. delete ci; 119. 120. 121. delete c; 122. c=0; 123. return 0; 124. 程序运行结果如图:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报