您好,欢迎访问三七文档
15分支限界法2学习要点α-β剪枝技术分支限界法的剪枝搜索策略应用范例(1)流动推销员问题(2)单源最短路径问题(3)装载问题;(4)布线问题;(5)0-1背包问题;(6)同顺序加工任务安排问题(7)八数码问题35.1图的广度优先遍历对于图G=(V,E),从任意一点r开始,依次检查所有与r有关联的边(r,a1),(r,a2),…,(r,ak),当上面k条边检查完毕后,再依次检查所有与a1,a2,…,ak相关联的(a1,a11),(a1,a12),…,(a1,a1m),(a2,a21),(a2,a22),…,(a2,a2m),……,(ak,ak1),(ak,ak2),…,(ak,akm)。依次类推,直到所有的边被检查,即所有顶点均被访问为止。4广度优先搜索的示例广度优先搜索过程广度优先生成树广度优先遍历序列:ABCDEFGHI5广度优先搜索是一种分层的搜索过程,每向前走一步可能访问一批顶点。因此,广度优先搜索不是一个递归的过程,其算法也不是递归的。为了实现逐层访问,算法中使用了一个队列,以记忆正在访问的这一层和上一层的顶点,以便于向下一层访问。为避免重复访问,需要一个辅助数组visited[],给被访问过的顶点加标记。6图的广度优先搜索算法:templateclassNameType,classDistTypevoidGraphNameType,DistType::BFS(intv){int*visited=newint[NumVertices];for(inti=0;iNumVertices;i++)visited[i]=0;//visited初始化coutGetValue(v)'';visited[v]=1;Queueintq;q.EnQueue(v);//访问v,进队列7while(!q.IsEmpty()){//队空搜索结束v=q.DeQueue();//不空,出队列intw=GetFirstNeighbor(v);//取顶点v的第一个邻接顶点wwhile(w!=-1){//若邻接顶点w存在if(!visited[w]){//若该邻接顶点未访问过coutGetValue(w)‘’;//访问visited[w]=1;q.EnQueue(w);//进队}w=GetNextNeighbor(v,w);//取顶点v的排在w后面的下一邻接顶点}//重复检测v的所有邻接顶点}//外层循环,判队列空否}如果使用邻接表表示图,则循环的总时间代价为d0+d1+…+dn-1=O(e),其中的di是顶点i的度。如果使用邻接矩阵,则对于每一个被访问过的顶点,循环要检测矩阵中的n个元素,总的时间代价为O(n2)。85.2α-β剪枝技术α-β剪枝技术是一种技巧。比如,7根火柴,A、B两人依次从中取出1根或2根,但不能不取,最后一个将取尽的便是赢家。95.3分支限界法通常以广度优先或最小耗费(最大效益)优先的方式,搜索问题的解空间树。可以这样理解:分支定界法与广度优先方法的不同在于,往往不用遍历整个图,而是将不可能得到解或不可能得到最优解的树枝剪掉(即下界估计),从而提高搜索效率。关键:下界估计105.3.1分支限界法的基本思想(1)求解目标:分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。(2)搜索方式:以广度优先或以最小耗费优先的方式搜索解空间树。11分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。125.3.2分支限界法示例(1)单源最短路径问题(2)布线问题(3)八数码问题(4)对称流动推销员问题(5)非对称流动推销员问题13例1:单源最短路径问题1.问题描述在下图所给的有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径。a=2b=3c=4d=7e=2f=9g=2h=2i=6j=7k=3l=5m=1n=50=8p=2q=1r=2u=314用优先队列式分支限界法解有向图G的单源最短路径问题产生的解空间树。其中,每一个结点旁边的数字表示该结点所对应的当前路长。152.算法思想解单源最短路径问题的优先队列式分支限界法用一小顶堆来存储活结点表。其优先级是结点所对应的当前路长。算法从图G的源顶点s和空优先队列开始。结点s被扩展后,它的儿子结点被依次插入堆中。此后,算法从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点。如果从当前扩展结点i到顶点j有边可达,且从源出发,途经顶点i再到顶点j的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中。这个结点的扩展过程一直继续到活结点优先队列为空时为止。16a=2b=3c=4d=7e=2f=9g=2h=2i=6j=7k=3l=5m=1n=50=8p=2q=1r=2u=3173.剪枝策略在算法扩展结点的过程中,一旦发现一个结点的下界不小于当前找到的最短路长,则算法剪去以该结点为根的子树。在算法中,利用结点间的控制关系进行剪枝。从源顶点s出发,2条不同路径到达图G的同一顶点。由于两条路径的路长不同,因此可以将路长长的路径所对应的树中的结点为根的子树剪去。18例2布线问题1.算法思想解此问题的队列式分支限界法从起始位置a开始将它作为第一个扩展结点。与该扩展结点相邻并且可达的方格成为可行结点被加入到活结点队列中,并且将这些方格标记为1,即从起始方格a到这些方格的距离为1。接着,算法从活结点队列中取出队首结点作为下一个扩展结点,并将与当前扩展结点相邻且未标记过的方格标记为2,并存入活结点队列。这个过程一直继续到算法搜索到目标方格b或活结点队列为空时为止。即加入剪枝的广度优先搜索。192.示例20boolfindpath(positionstart,Positionfinish,int&pathlen,position*&path){//计算从起点位置start到目标位置finish的最短布线路径//找到最短路径返回true,否则返回falseif((start.row==finish.row)&&(start.col==finish.col)){pathlen=0;trturntrue;}for(inti=0;i=m+1;i++)grid[0][i]=grid[n+1][i]=1;//顶部和底部for(inti=0;i=n+1;i++)grid[i][0]=grid[i][m+1]=1;//左翼和右翼设置边界的围墙21positionoffset[4];offset[0].row=0;offset[0].col=1;//右offset[1].row=1;offset[1].col=0;//下offset[2].row=0;offset[2].col=-1;//左offset[3].row=-1;offset[3].col=0;//上定义移动方向的相对位移intnumofnbrs=4;here.row=start.row;here.col=start.col;grid[start.row][start.col]=2;//标记可达方格位置linkedqueuepositionQ;22do{//标记可达相邻方格for(inti=0;iNumOfNbrs;i++){nbr.row=here.row+offset[i].row;nbr.col=here.col+offset[i].col;if(grid[nbr.row][nbr.col]==0){//该方格未标记grid[nbr.row][nbr.col]=grid[here.row][here.col]+1;if((nbr.row==finish.row)&&(nbr.col==finish.col))break;//完成布线Q.Add(nbr);}}找到目标位置后,可以通过回溯方法找到这条最短路径。23//是否达到目标位置if((nbr.row==finish.row)&&(nbr.col==finish.col))break;//完成布线//队列为空?if(Q.Isempty())returnfalse;//无解Q.delete(here);//取下一个扩展结点}while(true);找到目标位置后,可以通过回溯方法找到这条最短路径。24在3*3的方格棋盘上,分别放置了标有数字1、2、3、4、5、6、7、8的八张牌,初始状态S0,目标状态Sg。可以使用的操作有:空格左移,空格上移,空相右移,空格下移即只允许把位于空格左、上、右、下方的牌移入空格。寻找从初始状态到目标状态的解路径。28314765S012384765Sg例3八数码难题2528314765S0128314765223184765328314765428316475583214765283714652318476523184765281437652831457628316475283164756789101112138321476528371465123847652341876528143765283145762836417528316754141521832147658132476522232837461528371465242512384765123784652627Sg由图可以看出,解的路径是:S0→3→8→16→26(Sg)26设估价函数为:f(n)=d(n)+W(n)其中,d(n)表示节点n在搜索树中的深度;w(n)表示节点n中“不在位”的数码个数。取g(n)=d(n),h(n)=W(n)。它说明是用从S0到n的路径上的单位代价表示实际代价,用n中“不在位”的数码个数作为启发信息。一般来说,某节点中的“不在位”的数码个数越多,说明它离目标节点越远。对初始节点S0,由于d(S0)=0,W(S0)=3,因此有f(S0)=0+3=3这个例子仅是为了说明估价函数的含义及估价函数值的计算。在问题搜索过程中,除了需要计算初始节点的估价函数之外,更多的是要计算新生成节点的估价函数值。28314765S0271.全局择优搜索二.A算法2.3状态空间的启发式搜索每个节点旁边的数字是该节点的估价函数值。例如,对节点S2,其估价函数值的计算为f(S2)=d(S2)+W(S2)=1+3=4从该图还可以看出,该问题的解为:S0→S2→S7→S9→Sg28314765S02831476523184765283147652831647583214765283714652318476523184765S94123847651238476512378465S55S66S86S74SgS104S116S14S24S35S4528例4对称流动推销员问题∞14116214∞2523125∞991619∞62396∞Dmn=问题:从某一城市出发,遍历各城市一次且仅一次,最后返回原地,求最短路径。(1)取5个最小边,求和。d13+d15+d24+d25+d45=14(2)用34替换15,求和。d13+d34+d24+d25+d45=21(3)用34替换25,求和。d13+d15+d24+d34+d45=20(4)用34替换45,求和。d13+d15+d24+d25+d34=1729(13,15,24,25,45)14(13,34,24,25,45)21(13,15,24,34,45)20选择45(13,15,24,25,34)17选择15选择25不选25不选45不选15∞14116214∞2523125∞991619∞62396∞Dmn=30∞14305610∞114
本文标题:5分支限界法详解
链接地址:https://www.777doc.com/doc-5734544 .html