收藏 分享(赏)

算法设计与分析课件第6章_分支限界法.ppt

上传人:scg750829 文档编号:8271687 上传时间:2019-06-17 格式:PPT 页数:22 大小:611KB
下载 相关 举报
算法设计与分析课件第6章_分支限界法.ppt_第1页
第1页 / 共22页
算法设计与分析课件第6章_分支限界法.ppt_第2页
第2页 / 共22页
算法设计与分析课件第6章_分支限界法.ppt_第3页
第3页 / 共22页
算法设计与分析课件第6章_分支限界法.ppt_第4页
第4页 / 共22页
算法设计与分析课件第6章_分支限界法.ppt_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、1,第六章 分支限界法,2,第六章 分支限界法,本章主要知识点6.1 分支限界法的基本思想6.2 装载问题6.3 01背包问题6.4 批处理作业调度,3,6.1 分支限界法的基本思想,1. 分支限界法与回溯法的不同 (1)求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。 (2)搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。,4,6.1 分支限界法的基本思想,5,6.1 分支限界法的基本思想,2. 分支限界法基本思

2、想分支限界法的基本思想: 确定解空间的组织结构, 以广度优先或以最小耗费 ( 最大效益 ) 优先的方式搜索问题的解空间树。在搜索问题的解空间树时, 分支限界法与回溯法对当前扩展结点所使用的扩展方式不同。在分支限界法中, 每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点, 就一次性产生其所有儿子结点。在这些儿子结点中, 那些导致不可行解或导致非最优解的儿子结点被舍弃, 其余儿子结点被子加入活结点表中。此后, 从活结点表中取下一结点成为当前扩 展结点, 并重复上 述结点 扩展过 程。这个过程一直持续到找到所求的解或活结点表为空时为止.,6,6.1 分支限界法的基本思想,3. 常见的两种

3、分支限界法 (1)队列式(FIFO)分支限界法按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。 (2)优先队列式分支限界法按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。,7,6.2 装载问题,1. 问题描述,有一批n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集 装箱i的重量为Wi,且,装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。,容易证明:如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。 (1)首先将第一艘轮船尽可能装满; (2)将剩余的集装箱装上第二艘轮船。,8,6.2 装载问题,2. 队

4、列式分支限界法在算法的while循环中,首先检测当前扩展结点的左儿子结点是否为可行结点。如果是则将其加入到活结点队列中。然后将其右儿子结点加入到活结点队列中(右儿子结点一定是可行结点)。2个儿子结点都产生后,当前扩展结点被舍弃。活结点队列中的队首元素被取出作为当前扩展结点,由于队列中每一层结点之后都有一个尾部标记-1,故在取队首元素时,活结点队列一定不空。当取出的元素是-1时,再判断当前队列是否为空。如果队列非空,则将尾部标记-1加入活结点队列,算法开始处理下一层的活结点。,9,6.2 装载问题,2. 队列式分支限界法,while (true) if (ew + wi = c) enQueue

