《算法分析及设计-分支限界法.ppt》由会员分享,可在线阅读,更多相关《算法分析及设计-分支限界法.ppt(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第6章 分支限界法6.1分支限界法的基本思想6.2单源最短路径问题6.3 0-1背包问题本章主要知识点:6.1 分支限界法的基本思想(1)求解目标求解目标:回溯法的求解目标是找出解空间树中满 足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。1.1.分支限界法与回溯法的不同分支限界法与回溯法的不同(2)搜索方式的不同搜索方式的不同:回溯法以深度优先的方式搜索解 空间树,而分支限界法则以广度优先或以最小耗费优 先的方式搜索解空间树。6.1分支限界法的基本思想 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的
2、解空间树。2.分支限界法基本思想在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。6.1分支限界法的基本思想3.常见的两种分支限界法(1)队列式(FIFO)分支限界法 按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。(2)优先队列式分支限界法 按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。例如:考虑n
3、=3时0-1背包问题,其中w=16,15,15,p=45,25,25,c=30。6.1分支限界法的基本思想 解空间队列分支限界法6.2 单源最短路径问题 从根结点A开始。初始时活结点队列为空,结点A是当前的扩展结点。结点A的2个儿子结点B和C均为可行结点,故将这两个儿子结点按从左到右的顺序加入到活结点队列,并舍弃当前的扩展结点A。以先进先出的原则,下一个扩展结点是活结点队列的队首结点B。扩展结点B得到其儿子结点D和E。由于D是不可行结点,故被舍弃。E是可行结点,被加入活结点队列。接下来,C成为当前的扩展结点,它的2个儿子结点F和G 均为可行结点,因此被加入到活结点队列中。6.2 单源最短路径问
4、题 扩展下一个结点E得到J和K。J是不可行结点,因而被舍弃。K是可行叶结点,表示问题所求问题的一个可行解,其价值为45.当前的活结点队列的首结点F成为下一个扩展结点。它的2个儿子结点L和M均为叶结点。L表示获得的价值为50的可行解,M表示获得价值为25的可行解。G是最后一个扩展结点,其儿子结点N和O均为可行叶结点。最后活结点队列已空,算法终止。算法搜索到的最优值为50.从根结点A开始。用一个极大堆表示活结点表的优先队列。6.2 单源最短路径问题优先队列式分支限界法初始堆为空,扩展结点A得到它的2个儿子结点B和C。这2个结点均为可行结点,因此被加入到堆中,结点A被舍弃。结点B获得的当前价值为40
5、,而结点C的当前价值为0.由于B的价值大于C的价值,所以B是堆中的最大元素,从而成为下一个扩展结点。扩展结点B得到结点D和E。D是不可行结点,因而被舍弃。E是可行结点被加入到堆中,E的价值为40,成为当前堆中的最大元素,从而成为下一个扩展结点。扩展结点E得到2个叶结点J和K。J是不可行结点被舍弃。K是一个可行叶结点,表示问题的一个可行解,其价值为45.此时堆中仅剩下一个活结点C,它成为当前的扩展结点。它的2个儿子结点F和G均为可行结点,因此被插入到当前堆中。6.2 单源最短路径问题结点F的价值为25,是堆中最大元素,成为下一个扩展结点。F的2个儿子结点L和M均为叶结点。叶结点L相应于价值为50
6、的可行解。叶结点M相应于价值为25的可行解。叶结点L所相应的解成为最优解。最后,结点G成为扩展结点,其儿子结点N和O均为叶结点,它们的价值分别为25和0.接下来,存储活结点的堆已空,算法终止。算法搜索到的最优值为50.第6章 分支限界法6.1分支限界法的基本思想6.2单源最短路径问题6.3 0-1背包问题本章主要知识点:6.1分支限界法的基本思想 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。2.分支限界法基本思想在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的
7、儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。6.1分支限界法的基本思想3.常见的两种分支限界法(1)队列式(FIFO)分支限界法 按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。(2)优先队列式分支限界法 按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。6.2 单源最短路径问题1.问题描述 给定带权有向图G=(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源源。现在要计算从源到所有其它各顶点的最短路长度最短路长度。这里路的长
8、度是指路上各边权之和。这个问题通常称为单源最短路径单源最短路径问题问题。2h2g2n5j3k3l5i5m1o5p2f9e2d7a2b3c4u3q1r2字母旁边的数字为路长字母旁边的数字为路长012345678910下面以一个例子来说明单源最短路径问题:在下图所给的有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径。6.2 单源最短路径问题6.2 单源最短路径问题 下图是用优先队列式分支限界法解有向图G的单源最短路径问题产生的解空间树。其中,每一个结点旁边的数字表示该结点所对应的当前路长。6.2 单源最短路径问题2.算法思想 解单源最短路径问题的优先队列式分支限界
9、法用一极小堆来存储活结点表。其优先级是结点所对应的当前路长。算法从图G的源顶点s和空优先队列开始。结点s被扩展后,它的儿子结点被依次插入堆中。此后,算法从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点。如果从当前扩如果从当前扩展结点展结点i i到顶点到顶点j j有边可达,且从源出发,途经顶点有边可达,且从源出发,途经顶点i i再到再到顶点顶点j j的所相应的路径的长度小于当前最优路径长度,则的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中。将该顶点作为活结点插入到活结点优先队列中。这个结点的扩展过程一直继续到活结点优先
10、队列为空时为止。6.2 单源最短路径问题3.剪枝策略 在算法扩展结点的过程中,一旦发现一个结点的下界不小于当前找到的最短路长,则算法剪去以该结点为根的子树。在算法中,利用结点间的控制关系进行剪枝。从源顶点s出发,2条不同路径到达图G的同一顶点。由于两条路径的路长不同,因此可以将路长长的路径所对应的树中的结点为根的子树剪去。6.2 单源最短路径问题 while(true)/搜索问题的解空间 for(int j=1;j=n;j+)if(aenode.ij Float.MAX_VALUE&enode.length+aenode.ij distj)/顶点i到顶点j可达,且满足控制约束 distj=en
11、ode.length+aenode.ij;pj=enode.i;HeapNode node=new HeapNode(j,distj);heap.put(node);/加入活结点优先队列 if(heap.isEmpty()break;else enode=(HeapNode)heap.removeMin();顶点顶点i i和和j j间有边,且此间有边,且此路径长小于原先从原点路径长小于原先从原点到到j j的路径长的路径长 4.算法实现46.2 单源最短路径问题 算法从源节点S和空优先队列开始。5.例子实现 S被扩展,3个子节点1、2、3被插入堆中。计算0-1、0-2和0-3当前最短路径长为2。
12、将当前路径最短的节点1扩展,即走0-1-2,0-1-5,0-1-4计算,但是在计算0-1-2过程中当前最短路径为3(0-2),剪掉0-1-2上以2为根的子树。将2进行扩展,走bg和bf。将3进行扩展,走ch。选择路径长最小0-1-5的结点5作为扩展结点。当前最短路径为4.同时剪掉0-2-5路径中以5为根的子树。shfgdeucba25461259301235465626.2 单源最短路径问题当前最短路径为4。以5作为扩展结点,走0-1-5-6和0-1-5-8,但是路径0-1-5-6的长度不小于已存的最短路0-2-6,不在扩展。同时,剪掉0-3-6路径中以6为根结点为子树。下一个活结点6成为扩展
13、结点,走0-2-6-9和0-2-6-8,选择9结点作为扩展结点。64sqhfgdeucbalmk2541259310675012354668985626.2 单源最短路径问题当前最短路径长为6,选择9结点作为扩展结点。走0-2-6-9-8,0-2-6-9-10路径。此时0-2-6-9-8中路径长度大于0-1-5-8,所以选择0-1-5-8中结点8作为扩展结点。将结点8作为扩展结点0-1-5-8-12-10路径长度小于0-2-6-9-10,选择路径0-2-6-9-10作为最短路径。从s到T的最短路为0-2-6-9-10,长度为8。64sqhfgdeucbalmk25412593106750123
14、546689856r8810p812 10o2第6章 分支限界法6.1分支限界法的基本思想6.2单源最短路径问题6.3 0-1背包问题本章主要知识点:6.2 单源最短路径问题1.问题描述 给定带权有向图G=(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源源。现在要计算从源到所有其它各顶点的最短路长度最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径单源最短路径问题问题。6.2 单源最短路径问题2.算法思想 解单源最短路径问题的优先队列式分支限界法用一极小堆来存储活结点表。其优先级是结点所对应的当前路长。算法从图G的源顶点s和空优先队列开始。结点s被
15、扩展后,它的儿子结点被依次插入堆中。此后,算法从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点。如果从当前扩如果从当前扩展结点展结点i i到顶点到顶点j j有边可达,且从源出发,途经顶点有边可达,且从源出发,途经顶点i i再到再到顶点顶点j j的所相应的路径的长度小于当前最优路径长度,则的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中。将该顶点作为活结点插入到活结点优先队列中。这个结点的扩展过程一直继续到活结点优先队列为空时为止。6.3 0-1背包问题 算法的思想 首先,要对输入数据进行预处理,将各物品依其单位重量价值
16、从大到小进行排列。(1).(1).数据预处理数据预处理 Element q=new Element n double ws=0;/装包物品重量 double ps=0;/装包物品重量 for(int i=1;i=n;i+)qi-1=new Element(I,ppi/wwi);ps=ps+ppi;ws=ws+wwi;if(ws=c)/所有物品装包 for(int i=1;i=n;i+)xxi=1;return ps;/依单位重量价值排序 MergeSort.mergeSort(q);ElementElement类参见课本类参见课本217217页;页;pppp存物品的价值;存物品的价值;wwww
17、存物品的重量;存物品的重量;c c是背包的容量;是背包的容量;xxxx背包问题的解。背包问题的解。6.3 0-1背包问题6.3 0-1背包问题(2).(2).优先队列式分支限界搜索优先队列式分支限界搜索i).结点的优先级由已装包的物品价值加上剩下的最大单位重量价值的物品装满剩余容量的价值和。由该结点的上界函数bound给出。private static double bound(int i)/计算结点所相应的价值上界 double cleft=c-cw;/剩余容量 double b=cp;/价值上界/以物品单位重量价值递减顺序装载剩余容量while(i=n&wi=cleft)/n表示物品总数,
18、cleft为剩余空间 cleft-=wi;/wi表示i所占空间 b+=pi;/pi表示i的价值 i+;/装填剩余容量装满背包if(i=n)b+=pi/wi*cleft;/装填剩余容量装满背包return b;/b为上界函数6.3 0-1背包问题算法首先检查当前扩展结点的左儿子结点的可行性。如果该左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中。当前扩展结点的右儿子结点一定是可行结点,仅当右儿子结点满足上界约束时才将它加入子集树和活结点优先队列。当扩展到叶节点时为问题的最优值。6.3 0-1背包问题ii).搜索过程6.3 0-1背包问题 while(i!=n+1)/非叶结点 doubl
19、e wt=cw+wi;if(wt bestp)bestp=cp+pi;addLiveNode(up,cp+pi,cw+wi,i+1,enode,true);up=bound(i+1);if(up=bestp)/检查右儿子节点 addLiveNode(up,cp,cw,i+1,enode,false);/取下一个扩展节点 HeapNode node=(HeapNode)heap.removeMax();enode=node.liveNode;cw=node.weight;cp=node.profit;up=node.upperProfit;i=node.level;HeadNodeHeadNod
20、e是堆中的元素,是堆中的元素,其私有成员有其私有成员有uprofituprofit,profitprofit,weightweight和和levellevel。对任意一个活结点对任意一个活结点nodenode,node.weightnode.weight,node.profit,node.uprofnode.profit,node.uprofitit分别表示结点的重量、分别表示结点的重量、价值和价值上界。价值和价值上界。6.3 0-1背包问题其中,addLiveNode是将一个新的活结点插入到子集树和优先队列中。private static void addLiveNode(double up,double pp,double ww,int lev,BBnode par,boolean ch)/将一个新的结点插入到子集树和最大堆H中BBnode b=new BBnode(par,ch);HeapNode node=new HeapNode(b,up,pp,ww,lev);heap.put(node);BBnodeBBnode是子空间树中是子空间树中的结点类型。的结点类型。parpar是父是父结点,结点,chch是左子结点。是左子结点。