第6篇 分支限界法.pptx

上传人:b****1 文档编号:1093914 上传时间:2022-10-16 格式:PPTX 页数:148 大小:1.17MB
下载 相关 举报
第6篇 分支限界法.pptx_第1页
第1页 / 共148页
第6篇 分支限界法.pptx_第2页
第2页 / 共148页
第6篇 分支限界法.pptx_第3页
第3页 / 共148页
第6篇 分支限界法.pptx_第4页
第4页 / 共148页
第6篇 分支限界法.pptx_第5页
第5页 / 共148页
点击查看更多>>
下载资源
资源描述

第6篇 分支限界法.pptx

《第6篇 分支限界法.pptx》由会员分享,可在线阅读,更多相关《第6篇 分支限界法.pptx(148页珍藏版)》请在冰豆网上搜索。

第6篇 分支限界法.pptx

第6章分枝-限界法,1,学习要点,理解分支限界法的剪枝搜索策略。

掌握分支限界法的算法框架队列式(FIFO)分支限界法优先队列式分支限界法通过应用范例学习分支限界法的设计策略。

单源最短路径问题装载问题;布线问题(4)0-1背包问题;最大团问题;旅行售货员问题电路板排列问题批处理作业调度问题,2,6.1分支限界法的基本思想,3,分支限界法与回溯法

(1)求解目标:

回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。

(2)搜索方式的不同:

回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。

6.1分支限界法的基本思想,4,分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。

在分支限界法中,每一个活结点只有一次机会成为扩展结点。

活结点一旦成为扩展结点,就一次性产生其所有儿子结点。

在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。

此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。

这个过程一直持续到找到所需的解或活结点表为空时为止。

6.1分支限界法的基本思想,5,两类常用的方法选择下一个E-结点:

先进先出(FIFO):

从活结点表中取出结点的顺序与加入结点的顺序相同。

后进先出(LIFO):

从活结点表中取出结点的顺序与加入结点的顺序相反。

优先队列式分支限界法按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。

堆(Heap),优先级队列每次出队列的是优先权最高的元素优先级队列支持以下操作:

找出一个具有最高优先级的元素删除一个具有最高优先级的元素添加一个元素到集合中,6,完全二叉树数组表示,KiK2i+1,&,KKi2i+2,完全二叉树数组表示,KiK2i+1,&,KKi2i+2,堆的定义,09,87,87,78,45650931,4578,65,5331,23,53,1723,17,自下向上逐步调整为最小堆,将一组用数组存放的任意数据调整成堆,17781778,09,i,23,2345658709456587,5353i,8,53,53,17,17,23,094578,65,87,i,09,23,4578,65,87,i,9,53,09,23,174578,65,87,i,09,23,65,87,i,5309174578,10,53,17,17,09,4578,65,87,09,234578,65,87,i,11,i531723,53,17,23,4578,6517,87,i,4578,65,87,j,11,在堆中插入新元素11,53,j,1123,23,09i09,最小堆的向上调整,12,53,11,09,4578,65,87,09,174578,65,87,j1117,53,23,i,23,17,j,i,13,53,11,23,65,31457887,在堆中删除根元素09,53,11,23,65,31457887,09,53,11,09,314578,65,87,23,14,53,23,11,314578,65,87,在堆中删除根元素09,53,15,23,11,314578,65,87,例1:

c=30,n=3时的0-1背包问题,w=20,15,15p=40,25,25E-结点和活结点死结点,FIFO队列,XX,2040,3050,1525,1525,0,C,BC,EG,F,E,G,16,例1:

c=30,n=3时的0-1背包问题,w=20,15,15p=40,25,25E-结点和活结点死结点,LIFO队列,C,XX,2040,3050,1525,1525,0,BF,G,B,F,E,17,例1:

c=30,n=3时的0-1背包问题,w=20,15,15p=40,25,25E-结点和活结点死结点,优先队列,2040,3050,1525,1525,0,XX,C,B,CE,GC,18,例2:

旅行商问题,1,4,2,3,30,19,10,20,6,5,4,旅行线路(1,2,4,3,1)(1,3,2,4,1)(1,4,3,2,1),例2:

旅行商问题:

FIFO,(1,2,3,4,1)(1,2,4,3,1)v=59v=66,(1,3,2,4,1)v=25,X,(1,4,2,3,1)V=25,1,4,2,3,30,10,20,6,5,4,(1,4,3,2,1)V=5920,例2:

旅行商问题:

优先队列,1,4,2,3,30,10,20,6,5,4,(1,3,2,4,1)V=25,(1,4,2,3,1)V=25,X,X,X,21,6.2单源最短路径问题,1.问题描述下面以一个例子来说明单源最短路径问题:

在下图所给的有向图G中,每一边都有一个非负边权。

要求图G的从源顶点s到目标顶点t之间的最短路径。

22,6.2单源最短路径问题,23,2.算法思想解单源最短路径问题的优先队列式分支限界法用一极小堆来存储活结点表。

其优先级是结点所对应的当前路长。

算法从图G的源顶点s和空优先队列开始。

结点s被扩展后,它的儿子结点被依次插入堆中。

此后,算法从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点。

如果从当前扩展结点i到顶点j有边可达,且从源出发,途经顶点i再到顶点j的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中。

这个结点的扩展过程一直继续到活结点优先队列为空时为止。

下图是用优先队列式分支限界法解有向图G的单源最短路径问题产生的解空间树。

