版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
分支限界法
6.1分支限界方法概述在解空间树中,以广度优先或以最小耗费(最大效益)优先的方式搜索利用部分解的最优信息,裁剪那些不能得到最优解的子树以提高搜索效率搜索策略是:在扩展结点处,先生成其所有的儿子结点(分支)舍弃导致不可行解或导致非最优解的儿子结点,其余儿子结点被加入活结点表中从当前的活结点表中选择下一个扩展结点持续此过程直到找到所需的解或活结点表为空2方法概述:基本思想为了有效地选择下一扩展结点,以加速搜索的进程,在每一活结点处,计算一个函数值(限界),并根据这些已计算出的函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便尽快地找出一个最优解。3分支限界法与回溯法的区别求解目标不同:一般而言,回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解;搜索方法不同:回溯算法使用深度优先方法搜索,而分枝限界一般用宽度优先或最小耗费方法来搜索;
4分支限界法与回溯法的区别对扩展结点的扩展方式不同:分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点;存储空间的要求不同:相对而言,分枝限界法的存储空间比回溯法大得多,因此当内存容量有限时,回溯法成功的可能性更大
5方法概述:求解步骤①定义解空间(对解编码);②确定解空间的树结构;③按BFS等方式搜索:
a.每个活结点仅有一次机会变成扩展结点;
b.由扩展结点生成一步可达的新结点;
c.在新结点中,删除不可能导出最优解的结点;//剪枝策略
d.将余下的新结点加入活动表(队列)中;
e.从活动表中选择结点再扩展;//选择策略
f.直至活动表为空;6方法概述:
两种常见的活结点扩展方式先进先出队列(FIFO):即从活结点表中取出结点的顺序与加入结点的顺序相同;优先队列:每个结点都有一个对应的耗费或收益。如果查找一个具有最小耗费的解,下一个扩展结点就是具有最小耗费的活结点;如果希望搜索一个具有最大收益的解,下一个扩展结点是具有最大收益的活结点。7方法概述:示例1示例1(FIFO队列分枝限界法)问题:0-1背包问题:物品数n=3,重量w=(20,15,15),价值v=(40,25,25),背包容量c=30,试装入最大价值之和的物品?求解:①解空间:{(0,0,0),(0,0,1),…,(1,1,1)}②解空间树:DBHAIEJKFCLMGNO111111100000008方法概述:示例1③BFS搜索(FIFO队列)扩展结点活结点队列(可行结点)可行解(叶结点)解值
AB,CBCBD,E(D死结点)CECF,GEFGEJ,K(J死结点)FGK40FL,MGL,M50,25GN,OφN,O25,0
∴最优解为L,即(0,1,1);解值为50DBHAIEJKFCLMGNO11111110000000w=(20,15,15),v=(40,25,25),c=309方法概述:示例2示例2(优先队列分枝限界法)问题:0-1背包问题:物品数n=3,重量w=(20,15,15),价值v=(40,25,25),背包容量c=30,试装入最大价值之和的物品?求解:①解空间:{(0,0,0),(0,0,1),…,(1,1,1)}②解空间树:DBHAIEJKFCLMGNO1111111000000010方法概述:示例2BFS搜索(优先队列:按价值率优先)扩展结点活结点堆(可行结点)可行解(叶结点)解值
AB,CBD,E(D死结点)EJ,K(J死结点)K40CF,G
FL,ML
50(最优)GN,OφBCECFGCGDBHAIEJKFCLMGNO11111110000000w=(20,15,15),v=(40,25,25),c=3011Branch&Bound例:用分支限界法求解分配问题分配问题:设有n个人,每个人都可以完成n种不同的任务,但所需时间不同。要求每人完成一项工作,则应如何分配n个人并使完成所有n项工作的总时间为最小。12可行解:满足以下约束条件:分配一人且仅一人去做每项工作的解称为分配问题的可行解考虑n=4的情况。 A,B,C,D四个人分别完成1、2、3、4。这时问题有4!=24个可行解13人工作1234A21097B154148C13141611D415139
14人1234
A21097
B154148
C13141611
D41513922A做1B做1C做1D做1274133243624342831A做2B做2C做2A做3C做3283739B做2C做2D做2A→3,B→2,C→4,D→1,总时间为28例1:用分支限界法求解分配问题15相关知识回顾:堆(Heap)堆给定一个序列A[]={A[1],A[2],…,A[n]},可以按如下的方式构造一棵二叉树:A[1]为根对任何一个A[i],它的左儿子是A[2i],右儿子是A[2i+1]如果2i或2i+1超过n,则A[i]没有相对应的那个儿子16A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]A[9]堆堆所构造的树有如下性质所有叶子在树的最底层或倒数第二层如果最底层的节点不能完全填满,则总是在最左边这样的树叫左-完全二叉树17堆堆如果一个左-完全二叉树有下列性质:任何一个非叶节点的值都大于等于(或小于等于)它的儿子的值则这个树称为大(小)顶堆一个堆对应的序列显然有如下性质:大顶堆小顶堆18堆堆96,83,27,38,11,99683273811912,36,24,85,47,30,53,91123624854730539119堆堆—堆调整取出极值元素,仍保持堆性质假设已经有一个现成的(大顶)堆将堆顶(根)的最大元素和序列的最后一个元素交换对除了尾元素之外的元素继续建成堆20堆50243020211831256堆—堆调整
假设已经有一个堆,把堆顶元素和最后一个元素交换624302021183125500)剩下的序列中,堆的性质被破坏,调整堆就是把剩余的序列重新建成堆21堆堆—堆调整1)新的堆顶元素小于它的儿子,所以不能构成堆,调整它的位置把它和较大的儿子交换62430202118312550302462021183125502)调整后,右子树的根仍小于它的儿子,所以把它和它的大儿子交换22堆堆—堆调整3)新堆构成3024182021631255023堆堆—堆建立堆建立是把一个无序的序列建成一个堆的过程它是思想是从最底层的子树进行堆调整,先将子树建成堆,然后继续调整,直到整个树构成堆202135618301250242021352418301250624堆堆—堆建立堆建立是把一个无序的序列建成一个堆的过程它是思想是从最底层的子树进行堆调整,先将子树建成堆,然后继续调整,直到整个树构成堆202135024183012562021305024183125625堆堆—堆建立堆建立是把一个无序的序列建成一个堆的过程它是思想是从最底层的子树进行堆调整,先将子树建成堆,然后继续调整,直到整个树构成堆2050302124183125650243021201831256266.2 单源最短路径问题1.问题描述单源最短路径问题:在下图所给的有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径。
276.2 单源最短路径问题
下图是用优先队列式分支限界法解有向图G的单源最短路径问题产生的解空间树。其中,每一个结点旁边的数字表示该结点所对应的当前路长。286.2 单源最短路径问题:基本思想优先队列式分支限界法:用极小堆存储活结点表;其优先级是结点所对应的当前路长。从图G的源顶点s和空优先队列开始结点s被扩展后,它的儿子结点被依次插入堆中。从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点如果从当前扩展结点i到顶点j有边可达,且从源出发,途经顶点i再到顶点j的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中(剪枝)结点的扩展过程一直继续到活结点优先队列为空时为止。296.2 单源最短路径问题剪枝策略在算法扩展结点的过程中,一旦发现一个结点的下界不小于当前找到的最短路长,则剪去以该结点为根的子树利用结点间的控制关系进行剪枝。从源顶点s出发,2条不同路径到达图G的同一顶点。由于两条路径的路长不同,因此可以将路长大的路径所对应的树中结点为根的子树剪去30路径(a,e,q)与(c,h)到达同一节点分别对应的费用为5和6。称搜索树中节点A控制了B。因此可将B节点的子树剪去AB
while(true){//搜索问题的解空间
for(intj=1;j<=n;j++)//顶点i到顶点j可达,且满足控制约束
if(a[enode.i][j]<Float.MAX_VALUE&&enode.length+a[enode.i][j]<dist[j]){
dist[j]=enode.length+a[enode.i][j];p[j]=enode.i;HeapNodenode=newHeapNode(j,dist[j]);heap.put(node);//加入活结点优先队列
}
if(heap.isEmpty())break;elseenode=(HeapNode)heap.removeMin();}顶点I和j间有边,且此路径长小于原先从原点到j的路径长31enode:当前扩展节点a:邻接矩阵6.3装载问题1.问题描述有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为Wi,且装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。容易证明:如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。(1)首先将第一艘轮船尽可能装满;(2)将剩余的集装箱装上第二艘轮船。326.3装载问题:队列式分支限界法节点扩展检测当前扩展结点的左儿子结点是否为可行结点。如果是则将其加入到活结点队列中。将其右儿子结点加入到活结点队列中(右儿子结点一定是可行结点)。2个儿子结点都产生后,当前扩展结点被舍弃。获得下一节点活结点队列中,队首元素被取出作为当前扩展结点。队列中每一层结点之后,都有一个尾部标记-1。在取队首元素时,活结点队列一定不空。当取出的元素是-1时,再判断当前队列是否为空。如果队列非空,则将尾部标记-1加入活结点队列,算法开始处理下一层的活结点336.3装载问题:队列式分支限界法while(true){if(ew+w[i]<=c)enQueue(ew+w[i],i);//检查左儿子结点
enQueue(ew,i);//右儿子结点总是可行的
ew=queue.remove();//取下一扩展结点
if(ew==-1){if(queue.isEmpty())returnbestw;queue.put(-1);//同层结点尾部标志
ew=queue.remove();//取下一扩展结点
i++;//进入下一层
}}34节点的左子树表示将此集装箱装船,右子树表示不将此集装箱装船。设bestw是当前最优解;ew是当前扩展结点所相应的重量;r是剩余集装箱的重量。当ew+rbestw时,可将其右子树剪去。此时若要船装最多集装箱,就应该把此箱装上船。为确保右子树成功剪枝,应该在算法每一次进入左子树的时候更新bestw的值。算法MaxLoading初始时bestw=0,直到搜索到第一个叶结点才更新bestw。在搜索到第一个叶结点前,总有ew+r>bestw,此时右子树测试不起作用。6.3装载问题:队列式分支限界法算法改进356.3装载问题3.算法的改进//检查左儿子结点
intwt=ew+w[i];if(wt<=c){//可行结点
if(wt>bestw)bestw=wt;
//加入活结点队列
if(i<n)queue.put(wt);}提前更新bestw//检查右儿子结点,可能含最优解
if(ew+r>bestw&&i<n)queue.put(newInteger(ew));//取下一扩展结点
ew=queue.remove();右儿子剪枝36解装载问题的优先队列式分支限界法用最大优先队列存储活结点表。活结点x在优先队列中的优先级定义为从根结点到结点x的路径所相应的载重量再加上剩余集装箱的重量之和。优先队列中优先级最大的活结点成为下一个扩展结点。以结点x为根的子树中,所有结点相应路径的载重量不超过它的优先级。子集树中叶结点所相应的载重量与其优先级相同。在优先队列式分支限界法中,一旦有一个叶结点成为当前扩展结点,则可以断言该叶结点所相应的解即为最优解。此时可终止算法。6.3装载问题:优先队列式376.50-1背包问题算法思想:先对输入数据进行预处理,将物品依其单位重量价值从大到小进行排列。在优先队列分支限界法中,结点优先级由已装袋的物品价值加上剩下的最大单位重量价值的物品装满剩余容量的价值。用一个最大堆来实现活结点优先队列3839算法首先检查当前扩展结点的左儿子结点的可行性。如果左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中。当前扩展结点的右儿子结点一定是可行结点,仅当右儿子结点满足上界约束时,才将它加入子集树和活结点优先队列。当扩展到叶节点时为问题的最优值。6.50-1背包问题上界函数while(i<=n&&w[i]<=cleft)//n表示物品总数,cleft为剩余空间
{cleft-=w[i];//w[i]表示i所占空间
b+=p[i];//p[i]表示i的价值
i++;}if(i<=n)b+=p[i]/w[i]*cleft;//装填剩余容量装满背包returnb;//b为上界函数406.50-1背包问题while(i!=n+1){//非叶结点
doublewt=cw+w[i];if(wt<=c){//左儿子结点为可行结点
if(cp+p[i]>bestp)bestp=cp+p[i];addLiveNode(up,cp+p[i],cw+w[i],true,i+1);}up=bound(i+1);if(up>=bestp)//检查右儿子节点,且右子树可能含最优解
addLiveNode(up,cp,cw,false,i+1);
//取下一个扩展节点(略)}416.6最大团问题最大团问题的解空间树是一棵子集树1.问题描述给定无向图G=(V,E)。如果UV,且对任意u,vU有(u,v)E,则称U是G的完全子图。解最大团问题的优先队列式分支限界法,与解装载问题的优先队列式分支限界法相似。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。4243下图G中,子集{1,2}是G的大小为2的完全子图。这个完全子图不是团,因为它被G的更大的完全子图{1,2,5}包含。{1,2,5}是G的最大团。{1,4,5}和{2,3,5}也是G的最大团。2.上界函数活结点优先队列中元素类型为CliqueNodeun作为优先队列中元素的优先级对每个活结点,用cn表示与该结点相应团的顶点数;level表示结点在子集空间树中所处的层次;用cn+n-level+1作为顶点数上界un的值,其中un是该结点为根的子树中最大顶点数的上界。算法总是从活结点优先队列中,抽取具有最大un值的元素作为下一个扩展结点。443.算法思想子集树的根结点是初始扩展结点,对于这个特殊的扩展结点,其cn的值为0。cn表示当前团的顶点数。算法在扩展内部结点时,首先考察其左儿子结点。在左儿子结点处,将顶点i加入到当前团中,并检查该顶点与当前团中其它顶点之间是否有边相连。当顶点i与当前团中所有顶点之间都有边相连,则相应的左儿子结点是可行结点,将它加入到子集树中并插入活结点优先队列,否则就不是可行结点。45while循环的终止条件是:遇到子集树中的一个叶结点(即n+1层结点)成为当前扩展结点。继续考察当前扩展结点的右儿子结点。对于子集树中的叶结点,有un=cn。此时活结点优先队列中,剩余结点的un值均不超过当前扩展结点的un值。进一步搜索不可能得到更大的团,此时算法已找到一个最优解。
un是当前团最大顶点数的上界,cn表示当前团的顶点数。当un>bestn时,右子树中可能含有最优解,此时将右儿子结点加入到子集树中,并插入到活结点优先队列中。466.7旅行售货员问题1.问题描述已知各城市之间的路程(或旅费)。选定一条从驻地出发,经过每个城市一次,最后回到驻地的路线,使总的路程(或总旅费)最小。路线是一个带权图。图中各边的费用(权)为正数。图的一条周游路线是包括V中的每个顶点在内的一条回路。周游路线的费用是这条路线上所有边的费用之和。旅行售货员问题的解空间可以组织成一棵排列树,从树的根结点到任一叶结点的路径定义了图的一条周游路线。旅行售货员问题要在图G中找出费用最小的周游路线。48与子集树的讨论相似,实现对排列树搜索的优先队列式分支限界法的实现方式:(1)用优先队列来存储活结点。优先队列中每个活结点都存储从根到该活结点的相应路径。(2)用优先队列来存储活结点,并同时存储当前已构造出的部分排列树。优先队列中的活结点不必存储从根到该活结点的相应路径,该路径必要时从存储的部分排列树中获得。以第一种方式进行讨论2.算法描述要找最小费用旅行售货员回路,选用最小堆表示活结点优先队列。堆中每个结点的子树费用的下界lcost值,是优先队列的优先级。计算每个顶点的最小费用出边并用minout记录如果所给的有向图中某个顶点没有出边,则该图不可能有回路,算法结束。如果每个顶点都有出边,则根据计算出的minout作算法初始化。49考虑排列树层次s=n-2的情形,此时当前扩展结点是排列树中某个叶结点的父结点。while循环完成对排列树内部结点的扩展。对于当前扩展结点,算法分两种情况进行处理:如果该叶结点相应一条可行回路,且费用小于当前最小费用,则将该叶结点插入到优先队列中,否则舍去该叶结点。第一种情况:50
51当排列树层次s<n-2时,依次产生当前扩展结点的所有儿子结点。第二种情况:当前扩展结点所相应的路径是x[0:s],其可行儿子结点是从剩余顶点x[s+1:n-1]中选取的顶点x[i],且(x[s],x[i])是所给有向图G中的一条边。对于当前扩展结点的每一个可行儿子结点,计算出其前缀(x[0:s],x[i])的费用cc和相应的下界lcost。当lcost<bestc时,将这个可行儿子结点插入到活结点优先队列中。while循环的终止条件:排列树的一个叶结点成为当前扩展结点当s=n-1时,已找到的回路前缀是x[0:n-1],它已包含图G的所有n个顶点。因此,当s=n-1时,相应的扩展结点表示一个叶结点。该叶结点所相应的回路的费用等于当前费用cc和子树费用下界lcost的值。算法描述52
53剩余活结点的lcost值,不小于已找到的回路的费用。它们都不可能导致费用更小的回路。已找到叶结点所相应的回路,是一个最小费用旅行售货员回路,算法结束。算法结束时,返回找到的最小费用,相应的最优解由数组v给出。算法描述算法代码见P214-216(第三版)
TSP问题示例minout=[4,5,5,4]5433343181922323184181354192254253N-1层:6.9批处理作业调度问题同顺序任务加工问题:设有4项待加工的任务J1,J2,J3,J4,它们的工序相同:每个任务必须先在机器M1上加工,然后在机器M2上加工,最后在M3上加工。各加工时间已知。求一最佳加工顺序使得尽早完工。55设tij为任务Ji在机器Mj上的加工时间,且加工时间矩阵T为:T=J1J2J3J457910529957810M1M2M3
=(tij)4*356如若加工顺序是:
J2→J3→J1→J4则从开始到结束所需的时间可计算如下图:57理想的加工安排是:M2无空闲,最后一个在M3上加工的任务时间最短。估计下界:比如从Ji开始的加工顺序,估计加工所需的最短时间为:
4
ti1+Σtj2+min{tk3}
j=1k≠i
58M1先加工J1
4
ti1+Σtj2+min{tk3}
j=1k≠i
4
t11+Σtj2+min{tk3}
j=1k≠1T=J1J2J3J457910529957810
M1M2M3
=5+(7+5+9+8)+2=3659M1先加工J2
4
ti1+Σtj2+min{tk3}
j=1k≠i
4
t21+Σtj2+min{tk3}
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度山西省高校教师资格证之高等教育心理学自测模拟预测题库
- 学校垃圾分类督导员工作总结
- 2024年智能设备硬件采购协议
- 2024室内装潢工程合作协议书
- 2024广告服务公司与客户协议
- 2024年供应商协议格式
- 2024年专项事务跟踪代理协议模板
- 2024城市地下停车场租赁协议
- 2024年商品交易协议模板
- 2024年稻草批发销售协议范本
- 东尼 博赞经典书系(套装5册):超级记忆
- DPPH和ABTS、PTIO自由基清除实验-操作图解-李熙灿-Xican-Li
- 高中生物教研组工作计划(通用9篇)
- 郴州市建筑节能产品(材料)备案证明
- 汽车外覆盖件
- 公共政策课件 swot分析与美国西南航空公司的成功
- 西方经济学十大原理
- 函数的奇偶性(第二课时) (知识精讲+备课精研) 高一数学 课件(苏教版2019必修第一册)
- xx学校“无废校园”创建推进工作总结
- GB/T 23704-2017二维条码符号印制质量的检验
- GB 10205-2001磷酸一铵、磷酸二铵
评论
0/150
提交评论