




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、12问题1:回溯法是怎样种搜索方法?有什么特点?两个问题两个问题 回溯法可以系统地搜索一个问题的回溯法可以系统地搜索一个问题的解空间,是一种既带有系统性又带有跳解空间,是一种既带有系统性又带有跳跃性的搜索方法。跃性的搜索方法。系统性系统性使用深度优先搜索法系统使用深度优先搜索法系统搜索解空间树搜索解空间树跳跃性跳跃性剪枝剪枝问题2:将深度优先搜索换为宽度优先搜索会有什么特点?3 分枝限界法可以系统地搜索一个问题的解空间,它也是一种既带有系统性又带有跳跃性的搜索方法。 系统性宽度优先或优先队列搜索法系统地搜索解空间树 跳跃性剪枝分枝限界法的特点分枝限界法的特点4 学习要点学习要点 理解分支限界法
2、的剪枝搜索策略。 掌握分支限界法的算法框架 (1)队列式(FIFO)分支限界法 (2)优先队列式分支限界法 通过应用范例学习分支限界法的设计策略。 (1)单源最短路径问题 (2)装载问题; (3)0-1背包问题; (5)最大团问题; (6)旅行售货员问题5分支限界法与回溯法(1 1)求解目标不同:)求解目标不同: 回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。 (2 2)搜索方式不同:)搜索方式不同: 回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜
3、索解空间树。 分支限界法类似于回溯法,也是一种在问题的解空间树T中搜索问题解的算法。6(3 3)对扩展结点的扩展方式不同:)对扩展结点的扩展方式不同: 分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点;(4 4)存储空间的要求不同:)存储空间的要求不同: 相对而言,分枝限界法的存储空间比回溯法大得多,因此当内存容量有限时,回溯法成功的可能性更大;7分支限界法的搜索策略是: 在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展结点。为了有效地选择下一扩展结点,加速搜索的进程,在每一个活结点处,计算一个函数值(限
4、界),并根据函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。这种方法称为分支限界法。分支限界法。86.1 分支限界法的基本思想 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。 此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。 在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中
5、。9求解步骤定义解空间(对解编码);确定解空间的树结构;按BFS等方式搜索: a.每个活结点仅有一次机会变成扩展结点; b.由扩展结点生成一步可达的新结点; c.在新结点中, 删除不可能导出最优解的结点; /剪枝策略 d.将余下的新结点加入活动表(队列)中; e.从活动表中选择结点再扩展; /选择策略 f.直至活动表为空;10两种常见的活结点扩充方式v 先进先出队列(F I F O) : 将活结点表组织成一个队列,并按队列的先进先出的原则选取下一个结点为扩展结点。v 优先队列(耗费用小根堆,受益用大根堆): 每个结点都有一个对应的耗费或收益。 如果查找一个具有最小耗费的解,则活结点表可用最小堆
6、来建立,下一个扩展结点就是具有最小耗费的活结点; 如果希望搜索一个具有最大收益的解,则可用最大堆来构造活结点表,下一个扩展结点是具有最大收益的活结点。 11示例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) 解空间树:DBHAIEJKFCLMGNO1111111000000012BFS搜索(FIFO队列) 扩展结点 活结点 队列(可行结点) 可行解(叶结点) 解值 A B,C BC B D,E
7、(D死结点) CE C F,G EFG E J,K(J死结点) FG K 40 F L,M G L,M 50,25 G N,O N,O 25,0 不搜索一不可行结点为根的子树 最优解为L, 即(0,1,1); 解值为50 DBHAIEJKFCLMGN O11111110000000w=(20,15,15), w=(20,15,15), 价值价值v=(40,25,25), v=(40,25,25), 背包容量背包容量c=30c=3013示例2 (优先队列分枝限界法)问题: 0-1背包问题:物品数n=3, 重量w=(20,15,15), 价值v=(40,25,25), 背包容量c=30, 试装入最
8、大价值之和的物品?求解: 解空间:(0,0,0), (0,0,1), , (1,1,1) 解空间树:DBHAIEJKFCLMGNO1111111000000014BFS搜索(优先队列:按价值率优先) 扩展结点 活结点 队列(可行结点) 可行解(叶结点) 解值 A B,C B D,E(D死结点) E J,K(J死结点) K 40 C F,G F L,M L 50(最优) G N,O BCECFGCGDBHAIEJKFCLMGN O11111110000000可用剪枝函数加速搜索w=(20,15,15), w=(20,15,15), 价值价值v=(40,25,25), v=(40,25,25),
9、背包容量背包容量c=30c=3015示例 旅行售货员问题 队列式分支限界法:A B, C, DB, C, D E, FC, D, E, F G, HD, E, F, G, H I, JE, F, G, H, I, J K(59) 1,2,3,4F, G, H, I, J L(66)G, H, I, J M(25) 1, 3, 2, 4H, I, J 1-3-4(26)I, J O(25)J P(59) 优先队列式分支限界法:A B, C, D = B(30), C(6), D(4)D, C, B I, J = I(14), J(24)C, I, J, B G, H = G(11), H(26)
10、G, I, J, H, B M = M(25) 1, 3, 2, 4I, J, H, B O = O(25)J, H, B P = P(59)H,B H, B限界掉1234643020510ABCDEFGHIJKLMNOP16分枝限界算法形式及终止条件分枝限界算法形式及终止条件 从树T的根结点开始,用宽度优先搜索或者优先队列搜索方法来搜索该树,并跳过肯定不包含问题解对应的结点的子树的搜索(剪枝),以提高效率。算法形式算法形式: 一般是迭代形式。算法终止的条件:算法终止的条件: 求存在性问题时,找到问题的一个解即可结束;在求优化问题时,一般要求活结点表为空时才结束,但是在满足一定条件时可在找到一
11、个解即可结束(该解即为最优解)。17分枝限界法的特性分枝限界法的特性时间性能:最坏的情况要搜索整个解空间,其复杂度是指数型。但如果启发式信息强且剪枝操作有力的话,平均性能往往很好。空间性能:为了保存活结点往往需要较大的空间开销。186.2 单源最短路径问题1. 问题描述 下面以一个例子来说明单源最短路径问题:在下图所给的有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径。 196.2 单源最短路径问题1. 问题描述 下图是用优先队列式分支限界法解有向图G的单源最短路径问题产生的解空间树。其中,每一个结点旁边的数字表示该结点所对应的当前路长。206.2 单源最短路
12、径问题2. 算法思想 解单源最短路径问题的优先队列式分支限界法用一极小堆来存储活结点表。其优先级是结点所对应的当前路长。 算法从图G的源顶点s和空优先队列开始。结点s被扩展后,它的儿子结点被依次插入堆中。此后,算法从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点。如果从当前扩展结点i到顶点j有边可达,且从源出发,途经顶点i再到顶点j的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中。这个结点的扩展过程一直继续到活结点优先队列为空时为止。216.2 单源最短路径问题3. 剪枝策略 在算法扩展结点的过程中,一旦发现一个结点的
13、下界不小于当前找到的最短路长,则算法剪去以该结点为根的子树。 在算法中,利用结点间的控制关系进行剪枝。从源顶点s出发,2条不同路径到达图G的同一顶点。由于两条路径的路长不同,因此可以将路长长的路径所对应的树中的结点为根的子树剪去。 226.2 单源最短路径问题Void Graph:ShortestPath(int v) /单源最短路径问题的优先队列式分支限界法 /定义最小堆的容量为1000 MinHeap MinHeapNode H(1000); /定义源为初始扩展结点 MinHeapNode E; E.i=v; E.length=0; distv=0; /搜索问题的解空间236.2 单源最短
14、路径问题 while (true) for (int j = 1; j = n; j+) if (cE.ijinf)&(E.length+cE.ijdistj) / 顶点i到顶点j可达,且满足控制约束 distj=E.length+cE.ij; prevj=E.i; / 加入活结点优先队列 MinHeapNode N; N.i=j; N.length=distj; H.Insert(N); try H.DeleteMin(E); / 取下一扩展结点 catch (OutOfBounds) break; / 优先队列空 顶点顶点I I和和j j间有边,且此间有边,且此路径长小于原先从原点
15、路径长小于原先从原点到到j j的路径长的路径长 246.3 装载问题1. 问题描述v有一批共个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集 装箱i的重量为Wi,且211ccwniiv装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。 v容易证明:如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。 (1)首先将第一艘轮船尽可能装满;(2)将剩余的集装箱装上第二艘轮船。 256.3 装载问题2. 队列式分支限界法MaxLoading 在开始时将i初始化为1,bestw初始化为0,此时活结点队列为空。将同层结点尾部标志-1加入到活结点
16、队列中,表示此时位于第1层结点的尾部。Ew存储当前扩展结点所相应的重量。266.3 装载问题v 在算法的while循环中,首先检测当前扩展结点的左儿子结点是否为可行结点。如果是则将其加入到活结点队列中。然后将其右儿子结点加入到活结点队列中(右儿子结点一定是可行结点)。2个儿子结点都产生后,当前扩展结点被舍弃。v 活结点队列中的队首元素被取出作为当前扩展结点,由于队列中每一层结点之后都有一个尾部标记-1,故在取队首元素时,活结点队列一定不空。当取出的元素是-1时,再判断当前队列是否为空。如果队列非空,则将尾部标记-1加入活结点队列,算法开始处理下一层的活结点。2. 队列式分支限界法276.3 装
17、载问题2. 队列式分支限界法Type MaxLoading (Type w ,Type c,int n) /队列式分支限界法,返回最优载重量 /初始化 Queue Q; /活结点队列 Q.Add(-1); /同层结点尾部标志 int i=1; /当前扩展结点所处的层 Type Ew=0; /扩展结点所相应的载重量 bestw=0; /当前最优载重量 /搜索子集空间树286.3 装载问题2. 队列式分支限界法while (true) / 检查左儿子结点 if (Ew + wi = c) / xi = 1 EnQueue(Q, Ew + wi, bestw, i, n); / 右儿子结点总是可行的
18、 EnQueue(Q, Ew, bestw, i, n); / xi = 0 Q.Delete(Ew); / 取下一扩展结点 if (Ew = -1) / 同层结点尾部 if (Q.IsEmpty() return bestw; Q.Add(-1); / 同层结点尾部标志 Q.Delete(Ew); / 取下一扩展结点 i+; / 进入下一层 296.3 装载问题2. 队列式分支限界法算法EnQueue将活结点加入到活结点队列中。它首先检查i是否等于n。如果i=n,则表示当前活结点为叶结点。由于叶结点不会被进一步扩展,因此不必加入到活结点队列中。此时只要检查该叶结点表示的可行解是否优于当前最优
19、解,并更新当前最优解。当in时,当前活结点是内部结点,应加入到活结点队列中。306.3 装载问题2. 队列式分支限界法Void EnQueue(Queue & Q,Type wt,Type & bestw,int I,int n) / 将活结点加入到活结点队列Q中 if (i=n) / 可行叶结点 if (wtbestw) bestw=wt; else Q.Add(wt); / 非叶结点316.3 装载问题3. 算法的改进v 结点的左子树表示将此集装箱装上船,右子树表示不将此集装箱装上船。设bestw是当前最优解;ew是当前扩展结点所相应的重量;r是剩余集装箱的重量。则当ew+
20、rbestw时,可将其右子树剪去,因为此时若要船装最多集装箱,就应该把此箱装上船。v 另外,为了确保右子树成功剪枝,应该在算法每一次进入左子树的时候更新bestw的值。326.3 装载问题3. 算法的改进/ 检查左儿子结点 Type wt = Ew + wi; / 左儿子结点的重量 if (wt bestw) bestw = wt; / 加入活结点队列 if (i bestw & i 0; j-) bestxj = bestE-LChild; bestE = bestE-parent; 356.3 装载问题5. 优先队列式分支限界法v 解装载问题的优先队列式分支限界法用最大优先队列存储
21、活结点表。活结点x在优先队列中的优先级定义为从根结点到结点x的路径所相应的载重量再加上剩余集装箱的重量之和。v 优先队列中优先级最大的活结点成为下一个扩展结点。以结点x为根的子树中所有结点相应的路径的载重量不超过它的优先级。子集树中叶结点所相应的载重量与其优先级相同。v 在优先队列式分支限界法中,一旦有一个叶结点成为当前扩展结点,则可以断言该叶结点所相应的解即为最优解。此时可终止算法。 36应用分支限界法分关键问题 (1)如何确定合适的限界函数; (2)如何组织待处理节点表; (3)如何确定最优解中的各个分量。37分支限界法对问题的解空间树中结点的处理是跳跃式的,回溯也不是单纯的沿着双亲结点一
22、层一层地向上回溯,因此当搜索到某个叶子结点且该叶子结点的目标函数值在活节点表中最大时(假设求最大化问题),求得了问题的最优值,但是却无法求得该叶子结点对应的最优解中的各个分量。这个问题可以用下面2种方法之一解决:(1)对每个扩展结点保存该结点到根结点的路径;(2)在搜索过程中构建搜索经过的树结构,在求得最优解时,从叶子结点不断回溯到根结点,以确定最优解中的各个分量。386.5 0-1背包问题算法的思想 首先,要对输入数据进行预处理,将各物品依其单位重量价值从大到小进行排列。 在下面描述的优先队列分支限界法中,节点的优先级由已装袋的物品价值加上剩下的最大单位重量价值的物品装满剩余容量的价值和。
23、算法首先检查当前扩展结点的左儿子结点的可行性。如果该左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中。当前扩展结点的右儿子结点一定是可行结点,仅当右儿子结点满足上界约束时才将它加入子集树和活结点优先队列。当扩展到叶节点时为问题的最优值。396.5 0-1背包问题上界函数Typep Knap:Bound(int i) /计算节点所相应价值的上界 Typew cleft=c-w; /剩余容量Typep b=cp; /价值上界/以物品单位重量价值递减序装填剩余容量while (i = n & wi = cleft) / n表示物品总数,cleft为剩余空间 cleft -= wi;
24、 /wi表示i所占空间 b += pi; /pi表示i的价值 i+; if (i = n) b += pi / wi * cleft; / 装填剩余容量装满背包return b; /b为上界函数406.5 0-1背包问题 while (i != n+1) / 非叶结点非叶结点 / 检查当前扩展结点的左儿子结点检查当前扩展结点的左儿子结点 Typew wt = cw + wi; if (wt bestp) bestp = cp+pi; AddLiveNode(up, cp+pi, cw+wi, true, i+1); up = Bound(i+1); / 检查当前扩展结点的右儿子结点检查当前扩展
25、结点的右儿子结点 if (up = bestp) / 右子树可能含最优解右子树可能含最优解 AddLiveNode(up, cp, cw, false, i+1); / 取下一个扩展节点(略)取下一个扩展节点(略)分支限界搜索分支限界搜索过程过程416.6 最大团问题 给定无向图G=(V,E)。如果UV,且对任意u,vU有(u,v)E,则称U是G的完全子图。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。 下图G中,子集1,2是G的大小为2的完全子图。这个完全子图不是团,因为它被G的更大的完全子图1,2,5包含。1,2,5是G的最大团。1,4
26、,5和2,3,5也是G的最大团。 1. 问题描述426.6 最大团问题2. 上界函数用变量cliqueSize表示与该结点相应的团的顶点数;level表示结点在子集空间树中所处的层次;用cliqueSize +n-level+1作为顶点数上界upperSize的值。 在此优先队列式分支限界法中,upperSize实际上也是优先队列中元素的优先级。算法总是从活结点优先队列中抽取具有最大upperSize值的元素作为下一个扩展元素。 436.6 最大团问题3. 算法思想 子集树的根结点是初始扩展结点,对于这个特殊的扩展结点,其cliqueSize的值为0。 算法在扩展内部结点时,首先考察其左儿子结
27、点。在左儿子结点处,将顶点i加入到当前团中,并检查该顶点与当前团中其它顶点之间是否有边相连。当顶点i与当前团中所有顶点之间都有边相连,则相应的左儿子结点是可行结点,将它加入到子集树中并插入活结点优先队列,否则就不是可行结点。 接 着 继 续 考 察 当 前 扩 展 结 点 的 右 儿 子 结 点 。 当upperSizebestn时,右子树中可能含有最优解,此时将右儿子结点加入到子集树中并插入到活结点优先队列中。446.6 最大团问题3. 算法思想 算法的while循环的终止条件是遇到子集树中的一个叶结点(即n+1层结点)成为当前扩展结点。 对于子集树中的叶结点,有upperSizecliqu
28、eSize。此时活结点优先队列中剩余结点的upperSize值均不超过当前扩展结点的upperSize值,从而进一步搜索不可能得到更大的团,此时算法已找到一个最优解。 456.7 旅行售货员问题1. 问题描述 某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一次,最后回到驻地的路线,使总的路程(或总旅费)最小。 路线是一个带权图。图中各边的费用(权)为正数。图的一条周游路线是包括V中的每个顶点在内的一条回路。周游路线的费用是这条路线上所有边的费用之和。 旅行售货员问题的解空间可以组织成一棵树,从树的根结点到任一叶结点的路径定义了图的一条周游路
29、线。旅行售货员问题要在图G中找出费用最小的周游路线。 466.7 旅行售货员问题2. 算法描述 算法开始时创建一个最小堆,用于表示活结点优先队列。堆中每个结点的子树费用的下界lcost值是优先队列的优先级。接着算法计算出图中每个顶点的最小费用出边并用minout记录。如果所给的有向图中某个顶点没有出边,则该图不可能有回路,算法即告结束。如果每个顶点都有出边,则根据计算出的minout作算法初始化。 算法的while循环体完成对排列树内部结点的扩展。对于当前扩展结点,算法分2种情况进行处理:476.7 旅行售货员问题2. 算法描述 1、首先考虑s=n-2的情形,此时当前扩展结点是排列树中某个叶结点的父结点。如果该叶结点相应一条可行回路且费用小于当前最小费用,则将该叶结点插入到优先队列中,否则舍去该叶结点。 2、当sn-2时,算法依次产生当前扩展结点的所有儿子结点。由于当前扩展结点所相应的路径是x0:s,其可行儿子结点是从剩余顶点xs+1:n-1中选取的顶点xi,且(xs,xi)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025某餐饮品牌特许加盟合同协议书范本
- 2025年二月份跨境独立站运营借款协议GMV增长对赌协议
- 胸腔镜手术病人的护理
- 超市员工管理规章制度
- 基于过盈联接的机油泵衬套压装质量监控设计与应用
- 二零二五版收购企业合同范例
- 基金投资组合基金池
- 有关车位租赁合同范例
- 二零二五池塘承包合同范例
- 内务管理制度500字
- 初中综合实践-【课堂实录】手工橡皮章教学设计学情分析教材分析课后反思
- 民用无人机驾驶员管理规定
- 2023年四川二造《建设工程计量与计价实务(土木建筑)》高频核心题库300题(含解析)
- 凸透镜成像规律动画可拖动最佳版swf
- 6层框架住宅毕业设计结构计算书
- 《春秋三传导读》课件
- 教师情绪和压力疏导课件
- 麻醉科进修汇报课件
- 中小学生心理健康教育主题班会PPT教学课件
- ISO-IEC 27002-2022中文版完整详细
- 口腔正畸病例书写模板
评论
0/150
提交评论