《算法分析与设计课件.pptx》由会员分享,可在线阅读,更多相关《算法分析与设计课件.pptx(43页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 1引言有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法。回溯法的基本做法是搜索,或是一种组织得井井有条的、能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解:如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。第1页/共43页2 25.1 回溯法的算法框架本节介绍回溯法算法框架的有关问题:一、问题的解空间二、回溯法的基本思想三、递归回溯四
2、、迭代回溯五、子集树与排列树第2页/共43页3 3一、问题的解空间应用回溯法解问题时,首先应明确定义问题的解空间。问题的解空间应至少包含问题的一个(最优)解。问题的解向量:回溯法希望一个问题的解能够表示成一个n元式(x1,x2,xn)的形式。解空间:对于问题的一个实例,解向量满足约束条件的所有多元组,构成了该实例的一个解空间。注意:同一个问题可以有多种表示,有些表示方法更简单,所需表示的状态空间更小(存储量少,搜索方法简单)。例如,对于有n种可选物品的0-1背包问题,其解空间由长度为n的0-1向量组成。n=3时的0-1背包问题用完全二叉树表示的解空间第3页/共43页4 4二、回溯法的基本思想回
3、溯法的基本步骤:(1)针对所给问题,定义问题的解空间;(2)确定易于搜索的解空间结构;(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。常用剪枝函数:用约束函数在扩展结点处剪去不满足约束的子树;用限界函数剪去得不到最优解的子树。关于复杂性:用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。第4页/共43页5 5生成问题状态的基本方法扩展结点:一个正在产生儿子的结点称为扩展结点活结点:一个自身已生成但其儿子还没有全部生成的节点称做活结点死结点:一个所有儿子已经产生的结点称做死结点深度优先的问题状态生成法:如果对一
4、个扩展结点R,一旦产生了它的一个儿子C,就把C当做新的扩展结点。在完成对子树C(以C为根的子树)的穷尽搜索之后,将R重新变成扩展结点,继续生成R的下一个儿子(如果存在)第5页/共43页6 6示例1 0-1背包问题n=3,C=30,w=16,15,15,v=45,25,25ACr=C=30,V=0Bw1=16,v1=45Cr=14,V=45CCr=30,V=0DCrw2不可行解JCr45x=(0,1,1)Fw2=15,v2=25Cr=15,V=25M25n)output(x);elsefor(int i=f(n,t);i0)if(f(n,t)=g(n,t)for(int i=f(n,t);in)
5、output(x);else for(int i=0;in)output(x);else for(int i=t;i n)/到达叶结点到达叶结点 更新最优解更新最优解bestx,bestw;return;r-=wi;if(cw+wi bestw)xi=0;/搜索右子树搜索右子树 backtrack(i+1);r+=wi;第15页/共43页16165.3 批处理作业调度一、问题描述二、实例分析三、算法描述第16页/共43页1717一、问题描述给定n个作业的集合J1,J2,Jn。每个作业必须先由机器1处理,然后由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作
6、业i在机器j上完成处理的时间。所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。第17页/共43页1818二、实例分析这3个作业的6种可能的调度方案是1,2,3;1,3,2;2,1,3;2,3,1;3,1,2;3,2,1;它们所相应的完成时间和分别是19,18,20,21,19,19。最佳调度方案是1,3,2,其完成时间和为18。tji机器1机器2作业121作业231作业323第18页/共43页1919三、算法描述void Flowshop:Backtrack(int i)if(i n)for(
7、int j=1;j=n;j+)bestxj=xj;bestf=f;else for(int j=i;j f1)?f2i-1:f1)+Mxj2;f+=f2i;if(f bestf)Swap(xi,xj);Backtrack(i+1);Swap(xi,xj);f1-=Mxj1;f-=f2i;解空间:排列树解空间:排列树复杂性:复杂性:T(n)=O(n!)第19页/共43页20205.5 n后问题一、问题描述二、问题分析三、算法描述第20页/共43页2121一、问题描述在nn格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于
8、在nn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。1Q2Q3Q4Q5Q6 Q7Q8Q12345678第21页/共43页2222二、问题分析解向量:(x1,x2,xn)显约束:xi=1,2,n隐约束:1)不同列:xixj2)不处于同一正、反对角线:|i-j|xi-xj|第22页/共43页2323三、算法描述bool Queen:Place(int k)for(int j=1;jn)sum+;else for(int i=1;i n)/到达叶结点到达叶结点 更新最优解更新最优解bestx,bestp;return;r-=wi;if(cw+wi bestp)/进入右子树进入
9、右子树 xi=0;backtrack(i+1);解空间:子集树解空间:子集树可行性约束函数:可行性约束函数:w wi ix xi iCC上界函数:上界函数:Bound()Bound()算法:略算法:略第24页/共43页2525上界函数bound(int i)/计算上界计算上界 Typew cleft=c-cw;/剩余容量剩余容量 Typep b=cp;/以物品单位重量价值递减序装入物品以物品单位重量价值递减序装入物品 while(i=n&wi=cleft)cleft-=wi;b+=pi;i+;/装满背包装满背包 if(i n)/到达叶结点 for(int j=1;j=n;j+)bestxj=x
10、j;bestn=cn;return;int OK=1;/检查顶点 i 与当前团的连接 for(int j=1;j bestn)/进入右子树 xi=0;Backtrack(i+1);第30页/共43页3131四、进一步改进选择合适的搜索顺序,可以使得上界函数更有效的发挥作用。例如在搜索之前可以将顶点按度从小到大排序。这在某种意义上相当于给回溯法加入了启发性。第31页/共43页32325.8 图的m着色问题一、基本概念二、问题分析三、算法描述四、复杂性分析第32页/共43页3333一、基本概念给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中
11、每条边的2个顶点着不同颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。第33页/共43页3434二、问题分析解向量:(x1,x2,xn)表示顶点i所着颜色xi 可行性约束函数:顶点i与已着色的相邻顶点颜色不重复。第34页/共43页3535三、算法描述void Color:Backtrack(int t)if(tn)sum+;for(int i=1;i=n;i+)cout xi ;cout endl;else for(int i=1;i=m;i+)xt=i;if(Ok
12、(t)Backtrack(t+1);bool Color:Ok(int k)/检查颜色可用性 for(int j=1;j=n;j+)if(akj=1)&(xj=xk)return false;return true;第35页/共43页3636四、复杂性分析图m可着色问题的解空间树中内结点个数是mi(0in-1)。对于每一个内结点,在最坏情况下,用ok检查当前扩展结点的每一个儿子所相应的颜色可用性需耗时O(mn)。因此,回溯法总的时间耗费是mi(mn)=nm(mn-1)/(m-1)=O(nmn)(0in-1)第36页/共43页37375.9 旅行售货员问题void Backtrack(int i
13、)if(i=n)if(axn-1xn!=NoEdge&axn1!=NoEdge&(cc+axn-1xn+axn1 bestc|bestc=NoEdge)for(int j=1;j=n;j+)bestxj=xj;bestc=cc+axn-1xn+axn1;else/是否可进入是否可进入xj子树子树?for(int j=i;j=n;j+)/搜索子树搜索子树 if(axi-1xj!=NoEdge&(cc+axi-1xi bestc|bestc=NoEdge)Swap(xi,xj);cc+=axi-1xi;Backtrack(i+1);cc-=axi-1xi;Swap(xi,xj);第37页/共43页
14、38385.9 旅行售货员问题解空间:排列树复杂度分析:算法backtrack在最坏情况下可能需要更新当前最优解O(n-1)!)次,每次更新bestx需计算时间O(n),从而整个算法的计算时间复杂性为O(n!)。第38页/共43页39395.13 回溯法的效率分析本节要点:一、影响回溯算法效率的因素二、重排原理三、回溯法的效率四、概率方法第39页/共43页4040一、影响回溯算法效率的因素通过前面具体实例的讨论容易看出,回溯算法的效率在很大程度上依赖于以下因素:(1)产生xk的时间;(2)满足显约束的xk值的个数;(3)计算约束函数constraint的时间;(4)计算上界函数bound的时间
15、;(5)满足约束函数和上界函数约束的所有xk的个数。好的约束函数能显著地减少所生成的结点数。但这样的约束函数往往计算量较大。因此,在选择约束函数时通常存在生成结点数与约束函数计算量之间的折衷。第40页/共43页4141二、重排原理对于许多问题而言,在搜索试探时选取xi的值顺序是任意的。在其它条件相当的前提下,让可取值最少的xi优先。图(a)中,从第1层剪去1棵子树,则从所有应当考虑的分支中一次消去12个分支。对于图(b),虽然同样从第1层剪去1棵子树,却只从应当考虑的分支中消去8个分支。前者的效果明显比后者好。(a)(b)第41页/共43页4242三、回溯法的效率解空间的结构已经选定,影响回溯法效率的前三个因素就可以确定,只剩下生成结点的数目是可变的,它将随问题的具体内容及结点的不同生成方式而变动。如果解空间的结点数是2n或n!,则在最坏情况下,回溯法的时间耗费一般为O(p(n)2n)或O(q(n)n!)。其中p(n)和q(n)均为n的多项式。n=3,c=30p=(100,1,1),w=(30,20,20)p=(1,1,100),w=(20,20,30)第42页/共43页感谢您的观看!第43页/共43页
限制150内