第六章 分支限界法(1)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法思想
初始化,根结点为当前扩展结点E:
设置路径E.x[1:n]={1,2,3,…,n}
E.s=0
E.cc=0
E.rcost=minsum;//minsum为所有minout的和 队列中结点的优先级别: 结点路径的权值之和(cc) 小者优先
下界是什么呢? 下界=当前路径的权值和(cc)+剩下顶点的所有最小 出边和(rcost)
1
44 2
59 3
50 4 于是找到了一条最短 的周游路线: 1→2→3→5→4→1。
46 5
56 3 69 4 64 5
61 4
56 5 4
分支限界法小结
分支限界法是最佳优先 ( 包括广度优先在内 ) 的 搜索法,也是一种较为通用的算法。 其搜索的控制是采用有序的队列,即每次优先 搜索评价函数值最小的结点,从而希望较快地找到 最佳的路径或排列。 与其它算法相比,时间复杂性无本质区别。但 好的评价函数可有小的常数,提高了效率。 评价函数应该能正确有效地压缩状态空间。
[4, 30, 1]
[3, 50, 4]
取出 [4, [3, 50, 1] 4] 放入 Closed ;生成其后继 [3, [2, 50, 100, 4] 3] [5, 60, 3] ,因其已经是目标结点,算法成 初始时,将源 取出 [1, 30, [2, 0, 0] 10, 1] 放入 放入 [1, Closed 0, Closed 0]放入 ;生成其后继 ;生成其后继 Open,Closed [2, [3, 为空。 10, 60, 1] 2] 、 , 和 90, 60, 4][5, 3] ,前者因劣于 ,修订 Open 中已有的两个结点并依 Closed中的 [2, 10, 功并终止。 [4,[5, 并依序插入 30, 1]和 Open 100, 。 1],并依序放入 Open 。 1]而 序排列。 被抛弃,后者修订了 Open中的1→4→3→5 [5, 90, 4]。 。 依据逆向指针可得最短路径为
0-1背包问题
考虑如下0-1背包问题的实例: n=3, c=30, w=[16,15,15], p=[45,25,25] 队列式分支限界法: A B, C => B, C [B, C] D, E => E [C, E] F, G => F, G [E, F, G] J, K => K(45) [1,0,0] [F, G] L, M =>L(50) [0, 1, 1] M(25) [G] N, 0 =>N(25), O(0) 优先队列式分支限界法: A B, C => B(45), C(0) [B, C] D, E => E(45) [E, C] J, K => K(45) [1, 0, 0] [C] F, G => F(25), G(0) [F, G] L, M => L(50), [0, 1, 1] M(25) [G] N, O => N(25), O(0) 可用剪枝函数加速搜索
TSP问题采用的数据结构
H:最小堆,表示活结点优先队列。 结点E E.x[]:路径 E.s :当前结点在搜索树中的深度,从源顶点到当前 顶点的路径为E.x[0:s]。 E.cc:当前费用 E.rcost:x[s:n-1]中顶点最小出边费用和 E.lcost:优先队列的优先级,下界。 Minout[]:最小费用出边。 Minsum:最小费用出边和。 Bestc:当前最小费用。
看一个TSP例子
∞ 25 40 31 27 5 ∞ 17 30 25 19 15 ∞ 6 1 9 50 24 ∞ 6 22 8 7 10 ∞
Minout[] = {25,5,1,6,7},minsum= 44 E : E : s=0,cc s=3,cc ==25, = 0, 43, rcost rcost ==minsum=44, =14, 13, lcost=56,x=(1,2,3,5,4) lcost=0,X[]= (1,2,3,4,5) E : s=1,cc s=2,cc = 42, rcost rcost =19, lcost=44,x=(1,2,3,4,5) lcost=56,x=(1,2,3,4,5) E3:s=1,cc E4 s=2,cc = s=3,cc = 25, 42, rcost 48, rcost = = 19, 14, lcost=44,x=(1,2,3,4,5) 13, lcost=56,x=(1,2,3,4,5) lcost=61,x=(1,2,3,4,5) E2 E4:s=1,cc E5 s=2,cc = s=3,cc = 40, 55, rcost 43, rcost = = 19, 14, lcost=59,x=(1,3,2,4,5) 13, lcost=69,x=(1,2,4,3,5) lcost=56,x=(1,2,3,5,4) E3 E5:s=1,cc s=2,cc = = 31, 50,rcost rcost==19, 14,lcost=50,x=(1,4,3,2,5) lcost=64,x=(1,2,5,4,3) E4 E5:s=1,cc = 27, rcost = 19, lcost=46,x=(1,5,3,4,2)
按照优先队列中规定的优先级选取优先级最 高的节点成为扩展节点。
数据结构:优先队列(priority_queue,最大 堆)
分支限界法的一般算法
计算初始结点 s 的 f(s); [s,f(s),null] 插入队 列; while (队列 ≠Φ) { 从队列中取出 [p,f(p),x] 。 ( 根据具体方式, 可以选择下一结点或f(p)为最小(大)); 若 p 是目标,则成功返回;否则产生 p 的后继, 并将后继结点插入队列中(可以按照一定规 则淘汰一些结点) 将[p,f(p),x]从队列中删除; }
分支限界法与回溯法的比较
不同点:
扩展结点的方式不同:前者扩展结点有多次机 会成为扩展结点,后者只有一次机会。 存储空间的要求不同:分支限界法的存储空间 比回溯法大得多,因此当内存容量有限时, 回溯法成功的可能性更大
6.1 分支限界法的基本思想
扩展结点选取方式的不同导致不同的分支限界法。 1、FIFO分支限界法 将活结点表组织成为一个队列,按先进先出 原则选择下一个扩展结点。 数据结构:队列(queue) 2、优先队列分支限界法
分支限界法求单源最短路径
单源最短路径问题的评价函数的构造: f(d)定义为从源s到结点d所走的路径长度: f(d) = g(p) + C[p][d] 这里p为d的前驱结点,C[p][d]为p到d的距离。
源s的评价函数f(s) = 0。 评价函数的下界为0;上界初始时为∞,以后不 断用取得的更短路径的长度来替代。

