第5章 算法设计基本方法2.ppt
《第5章 算法设计基本方法2.ppt》由会员分享,可在线阅读,更多相关《第5章 算法设计基本方法2.ppt(80页珍藏版)》请在课桌文档上搜索。
1、2023/11/6,第5 章算法设计基本方法2,2023/11/6,例:0-1背包问题,设有3种物品,背包容量40公斤。物品1的重量30公斤,价值150元;物品2的重量20公斤,价值80元;物品3的重量10公斤,价值70元。,2023/11/6,0-1背包问题的解空间(状态树),能优化吗?,2023/11/6,5.2 回溯法,“通用解题法”,是带优化的穷举法。按深度优先策略,从根结点出发搜索解空间树。对任意结点,先判断该结点是否包含问题的解。若肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先搜索策略搜索。解为叶子结点这种以深度优先方式系统搜索
2、问题解的算法称为回溯法,它适用于求解组合数较大的问题,2023/11/6,回溯法,在回溯法中,并不是先构造出整棵状态空间树,再进行搜索,而是在搜索过程,逐步构造出状态空间树,即边搜索,边构造;回溯法求问题的所有解时,要回溯到根,且根结点的所有子树都被搜索遍才结束。在它求问题的一个解时,只要搜索到问题的一个解就结束。,2023/11/6,回溯法,回溯法的使用1、确定问题状态结构;2、分析问题状态空间树;3、确定深度搜索与回溯规则;4、确定解状态判别规则;,2023/11/6,回溯法的算法框架,5.2.1 问题的解空间,5.2.2 回溯法的基本思想,5.2.3 递归回溯,5.2.4 迭代回溯,5.
3、2.5 示例,2023/11/6,复杂问题常常有很多的可能解,这些可能解构成了问题的解空间。解空间也就是进行穷举的搜索空间,所以,解空间中应该包括所有的可能解。确定正确的解空间很重要,如果没有确定正确的解空间就开始搜索,可能会增加很多重复解,或者根本就搜索不到正确的解。,5.2.1 问题的解空间,2023/11/6,对于任何一个问题,可能解的表示方式和它相应的解释隐含了解空间及其大小。例如,对于有n个物品的0/1背包问题,其可能解的表示方式可以有以下两种:(1)可能解由一个不等长向量组成,当物品i(1in)装入背包时,解向量中包含分量i,否则,解向量中不包含分量i,当n=3时,其解空间是:()
4、,(1),(2),(3),(1,2),(1,3),(2,3),(1,2,3)(2)可能解由一个等长向量x1,x2,xn组成,其中xi=1(1in)表示物品i装入背包,xi=0表示物品i没有装入背包,当n=3时,其解空间是:(0,0,0),(0,0,1),(0,1,0),(1,0,0),(0,1,1),(1,0,1),(1,1,0),(1,1,1),2023/11/6,为了用回溯法求解一个具有n个输入的问题,一般情况下,将其可能解表示为满足某个约束条件的等长向量X=(x1,x2,xn),其中分量xi(1in)的取值范围是某个有限集合Si=ai1,ai2,airi,所有可能的解向量构成了问题的解空
5、间。,2023/11/6,问题的解空间一般用解空间树(Solution Space Trees,也称状态空间树)的方式组织,树的根结点位于第1层,表示搜索的初始状态,第2层的结点表示对解向量的第一个分量做出选择后到达的状态,第1层到第2层的边上标出对第一个分量选择的结果,依此类推,从树的根结点到叶子结点的路径就构成了解空间的一个可能解。,2023/11/6,对于n=3的0/1背包问题,其解空间树如下图所示,树中的8个叶子结点分别代表该问题的8个可能解。(依编号顺序搜索),2023/11/6,5.2.2 回溯法的基本思想,从根结点出发,按照深度优先策略遍历解空间树,搜索满足约束条件的解。先判断结
6、点对应的部分解是否满足约束条件,或者是否超出目标函数的界,即判断该结点是否包含问题的(最优)解。如果肯定不包含,则跳过对以该结点为根的子树的搜索,即所谓剪枝(Pruning);否则,进入以该结点为根的子树,继续按照深度优先策略搜索。,2023/11/6,例如,对于n=3的0/1背包问题,三个物品的重量为20,15,10,价值为20,30,25,背包容量为25,从下图所示的解空间树的根结点开始搜索,搜索过程如下(依编号顺序):,不可行解,2023/11/6,回溯法的搜索过程涉及的结点(称为搜索空间)只是整个解空间树的一部分,在搜索过程中,通常采用两种策略避免无效搜索:(1)用约束条件剪去得不到可
7、行解的子树;(2)用目标函数剪去得不到最优解的子树。这两类函数统称为剪枝函数(Pruning Function)。需要注意的是,问题的解空间树是虚拟的,并不需要在算法运行时构造一棵真正的树结构,只需要存储从根结点到当前结点的路径。,2023/11/6,回溯法的求解过程,由于问题的解向量X=(x1,x2,xn)中的每个分量xi(1in)都属于一个有限集合Si=ai1,ai2,airi,因此,回溯法可以按某种顺序(例如字典序)依次考察。初始时,令解向量X为空,从根结点出发,选择S1的第一个元素作为解向量X的第一个分量,即x1=a11;如果X=(x1)是问题的部分解,则继续扩展解向量X,选择S2的第
8、一个元素作为解向量X的第2个分量;否则,选择S1的下一个元素作为解向量X的第一个分量,即x1=a12。依此类推,一般情况下,如果X=(x1,x2,xi)是问题的部分解,则选择Si+1的第一个元素作为解向量X的第i+1个分量时,有下面三种情况:,2023/11/6,(1)如果是最终解,则输出这个解。如果问题只希望得到一个解,则结束搜索,否则继续搜索其他解;(2)如果是问题的部分解,则继续构造解向量的下一个分量;(3)如果既不是问题的部分解也不是问题的最终解,则存在下面两种情况:如果xi+1=ai1,k不是集合Si1的最后一个元素,则令xi+1=ai1,k1,即选择Si+1的下一个元素作为解向量X
9、的第i+1个分量;如果xi+1=ai1,k是集合Si1的最后一个元素,就回溯到X=(x1,x2,xi),选择Si的下一个元素作为解向量X的第i个分量,假设xi=aik,如果aik不是集合Si的最后一个元素,则令xi=ai,k1;否则,就继续回溯到X=(x1,x2,xi1);,2023/11/6,回溯法的三个基本步骤1)定义问题的解空间2)确定易于搜索的解空间结构3)深度优先搜索解空间,并在搜索过程中用剪枝函数避免无效搜索,2023/11/6,5.2.3 递归回溯,回溯法对解空间作深度优先搜索,因此,在一般情况下用递归方法实现回溯法。,void backtrack(int t)if(tn)out
10、put(x);else for(int i=f(n,t);i=g(n,t);i+)xt=h(i);if(constraint(t),t,当前结点在解空间树中的深度,控制递归深度;n,解空间树的高度;f(n,t)和g(n,t)是未搜索过的子树起始编号和终止编号。,2023/11/6,5.2.4 迭代回溯,采用树的非递归深度优先遍历算法,可将回溯法表示为一个非递归迭代过程。,void iterativeBacktrack()int t=1;while(t0)if(f(n,t)=g(n,t)for(int i=f(n,t);i=g(n,t);i+)xt=h(i);if(constraint(t)/回
11、溯,2023/11/6,5.2.5 回溯法示例1,子集和数问题问题给定由n个不同正数组成的集合W=wi,和正数M,求W中所有和等于M的子集的集合;问题状态可以设想,W中的每个数有选取和不选取两种可能,W的一个子集即为一个问题状态,可以表述为对每个元素选取或不选取的一个组合。问题状态空间树由空集开始,依次对每个元素进行选取和不选取两种选择,就可以得到W的全部子集,选取过程即可构成一棵状态空间树;,2023/11/6,如:设W=1,5,12,14,则状态空间树如下:,2023/11/6,子集和数问题,按照回溯法思想,从状态树的根结点出发,做深度优先搜索;为便于计算,将W中的正数按从小到大排序;当在
12、某一状态A下,依次尝试加入和不加入正数wi,若A+wiM,则可停止对该结点的搜索;若A+(wiwn)M,则也可停止对该结点的搜索;,2023/11/6,子集和数问题,算法如下:设置辅助向量Ai,记录wi是否被选入;SW表示W的剩余和,SA表示选入项的总和;初始化Ai=-1,表示未被处理过,SW=Wi,SA=0;从w0开始,进行深度优先搜索:检查是否得解以及是否需要继续对该结点进行搜索,如果需要,则 如果Ai为-1(未被处理过),则尝试不选入wi:置Ai=0,即:不选入wi;SW-=wi;A+i=-1;如果Ai为0(未被选入),则尝试选入wi:置Ai=1,即:选入wi;SA+=wi;A+i=-1
13、;如果Ai为1(已被选入),则退回上一项:Ai=-1;SW+=wi;SA-=wi;-i;,2023/11/6,回溯法分析,约束集D性质:若(x1xi)满足D中所有约束(条件),则其子集(x1xj)jj也不能满足D中,不必再继续搜索问题的解。回溯求解的效率在很大程度上依赖于:产生局部解(x1xk)的时间;计算约束所需的时间;满足局部约束的解的个数;通常可以应用重排原理,先搜索分支较少的局部解,在约束不满足时,可以裁剪去较多的搜索分支,从而提高搜索效率。,2023/11/6,示例2:0-1背包问题,给定n个物品和一个背包。设物品i(1in)的重量为wi,其价值为vi,背包最大承重量为Max。问,应
14、该如何选择物品装入背包,才能使背包内物品的总价值最大?选择物品i时,要么全部装入,要么不装入,不能只装入物品i的一部分。,2023/11/6,算法基本思想,如果到达叶子,返回最优解opt;否则,试探左子树:选取物品i,计算tw,tv;递归,取下一个物品;回溯,舍去物品i,重新计算tw,tv;试探右子树:递归,取下一个物品;,2023/11/6,剪枝,约束条件目标函数设当前结点i,取该物品,则扩展左子树;舍去该物品,则扩展其右子树若当前重量tw+wiMax,剪枝,跳过左子树若当前价值+剩余物品的总价值当前最优价值bestv,则剪枝,跳过右子树,2023/11/6,bestv=tv,iN 如果已到
15、达叶子,T,F,tw+wiMax不超重,tvbestv,T,T,F,F,xi=1;选取i,扩展左子树,计算tw,tv,递归BackKnap,试探下一物品i+1,回溯,xi=0舍去i,计算tw,tv,剩余价值+tvbestv,扩展右子树:,递归BackKnap,试探下一物品,return bestv;,opt=x;,舍去,T,F,左子树,右子树,回溯,算法BackKnap,2023/11/6,bestv=tv,iN 如果已到达叶子,T,F,tw+wiMax不超重,tvbestv,T,T,F,F,xi=1;选取i,扩展左子树,计算tw,tv,递归BackKnap,试探下一物品i+1,回溯,xi=0
16、舍去i,计算tw,tv,剩余价值+tvbestv,扩展右子树:,递归BackKnap,试探下一物品,return bestv;,opt=x;,舍去,T,F,左子树,右子树,回溯,算法BackKnap(x,opt,tw,tv,i),tv=tv+vi;tw=tw+wi;,BackKnap(x,opt,tw,tv,i+1);,xi=0;tw=tw-wi;tv=tv-vi;,BackKnap(x,opt,tw,tv,i+1);,2023/11/6,bestv=tv,iN,T,F,tw+wiMax,tvbestv,T,T,F,F,xi=1;,tv=tv+vi;tw=tw+wi;,BackKnap(x,o
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第5章 算法设计基本方法2 算法 设计 基本 方法
![提示](https://www.desk33.com/images/bang_tan.gif)
链接地址:https://www.desk33.com/p-747158.html