5、(ew + wi, i); / 检查左儿子结点enQueue(ew, i); /右儿子结点总是可行的ew = (Integer) queue.remove().intValue(); / 取下一扩展结点if (ew = -1) if (queue.isEmpty() return bestw;queue.put(new Integer(-1); / 同层结点尾部标志ew = (Integer) queue.remove().intValue(); / 取下一扩展结点i+; / 进入下一层 ,10,6.2 装载问题,3. 算法的改进节点的左子树表示将此集装箱装上船,右子树表示不将此集装箱装上船。

6、设bestw是当前最优解;ew是当前扩展结点所相应的重量;r是剩余集装箱的重量。则当ew+rbestw时,可将其右子树剪去,因为此时若要船装最多集装箱,就应该把此箱装上船。另外,为了确保右子树成功剪枝,应该在算法每一次进入左子树的时候更新bestw的值。,11,6.2 装载问题,3. 算法的改进,/ 检查左儿子结点int wt = ew + wi; if (wt bestw) bestw = wt;/ 加入活结点队列if (i n) queue.put(new Integer(wt);,提前更新bestw,/ 检查右儿子结点if (ew + r bestw / 取下一扩展结点,右儿子剪枝,12

7、,6.2 装载问题,4. 构造最优解为了在算法结束后能方便地构造出与最优值相应的最优解,算法必须存储相应子集树中从活结点到根结点的路径。为此目的,可在每个结点处设置指向其父结点的指针,并设置左、右儿子标志。 private static class QNode QNode parent; / 父结点boolean leftChild; / 左儿子标志int weight; / 结点所相应的载重量,13,6.2 装载问题,找到最优值后,可以根据parent回溯到根节点,找到最优解。 / 构造当前最优解for (int j = n; j 0; j-)bestxj = (e.leftChild) ?

8、 1 : 0;e = e.parent;,14,6.2 装载问题,5. 优先队列式分支限界法解装载问题的优先队列式分支限界法用最大优先队列存储活结点表。活结点x在优先队列中的优先级定义为从根结点到结点x的路径所相应的载重量再加上剩余集装箱的重量之和。优先队列中优先级最大的活结点成为下一个扩展结点。以结点x为根的子树中所有结点相应的路径的载重量不超过它的优先级。子集树中叶结点所相应的载重量与其优先级相同。在优先队列式分支限界法中,一旦有一个叶结点成为当前扩展结点,则可以断言该叶结点所相应的解即为最优解。此时可终止算法。,15,6.3 0-1背包问题,算法的思想首先,要对输入数据进行预处理,将各物

9、品依其单位重量价值从大到小进行排列。在下面描述的优先队列分支限界法中,节点的优先级由已装袋的物品价值加上剩下的最大单位重量价值的物品装满剩余容量的价值和。算法首先检查当前扩展结点的左儿子结点的可行性。如果该左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中。当前扩展结点的右儿子结点一定是可行结点,仅当右儿子结点满足上界约束时才将它加入子集树和活结点优先队列。当扩展到叶节点时为问题的最优值。,16,6.3 0-1背包问题,上界函数 while (i = n /b为上界函数,17,6.3 0-1背包问题,while (i != n + 1)/ 非叶结点double wt = cw + wi

10、;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);/ 取下一个扩展节点(略) ,分支限界搜索过程,18,6.4 批处理作业问题,1. 问题的描述,给定n个作业的集合J=J1,J2,Jn。每一个作业Ji都有2项任务要分别在2台机器上完成。每一个作业必须先由机器1处理,然后再由机器2处理。作业Ji需要机器j的处理时间为t

11、ji,i=1,2,n;j=1,2。对于一个确定的作业调度,设是Fji是作业i在机器j上完成处理的时间。则所有作业在机器2上完成处理的时间和,称为该作业调度的完成时间和。批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。,19,6.4 批处理作业问题,2. 限界函数,在结点E处相应子树中叶结点完成时间和的下界是:,注意到如果选择Pk,使t1pk在k=r+1时依非减序排列,S1则取得极小值。同理如果选择Pk使t2pk依非减序排列,则S2取得极小值。,这可以作为优先队列式分支限界法中的限界函数。,20,6.4 批处理作业问题,3. 算法描述,算法的while循环

12、完成对排列树内部结点的有序扩展。在while循环体内算法依次从活结点优先队列中取出具有最小bb值(完成时间和下界)的结点作为当前扩展结点,并加以扩展。,首先考虑enode.s=n的情形,当前扩展结点enode是排列树中的叶结点。enode.sf2是相应于该叶结点的完成时间和。当enode.sf2 bestc时更新当前最优值bestc和相应的当前最优解bestx。,当enode.sn时,算法依次产生当前扩展结点enode的所有儿子结点。对于当前扩展结点的每一个儿子结点node,计算出其相应的完成时间和的下界bb。当bb bestc时,将该儿子结点插入到活结点优先队列中。而当bb bestc时,可

13、将结点node舍去。,21,6.4 批处理作业问题,doif (enode.s = n ) / 叶结点if (enode.sf2 bestc) bestc = enode.sf2;for (int i = 0; i n; i+)bestxi = enode.xi;,3. 算法描述,当enode.sf2bestc时,更新当前最优值beste和相应的最优解bestx,22,6.4 批处理作业问题,3. 算法描述,else / 产生当前扩展结点的儿子结点for (int i = enode.s; i n; i+) MyMath.swap(enode.x, enode.s,i);int f= new int 3;int bb=bound(enode,f);if (bb bestc ) HeapNode node=new HeapNode(enode,f,bb,n);heap.put(node); MyMath.swap(enode.x, enode.s,i); / 完成结点扩展,当bbbestc时,将儿子结点插入到活结点优先队列中,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报