0033算法笔记——分支限界法分支限界法与单源最短路径问题_第1页
0033算法笔记——分支限界法分支限界法与单源最短路径问题_第2页
0033算法笔记——分支限界法分支限界法与单源最短路径问题_第3页
0033算法笔记——分支限界法分支限界法与单源最短路径问题_第4页
0033算法笔记——分支限界法分支限界法与单源最短路径问题_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 1、分支限界法    (1)描述:采用广度优先产生状态空间树的结点,并使用剪枝函数的方法称为分枝限界法。     所谓“分支”是采用广度优先的策略,依次生成扩展结点的所有分支(即:儿子结点)。     所谓“限界”是在结点扩展过程中,计算结点的上界(或下界),边搜索边减掉搜索树的某些分支,从而提高搜索效率。    (2)原理:按照广度优先的原则,一个活结点一旦成为扩展结点(E-结点)R后,算法将依次生成它的全部孩子结点,将那些导致不可行解或导致非最优解的儿子舍弃,

2、其余儿子加入活结点表中。然后,从活结点表中取出一个结点作为当前扩展结点。重复上述结点扩展过程,直至找到问题的解或判定无解为止。    (3)分支限界法与回溯法     1)求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。      2)搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。   (4)常

3、见的分支限界法     1)FIFO分支限界法(队列式分支限界法)     基本思想:按照队列先进先出(FIFO)原则选取下一个活结点为扩展结点。     搜索策略:一开始,根结点是唯一的活结点,根结点入队。从活结点队中取出根结点后,作为当前扩展结点。对当前扩展结点,先从左到右地产生它的所有儿子,用约束条件检查,把所有满足约束函数的儿子加入活结点队列中。再从活结点表中取出队首结点(队中最先进来的结点)为当前扩展结点,直到找到一个解或活结点队列为空为止。    2)LC(least co

4、st)分支限界法(优先队列式分支限界法)    基本思想:为了加速搜索的进程,应采用有效地方式选择活结点进行扩展。按照优先队列中规定的优先级选取优先级最高的结点成为当前扩展结点。    搜索策略:对每一活结点计算一个优先级(某些信息的函数值),并根据这些优先级;从当前活结点表中优先选择一个优先级最高(最有利)的结点作为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便尽快地找出一个最优解。再从活结点表中下一个优先级别最高的结点为当前扩展结点,直到找到一个解或活结点队列为空为止。     (5)分支限界法搜索应用举例

5、60;     1)0-1背包问题,当n=3时,w=16,15,15, p=45,25,25, c=30     队列式分支限界法(处理法则:先进先出):>A>B,C>C,D,E(D是不可行解,舍弃)>C,E>E,F,G>F,G,J,K(J是不可行解,舍弃)>F,G,K>G,K,L,M>K,L,M,N,O>     优先队列式分支限界法(处理法则:价值大者优先):>A>B,C>C,D,E>C,E>C,J,K>C

6、>F,G>G,L,M>G,M>G>N,O>O>     2)旅行员售货问题     队列式分支限界法(节点B开始): BC,D,ED,E,F,GE,F,G,H,IF,G,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,

7、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之间的最短路径。     下图是用优先队列式分支限界法解有向图G的单源最短路径问题产生的解空间树。其中,每一个结点旁边的数字表示该结点所对应的当前路长。    &#

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

9、结点为根的子树。    在算法中,利用结点间的控制关系进行剪枝。从源顶点s出发,2条不同路径到达图G的同一顶点。由于两条路径的路长不同,因此可以将路长长的路径所对应的树中的结点为根的子树剪去。      算法具体代码如下:     1、MinHeap2.hcpp view plain copy1. #include <iostream>  2.   3. template<class Type>

10、0; 4. class Graph;  5.   6. template<class T>   7. class MinHeap   8.    9.     template<class Type>  10.     friend class Graph; 

11、60;11.     public:   12.         MinHeap(int maxheapsize = 10);   13.         MinHeap()delete heap;   14.   15.   &

12、#160;     int Size() constreturn currentsize;   16.         T Max()if(currentsize) return heap1;   17.   18.         MinHeap&