用分支限界法解最短路径问题的算法
• ShortestPaths(int v){ 有关的数据结构: • H:最小堆,存放活结点 将结点E加入优先队列,E.i=v,E.length=0 • E:表示当前扩展结点, While(优先队列不为空E.I ){ 为顶点编号,E.length 为从源到I的距离。 • H.DeleteMin(E); Dist[j]:表示从源到j的最短路径长。 • C[][] if (E 为目标节点 ) break; :图 G的邻接矩阵 :记录前驱顶点。 • Prev[] For(int j = 1; j<=n; j++) • If(c[E.i][j]<inf&&E.length+C[E.i][j]<dist[j]){ • dist[j]= E.length+C[E.i][j]; prev[j]=E.i; • 将结点j加入优先队列中;} • } • }
6.7 用分支限界法求TSP
TSP 是求排列的问题,不是仅找一条路径而已。因 而需要对分支限界法的一般算法作些修改: (1) 待扩展的结点如果在本路径上已经出现,则不 再扩展,但若是在其他路径上出现过,则仍需要扩 展。 (2) 新结点,无论其优劣,既不影响其它路径上的 结点,也不受其它路径上的结点的影响,依据边界 函数决定结点是否可以剪去。
1 B D H I E
A
0 C F G
J K L M N O
6.2 单源最短路径问题
在下图所给的有向图 G中,每一边都有一个非负 边权。要求图 G的从源顶点 s 到目标顶点 t之间的最 短路径。
解空间树
下图是用优先队列式分支限界法解有向图 G 的单 源最短路径问题产生的解空间树。其中,每一个结 点旁边的数字表示该结点所对应的当前路长。wenku.baidu.com
该结点是路上除源结点以外的第 s个结点,叶结点标志为n-1
算法
1. 初始化:生成根结点E,E.s=0,E.x[i]=i, E.cc=0,E.rcost = minsum 2. While(E.s是非叶结点){ 3. if(E.s 是叶结点的父结点) 当一个叶结点成为 4. if(加上2条边是回路且优于最优解) 当前扩展结点,则 该结点对应的回路 5. {更新最优解; 更新E.cc,E.lcostE.s ++; H.Insert(E) ;} 的费用cc是所求 的 6. else { //E.s 不是叶结点的父结点 最优值。算法可以 7. for( i=E.s+1; i<=n; i++ ) { 结束。 8. swap( E.x[E.s+1], E.x[i] ) 9. if(E.x[E.s]到E.x[i] 有边) { 10. cc= E.cc + a[E.x[E.s]][E.x[i]] ; 11. rcost = E.rcost – Minout[E.x[E.s]] ; 剪枝的判断 12. if(cc + rcost <bestc ||bestc ==NoEdge) 13. 将结点插入H 14. } 15. swap( E.x[E.s+1], E.x[i] ) }//endelse 16. 取下一扩展结点。如果堆空,跳出循环。} 17. 返回结果 2015-7-3 bestc,当前最优解在 E.x[]中。 18 计算机算法设计与分析
6.5 0-1背包问题
下面是n=3的0-1背包问题的解空间树,其中:w =[16,15,15],p = [45,25,25],c =30 。采取 队列式分支限界法。
1 1 1
S111 S11
S1
SI
0
1
S0
0 1
S101
S10
0 1
S001
S00
0
S110
0
S100
1
S011
S01
0
S010
0
S000
分支限界法求最短路径举例
赋权图G 1 10 100 30 2 5
50 10 3 20 60 4
优先队列
[5, 90, 60, 4] 3] [5, 100, 1] [1, 0, 0]
删除的结点
[1, 0, 0] [2, 10, 1]
[3, 4] [4, 50, 30, 2] 60, 1]
[2, 30, [4, 10, 1]
第六章 分支限界法
分支限界法
分支限界法也是在问题的解空间树 T上搜索问 题解的算法。
分支限界法与回溯法的比较
相同点:都是在解空间树上搜索问题解 不同点: 求解目标不同:前者用的是深度优先搜索,后 者用的是广度优先搜索或以最小耗费优先的 方式搜索。 搜索方式不同:前者用的是深度优先搜索,后 者用的是广度优先搜索或以最小耗费优先的 方式搜索。
相关文档
最新文档