其中,每一个结点旁边的数字表示该结点所对应的当前路长。

24,6.2单源最短路径问题,2.算法设计staticfloata/图G的邻接矩阵staticfloatdist/源到各顶点的距离staticintp/源到各顶点的路径上的前驱顶点HeapNode/最小堆元素inti;/顶点编号floatlength;/当前路长,25,while(true)/搜索问题的解空间for(intj=1;j=n;j+)if(aenode.ijFloat.MAX_VALUE)&(enode.length+aenode.ijdistj),/顶点i到顶点j可达,且满足控制约束distj=enode.length+cenode.ij;pj=enode.i;/加入活结点优先队列,HeapNodenode=newHeapNode(j,distj);heap.put(node);/取下一扩展结点if(heap.isEmpty()break;elseenode=(HeapNode)heap.removeMin();,顶点i和j间有边,且此路径长小于原先从原点到j的路径长,26,实例:

优先队列:

1,11,10,9,8,7,6,5,4,3,2,1234567891011102342345,6789101127,优先队列:

1,结点1到其它结点:

2,3,6,7,10,9,7,7,5,6,3,4,10,7,7,9,9,9,10,9,11,28,优先队列:

1,经过结点2到其它结点:

2,3,6,7,10,9,7,7,5,6,3,4,10,7,7,9,9,9,10,9,11,29,优先队列:

1,经过结点3到其它结点:

2,3,6,7,10,9,7,7,5,6,3,4,10,7,7,9,9,9,10,9,11,30,X,优先队列:

1,经过结点4到其它结点:

2,3,6,7,10,9,7,5,6,3,10,7,7,9,9,9,10,9,11,31,X,4X7,优先队列:

1,经过结点6到其它结点:

2,3,6,7,10,9,7,5,3,10,7,7,9,9,9,10,9,11,32,X,4X7,6X,优先队列:

1,经过结点7到其它结点:

2,3,6,7,10,9,7,5,3,10,7,7,9,9,9,10,9,11,33,X,4X7,6X,X,优先队列:

1,经过结点10到其它结点:

2,3,6,7,10,9,7,5,3,10,7,7,9,9,9,9,11,34,X,4X7,6X,X,10X,6.2单源最短路径问题,复杂度分析计算时间为O(n!

)。

需要空间为O(n2)。

35,6.3装载问题,问题描述有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为wi,且装载问题要求确定是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。

如果有,找出一种装载方案。

如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。

首先将第一艘轮船尽可能装满;

(2)将剩余的集装箱装上第二艘轮船。

36,6.3装载问题,cw:

扩展结点所对应的载重量,37,2.算法描述目标:

寻找第一条船的最大装载方案。

解空间:

子集树。

数据结构:

queue:

存放活结点队列,队列中的元素值表示活结点对应的当前载重量。

元素值为-1,表示队列已到达解空间树同一层结点的尾部。

bestw:

当前最优载重量。

i:

表示扩展结点所处的层,6.3装载问题,2.队列式分支限界法maxLoading算法的while循环中,首先检测当前扩展结点的左儿子结点是否为可行结点。

如果是则将其加入到活结点队列中。

然后将其右儿子结点加入到活结点队列中(右儿子结点一定是可行结点)。

2个儿子结点都产生后,当前扩展结点被舍弃。

活结点队列中的队首元素被取出作为当前扩展结点,由于队列中每一层结点之后都有一个尾部标记-1,故在取队首元素时,活结点队列一定不空。

当取出的元素是-1时,再判断当前队列是否为空。

如果队列非空,则将尾部标记-1加入活结点队列,算法开始处理下一层的活结点。

maxLoading算法的时间和空间复杂性均为:

O(2n),38,2.队列式分支限界法,while(true)/搜索子集树/检查左儿子结点if(cw+wi=c)/xi=1enQueue(cw+wi,i);/右儿子结点总是可行的enQueue(cw,i);/xi=0cw=(Integer)queue.remove().intValue();/取下一扩展结点if(cw=-1)/同层结点尾部if(queue.isEmpty()returnbestw;queue.put(newInteger(-1);/同层结点尾部标志queue.remove().intValue();/取下一扩展结点i+;/进入下一层,39,rivatestaticvoidenQueue(intwt,inti)/将活结点加入到活结点队列中if(i=n)/可行叶结点,if(wtbestw)bestw=wt;else/非叶结点queue.put(newInteger(wt);,40,cw+w4c1x,A,B,C,1,cw=0,cw=8,Hcw=10,cw=8,bestw=11,cw=8cw+w2c1x,Ecw+w3c1,bestw=10N,O,cw+w4c1,cw=8,P,0cw=0,F,cw=8,I,cw+w3c1J,L,cw=0Gcw+w3c1,M,cw+w4c1,cw=6,R,Qcw=11,K,cw=8,voidbacktrack(inti)/搜索第i层结点if(in)/到达叶结点if(cwbestw)bestw=cw;return;if(cw+wi=c)/搜索左子树cw+=wi;backtrack(i+1);cw-=wi;/搜索右子树,backtrack(i+1);,例:

假定n=4,w=8,6,2,3,c1=12,41,2.队列式分支限界法,例:

假定n=4,w=8,6,2,3,c1=12,bestw:

0,i=1,cw=0,A,42,2.队列式分支限界法,例:

假定n=4,w=8,6,2,3,c1=12,bestw:

0,i=1,cw=0

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

当前位置:首页 > 党团工作 > 党团建设

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

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