13、lt;T>& Insert(const T& x);   19.         MinHeap<T>& DeleteMin(T &x);   20.   21.         void Initialize(T x, int&

14、#160;size, int ArraySize);   22.         void Deactivate();   23.         void output(T a,int n);  24.     private:  

15、60;25.         int currentsize, maxsize;   26.         T *heap;   27. ;   28.   29. template <class T>   30. void 

16、MinHeap<T>:output(T a,int n)   31.    32.     for(int i = 1; i <= n; i+)   33.     cout << ai << " "  &#

17、160;34.     cout << endl;   35.    36.   37. template <class T>   38. MinHeap<T>:MinHeap(int maxheapsize)   39.    40.     maxsize&#

18、160;= maxheapsize;   41.     heap = new Tmaxsize + 1;   42.     currentsize = 0;   43.    44.   45. template<class T>   46.

19、MinHeap<T>& MinHeap<T>:Insert(const T& x)   47.    48.     if(currentsize = maxsize)   49.        50.         retur

20、n *this;   51.        52.     int i = +currentsize;   53.     while(i != 1 && x < heapi/2)   54.    

21、0;   55.         heapi = heapi/2;   56.         i /= 2;   57.        58.   59.     heapi&#

22、160;= x;   60.     return *this;   61.    62.   63. template<class T>   64. MinHeap<T>& MinHeap<T>:DeleteMin(T& x)   65.    66. &

23、#160;   if(currentsize = 0)   67.        68.         cout<<"Empty heap!"<<endl;   69.         return

24、60;*this;   70.        71.   72.     x = heap1;   73.   74.     T y = heapcurrentsize-;   75.     int i =

25、 1, ci = 2;   76.     while(ci <= currentsize)   77.        78.         if(ci < currentsize && heapci >

26、 heapci + 1)   79.            80.             ci+;   81.            82.   8

27、3.         if(y <= heapci)   84.            85.             break;   86.      

28、;      87.         heapi = heapci;   88.         i = ci;   89.         ci *= 2;  

29、; 90.        91.   92.     heapi = y;   93.     return *this;   94.    95.   96. template<class T>   97. void 

30、;MinHeap<T>:Initialize(T x, int size, int ArraySize)   98.    99.     delete heap;   100.     heap = x;   101.     currentsize =&

31、#160;size;   102.     maxsize = ArraySize;   103.   104.     for(int i = currentsize / 2; i >= 1; i-)   105.       &#

32、160;106.         T y = heapi;   107.         int c = 2 * i;   108.         while(c <= currentsize

33、)   109.            110.             if(c < currentsize && heapc > heapc + 1)   111.   

34、0;             c+;   112.             if(y <= heapc)   113.             

35、    break;   114.             heapc / 2 = heapc;   115.             c *= 2;   116. &#

36、160;          117.         heapc / 2 = y;   118.        119.    120.   121. template<class T>  

37、; 122. void MinHeap<T>:Deactivate()   123.    124.     heap = 0;   125.         2、6d2.cppcpp view plain copy1. /单源最短路径问题 分支 限界法求解  2. #include &

38、quot;stdafx.h"  3. #include "MinHeap2.h"  4. #include <iostream>  5. #include <fstream>   6. using namespace std;  7.   8. ifstream fin("6d2.txt");   9.

39、  10. template<class Type>  11. class Graph  12.   13.     friend int main();  14.     public:  15.         void ShortesPaths(int

40、);  16.     private:  17.         int     n,         /图G的顶点数  18.             &#

41、160;   *prev;     /前驱顶点数组  19.         Type    *c,       /图G的领接矩阵  20.             &#

42、160;   *dist;     /最短距离数组  21. ;   22.   23. template<class Type>  24. class MinHeapNode  25.   26.    friend Graph<Type>  27.   

43、0;public:  28.        operator int ()constreturn length;  29.    private:  30.        int       i;      &

44、#160;/顶点编号  31.        Type  length;      /当前路长  32. ;   33.   34. template<class Type>  35. void Graph<Type>:ShortesPaths(int v)/单源最短路径问题的优先队列

45、式分支限界法  36.    37.     MinHeap<MinHeapNode<Type>> H(1000);  38.     MinHeapNode<Type> E;  39.   40.     /定义源为初始扩展节点  41.     E.

46、i=v;  42.     E.length=0;  43.     distv=0;  44.   45.     while (true)/搜索问题的解空间  46.       47.         for (i

47、nt j = 1; j <= n; j+)  48.             if (cE.ij!=0)&&(E.length+cE.ij<distj)   49.   50.           &#

48、160;      / 顶点i到顶点j可达,且满足控制约束  51.                  distj=E.length+cE.ij;  52.              

49、60;   prevj=E.i;  53.   54.                  / 加入活结点优先队列  55.                  M

50、inHeapNode<Type> N;  56.                  N.i=j;  57.                  N.length=distj;  5

51、8.                  H.Insert(N);  59.               60.         try   61.  

52、         62.             H.DeleteMin(E); / 取下一扩展结点  63.                   64.  &

53、#160;      catch (int)   65.           66.             break;  67.           

54、60; 68.         if (H.currentsize=0)/ 优先队列空  69.           70.             break;  71.     

55、0;     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;

56、60;   79.   80.     int dist12=1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000;  81.   82.     cout<<"单源图的邻接矩阵如下:"<<endl;  83.     int *c

57、0;= new int*n+1;  84.   85.     for(int i=1;i<=n;i+)  86.       87.         ci=new intn+1;  88.         for

58、(int j=1; j<=n; j+)  89.           90.             fin>>cij;  91.             cout<<cij<<" "  92.  

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论