首页 5回溯法

5回溯法

举报
开通vip

5回溯法0算法分析与设计AnalysisandDesignofComputerAlgorithms回溯法李纲2008宁波大学信息科学与工程学院计算机算法设计与分析计算机算法设计与分析1页•••••••学习要点理解回溯法的深度优先搜索策略。掌握用回溯法解题的算法框架(1)递归回溯最优子结构性质(2)迭代回溯贪心选择性质(3)子集树算法框架(4)排列树算法框架计算机算法设计与分析计算机算法设计与分析2页••••&bul...

5回溯法
0算法分析与设计AnalysisandDesignofComputerAlgorithms回溯法李纲2008宁波大学信息科学与工程学院计算机算法设计与分析计算机算法设计与分析1页•••••••学习要点理解回溯法的深度优先搜索策略。掌握用回溯法解题的算法框架(1)递归回溯最优子结构性质(2)迭代回溯贪心选择性质(3)子集树算法框架(4)排列树算法框架计算机算法设计与分析计算机算法设计与分析2页••••••••••••通过应用范例学习回溯法的设计策略。(1)装载问题;(2)批处理作业调度;(3)符号三角形问题(4)n后问题;(5)0-1背包问题;(6)最大团问题;(7)图的m着色问题(8)旅行售货员问题(9)圆排列问题(10)电路板排列问题(11)连续邮资问题计算机算法设计与分析计算机算法设计与分析3页►有许多问题,当需要找出它的解集或者要求回答什么解是 满足某些约束条件的最佳解时,往往要使用回溯法。►回溯法的基本做法是搜索,或是一种组织得井井有条的, 能避免不必要搜索的穷举式搜索法。这种 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 适用于解一 些组合数相当大的问题。►回溯法在问题的解空间树中,按深度优先策略,从根结点 出发搜索解空间树。算法搜索至解空间树的任意一点时, 先判断该结点是否包含问题的解。如果肯定不包含,则跳 过对该结点为根的子树的搜索,逐层向其祖先结点回溯; 否则,进入该子树,继续按深度优先策略搜索。回溯法计算机算法设计与分析计算机算法设计与分析4页问题的解空间 •问题的解向量:回溯法希望一个问题的解能够 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示成一个n 元式(x1,x2,…,xn)的形式。 •显约束:对分量xi的取值限定。 •隐约束:为满足问题的解而对不同分量之间施加的约束。 •解空间:对于问题的一个实例,解向量满足显式约束条件的 所有多元组,构成了该实例的一个解空间。(下图,P139例子) 注意:同一个问题可以 有多种表示,有些表示 方法更简单,所需表示 的状态空间更小(存储 量少,搜索方法简单)。 n=3时的0-1背包问题用完全二叉树表示的解空间计算机算法设计与分析计算机算法设计与分析5页生成问题状态的基本方法►►►►►►扩展结点:一个正在产生儿子的结点称为扩展结点活结点:一个自身已生成但其儿子还没有全部生成的节点称做活结点死结点:一个所有儿子已经产生的结点称做死结点深度优先的问题状态生成法:如果对一个扩展结点R,一旦产生了它的一个儿子C,就把C当做新的扩展结点。在完成对子树C(以C为根的子树)的穷尽搜索之后,回溯到R,将R重新变成扩展结点,继续生成R的下一个儿子(如果存在)宽度优先的问题状态生成法:在一个扩展结点变成死结点之前,它一直是扩展结点回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(boundingfunction)来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。具有限界函数的深度优先生成法称为回溯法。计算机算法设计与分析计算机算法设计与分析6页回溯法的基本思想 (1)针对所给问题,定义问题的解空间; (2)确定易于搜索的解空间结构; (3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无 效搜索。 常用剪枝函数:注意下面2个说法的区别 用约束函数在扩展结点处剪去不满足约束的子树; 用限界函数剪去得不到最优解的子树。 用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。 在任何时刻,算法只保存从根结点到当前扩展结点的路径。如果解空 间树中从根结点到叶结点的最长路径的长度为h(n),则回溯法所需的 计算空间通常为O(h(n))。而显式地存储整个解空间则需要O(2h(n))或 O(h(n)!)内存空间。计算机算法设计与分析计算机算法设计与分析7页递归回溯 回溯法对解空间作深度优先搜索,因此,在一般情况下用递归方法 实现回溯法。 voidbacktrack(intt) { if(t>n)output(x);//到叶子 else for(inti=f(n,t);i<=g(n,t);i++){//f,g函数表示开始和结束子树x[t]=h(i);//当前子树记录 if(constraint(t)&&bound(t))backtrack(t+1);//遍历该子子树 }}计算机算法设计与分析计算机算法设计与分析8页迭代回溯采用树的非递归深度优先遍历算法,可将回溯法表示为一个非递归迭代过程。不要求,思路必须很清楚voiditerativeBacktrack(){ intt=1; while(t>0){ if(f(n,t)<=g(n,t)) for(inti=f(n,t);i<=g(n,t);i++){ x[t]=h(i); if(constraint(t)&&bound(t)){ if(solution(t))output(x); elset++;} } elset--; }}2种状态9页子集树与排列树 遍历排列树需要 O(n!)计算时间 遍历子集树需O(2n)计算时间voidbacktrack(intt){ if(t>n)output(x); else for(inti=0;i<=1;i++){ x[t]=i; if(legal(t))backtrack(t+1); }}(P139例子:装箱) 计算机算法设计与分析计算机算法设计与分析voidbacktrack(intt){ if(t>n)output(x); else for(inti=t;i<=n;i++){ swap(x[t],x[i]); if(legal(t))backtrack(t+1); swap(x[t],x[i]); }}(P140例子:旅行商)∑wx≤c1计算机算法设计与分析计算机算法设计与分析10页装载问题有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集 n i=1装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。容易证明,如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。(1)首先将第一艘轮船尽可能装满;(2)将剩余的集装箱装上第二艘轮船。将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和最接近。由此可知,装载问题等价于以下特殊的0-1背包问题。 nimax ns.t.ii i=1 xi∈{0,1},1≤i≤n∑wix i=1用回溯法设计解装载问题的O(2n)计算时间算法。在某些情况下该算法优于动态 规划 污水管网监理规划下载职业规划大学生职业规划个人职业规划职业规划论文 算法。计算机算法设计与分析计算机算法设计与分析11页装载问题•解空间:子集树•可行性约束函数(选择当前元素):•上界函数(不选择当前元素):nwixi≤c1∑ i=1当前载重量cw+剩余集装箱的重量r≤当前最优载重量bestw voidbacktrack(inti) {//搜索第i层结点 if(i>n){...}//到达叶结点,更新最优解bestx,bestw;return; r-=w[i]; if(cw+w[i]<=c){//装,搜索左子树 x[i]=1; cw+=w[i];backtrack(i+1);cw-=w[i];} if(cw+r>bestw){ x[i]=0;//搜索右子树,即不包含该集装箱 backtrack(i+1);} r+=w[i];//回溯,恢复状态}X[i]复原计算机算法设计与分析计算机算法设计与分析12页 批处理作业调度给定n个作业的集合{J1,J2,…,Jn}。每个作业必须先由机器1处理,然后由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。 tji其完成时间和达到最小。机器2 1 1 3机器1 2 3 2 tji作业1作业2作业3这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。第一种:j1:2+1j2:4+1j2:7+3计算机算法设计与分析计算机算法设计与分析13页 批处理作业调度 •解空间:排列树voidFlowshop::Backtrack(inti){ if(i>n){ for(intj=1;j<=n;j++)bestx[j]=x[j]; bestf=f; } else for(intj=i;j<=n;j++){ f1+=M[x[j]][1]; f2[i]=((f2[i-1]>f1)?f2[i-1]:f1)+M[x[j]][2]; f+=f2[i]; if(f<bestf){ Swap(x[i],x[j]); Backtrack(i+1); Swap(x[i],x[j]); } f1-=M[x[j]][1]; f-=f2[i]; }} 不等同二 维数组classFlowshop{ friendFlow(int**,int,int[]); private: voidBacktrack(inti); int**M,//各作业所需的处理时间 *x,//当前作业调度 *bestx,//当前最优作业调度 *f2,//机器2完成处理时间 f1,//机器1完成处理时间 f,//完成时间和 bestf,//当前最优值 n;//作业数}; 上一任务在机器2 上的完成时间是否 大于本次任务在1 上的完成时间计算机算法设计与分析计算机算法设计与分析14页++ + - -+-++----+ +++-符号三角形问题 下图是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是 “+”,2个异号下面都是“-”。 -++- -+- -- +在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同。上一层-当前+号,(-)过半第1行绿色其他行计算机算法设计与分析计算机算法设计与分析15页count-=i;//回复}}++-+-++ +----+ -+++- -++- -+- -- +复杂度分析计算可行性约束需要O(n)时间,在最坏情况下有O(2n)个结点需要计算可行性约束,故解符号三角形问题的回溯算法所需的计算时间为O(n2n)。符号三角形问题•解向量:用n元组x[1:n]表示符号三角形的第一行。•可行性约束函数:当前符号三角形所包含的“+”个数与“-”个数均不超过n*(n+1)/4当前+号,过半 for(intj=2;j<=t;j++){ p[j][t-j+1]=p[j-1][t-j+1]^p[j-1][t-j+2]; count+=p[j][t-j+1]; }Backtrack(t+1);紫色for(intj=2;j<=t;j++)count-=p[j][t-j+1];•无解的判断:n*(n+1)/2为奇数voidTriangle::Backtrack(intt){ if((count>half)||(t*(t-1)/2-count>half))return; if(t>n)sum++; else0:'-' for(inti=0;i<2;i++){1:"+" p[1][t]=i; count+=i;计算机算法设计与分析计算机算法设计与分析16页n后问题在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。12345678 1 2 345678 Q Q Q Q Q Q Q Q计算机算法设计与分析计算机算法设计与分析17页•解向量:(x1,x2,…,xn)•显约束:xi=1,2,…,n•隐约束:1)不同列:xi≠xj2)不处于同一正、反对角线: |i-j|≠|xi-xj|P155,约束如何得到{ returnfalse;returntrue;}voidQueen::Backtrack(intt){ if(t>n)sum++; else for(inti=1;i<=n;i++){ x[t]=i;//尝试本行的每个位置 if(Place(t))Backtrack(t+1);}}n后问题boolQueen::Place(intk)是否可放置 for(intj=1;j<k;j++) if((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k]))为什么递归回来不 用恢复•上界函数:∑wx≤计算机算法设计与分析计算机算法设计与分析18页0-1背包问题•解空间:子集树c1•可行性约束函数: n ii i=1•P159:Backtracktemplate<classTypew,classTypep>returnb;}TypepKnap<Typew,Typep>::Bound(inti){//计算上界 Typewcleft=c-cw;//剩余容量 Typepb=cp; //以物品单位重量价值递减序装入物品,预先排序 //上界,左子树,全为1 while(i<=n&&w[i]<=cleft){ cleft-=w[i]; 放置高价比 b+=p[i]; i++; } //装满背包 if(i<=n)b+=p[i]/w[i]*cleft;以普通背包加入最后价值计算机算法设计与分析计算机算法设计与分析19页0-1背包问题计算机算法设计与分析计算机算法设计与分析20页最大团问题给定无向图G=(V,E)。如果U⊆V,且对任意u,v∈U有(u,v)∈E,则称U是G的完全子图。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。如果U⊆V且对任意u,v∈U有(u,v)∉E,则称U是G的空子图。G的空子图U是G的独立集当且仅当U不包含在G的更大的空子图中。G的最大独立集是G中所含顶点数最多的独立集。对于任一无向图G=(V,E)其补图G=(V1,E1)定义为:V1=V,且(u,v)∈E1当且仅当(u,v)∉E。 U是G的最大团当且仅当U是G的最大独立集。 14253 14253任意两两之 间有连接计算机算法设计与分析计算机算法设计与分析21页最大团问题•解空间:子集树•可行性约束函数:顶点i到已选入的顶点集中每一个顶点都有边相连。•上界函数:有足够多的可选择顶点使得算法有可能在右子树中找到更大的团。 右子树有不加入节点(0),所以要求上界voidClique::Backtrack(inti){//计算最大团 if(i>n){//到达叶结点 for(intj=1;j<=n;j++)bestx[j]=x[j]; bestn=cn;return;}//检查顶点i与当前团的连接intOK=1;for(intj=1;j<i;j++)//对于已加入的点 if(x[j]&&a[i][j]==0){ //i与j不相连 OK=0;break;}if(OK){//进入左子树 x[i]=1;cn++; Backtrack(i+1); x[i]=0;cn--;}if(cn+n-i>bestn){//进入右子树 x[i]=0;Backtrack(i+1);}}复杂度分析最大团问题的回溯算法backtrack所需的计算时间显然为O(n2n)。 14 253计算机算法设计与分析计算机算法设计与分析22页进一步改进 •选择合适的搜索顺序,可以使得上界函数更有效的发挥作用。 例如在搜索之前可以将顶点按度从小到大排序。这在某种意 义上相当于给回溯法加入了启发性。 •定义Si={vi,vi+1,...,vn},依次求出Sn,Sn-1,...,S1的解。从而得到 一个更精确的上界函数,若cn+Si<=max则剪枝。同时注意 到:从Si+1到Si,如果找到一个更大的团,那么vi必然属于找 到的团,此时有Si=Si+1+1,否则Si=Si+1。因此只要max的 值被更新过,就可以确定已经找到最大值,不必再往下搜索 了。计算机算法设计与分析计算机算法设计与分析23页图的m着色问题 给定无向连通图G和m种不同的颜色。用这些颜色为图G的各 顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每 条边的2个顶点着不同颜色。这个问题是图的m可着色判定问 题。若一个图最少需要m种颜色才能使图中每条边连接的2个 顶点着不同颜色,则称这个数m为该图的色数。求一个图的色 数m的问题称为图的m可着色优化问题。∑计算机算法设计与分析计算机算法设计与分析24页 图的m着色问题 •解向量:(x1,x2,…,xn)表示顶点i所着颜色x[i] •可行性约束函数:顶点i与已着色的相邻顶点颜色不重复。voidColor::Backtrack(intt){ if(t>n){ sum++;cout<<x[i]<<'';for(inti=1;i<=n;i++)cout<<endl;}else for(inti=1;i<=m;i++){x[t]=i;if(Ok(t))Backtrack(t+1);x[t]=0;}}boolColor::Ok(intk){//检查颜色可用性 for(intj=1;j<=n;j++) if((a[k][j]==1)&&(x[j]==x[k])) returnfalse;returntrue;}前扩展结点的每一个儿子所相应的颜色可用性需耗时O(mn)。因此,回溯法总的时间耗费是 n−1复杂度分析mi图m可着色问题的解空间树中内结点个数是i=0对于每一个内结点,在最坏情况下,用ok检查当mi(mn)=nm(mn−1)/(m−1)=O(nmn)n−1∑i=0计算机算法设计与分析计算机算法设计与分析25页•解空间:排列树 旅行售货员问题template<classType>voidTraveling<Type>::Backtrack(inti){if(i==n){ if(a[x[n-1]][x[n]]!=NoEdge&&a[x[n]][1]!=NoEdge&& (cc+a[x[n-1]][x[n]]+a[x[n]][1]<bestc||bestc==NoEdge)){ for(intj=1;j<=n;j++)bestx[j]=x[j]; bestc=cc+a[x[n-1]][x[n]]+a[x[n]][1];} }else{for(intj=i;j<=n;j++) //是否可进入x[j]子树?if(a[x[i-1]][x[j]]!=NoEdge&&(cc+a[x[i-1]][x[i]]<bestc||bestc==NoEdge)){ //搜索子树Swap(x[i],x[j]);cc+=a[x[i-1]][x[i]];Backtrack(i+1);cc-=a[x[i-1]][x[i]];Swap(x[i],x[j]);}}}复杂度分析算法backtrack在最坏情况下可能需要更新当前最优解O((n-1)!)次,每次更新bestx需计算时间O(n),从而整个算法的计算时间复杂性为O(n!)。判别是否构成回路新加入的点能与前面连接,且加上后i点的路径是最优?计算机算法设计与分析计算机算法设计与分析26页圆排列问题给定n个大小不等的圆c1,c2,…,cn,现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。例如,当n=3,且所给的3个圆的半径分别为1,1,2时,这3个圆的最小长度的圆排列如图所示。其最小长度为2+4227页 floatCircle::Center(intt) {//计算当前所选择圆的圆心横坐标{ if(t>n)Compute(); else for(intj=t;j<=n;j++){ Swap(r[t],r[j]); floatcenterx=Center(t); } x[t]=centerx; Backtrack(t+1); } Swap(r[t],r[j]); }} if(x[i]+r[i]>high)high=x[i]+r[i]; } if(high-low<min)min=high-low; }圆排列问题 min在算法中 红点影响计 算?计算机算法设计与分析计算机算法设计与分析左/右边界 low/high low=0计算机算法设计与分析计算机算法设计与分析28页圆排列问题 •上述算法尚有许多改进的余地。例如,象1,2,…,n-1,n和 n,n-1,…,2,1这种互为镜像的排列具有相同的圆排列长度, 只计算一个就够了,可减少约一半的计算量。另一方面,如 果所给的n个圆中有k个圆有相同的半径,则这k个圆产生的 k!个完全相同的圆排列,只计算一个就够了。 复杂度分析 由于算法backtrack在最坏情况下可能需要计算 O(n!)次当前圆排列长度,每次计算需O(n)计算 时间,从而整个算法的计算时间复杂性为 O((n+1)!)计算机算法设计与分析计算机算法设计与分析29页 电路板排列问题在大规模电子系统的设计中存在着电路板排列问题。这个问题的经典形式为将n个电路板放置到一个机箱的许多插槽中。n个电路板的每一种排列定义了一种放置方法。令:B={b1,.,bn}表示n个电路板。m个网组集合L={N1,.,Nm}由电路板定义,Ni是B的子集,子集Ni中的元素需要连接起来。实际中用电线将插有这些电路板的插槽连接起来。计算机算法设计与分析计算机算法设计与分析30页 电路板排列问题令n=8,m=5。集合B和L如下:B={b1,b2,b3,b4,b5,b6,b7,b8}L={N1,N2,N3,N4,N5}N1={b4,b5,b6}N2={b2,b3}N3={b1,b3}N4={b3,b6}N5={b7,b8}如果b4后插入b2,那么b5和b6要与b4连接,肯定会跨过b2计算机算法设计与分析计算机算法设计与分析31页 电路板排列问题令x为电路板的一个排列。电路板xi被放置到机箱的插槽i中。density(x)为机箱中任意一对相邻插槽间所连电线数目中的最大值。对于图,density为2。有两根电线连接了插槽2和3,插槽4和5,插槽5和6。插槽6和7之间无电线,余下的相邻插槽都只有一根电线。电路板排列问题的目标是找到一种电路板的排列方式,使其有最小的density。计算机算法设计与分析计算机算法设计与分析32页 电路板排列问题用一个n×m的整型数组B表示输入,当且仅当Nj中包含电路板bi时,B[i][j]=1。令total[j]为Nj中电路板的数量(第j组)。对于任意部分的电路板排列x[1:i],令now[j]为在x[1:i]中被包含在Nj中的电路板的数量(第j组)。当且仅当now[j]>0且now[j]≠total[j]时,Nj在插槽i和i+1之间有连线。now[j]表示J中有相连的电路板,已经加入了多少。如果total[j]>now[j],表示跟后面会有跨越的连线。计算机算法设计与分析计算机算法设计与分析33页 电路板排列问题classBoard{ friendArrangeBoards(int**,int,int,int[]); private: voidBestOrder(inti,intcd); int*x,//到达当前节点的路径 *bestx,//目前的最优排列 *total,//total[j]=带插槽j的板的数目 *now,//now[j]=在含插槽j的部分排列中的板的数目 bestd,//bestx的密度 n,//板的数目 m,//插槽的数目 **B;//板的二维数组};计算机算法设计与分析计算机算法设计与分析34页 电路板排列问题voidBoard::BestOrder(inti,intcd){//按回溯算法搜索排列树if(i==n){ for(intj=1;j<=n;j++)bestx[j]=x[j]; bestd=cd;}else//尝试子树 for(intj=i;j<=n;j++){ //用x[j]作为下一块电路板进行尝试 intld=0; for(intk=1;k<=m;k++){ now[k]+=B[x[j]][k]; if(now[k]>0&&total[k]!=now[k])ld++; //更新ld为局部排列的总密度 if(cd>ld)ld=cd;//取当前最大的一个插槽(电路板)的新密度 if(ld<bestd){//仅当子树中包含一个更优的排列时,搜索该子树 Swap(x[i],x[j]); BestOrder(i+1,ld); Swap(x[i],x[j]);} for(k=1;k<=m;k++)now[k]-=B[x[j]][k];//重置 }} now[k]>0表示前面已有需要连接 的板子。 total[k]!=now[k]该块中板子还没 有完全加入//新加入的插槽(电路板)线密度}计算机算法设计与分析计算机算法设计与分析35页 连续邮资问题假设国家发行了n种不同面值的邮票,并且规定每张信封上最多只允许贴m张邮票。连续邮资问题要求对于给定的n和m的值,给出邮票面值的最佳设计,在1张信封上可贴出从邮资1开始,增量为1的最大连续邮资区间。 例如,当n=5和m=4时,面值为(1,3,11,15,32)的5种邮票可以 贴出邮资的最大连续邮资区间是1到70。计算机算法设计与分析计算机算法设计与分析36页连续邮资问题 •解向量:用n元组x[1:n]表示n种不同的邮票面值,并约定它 们从小到大排列。x[1]=1是唯一的选择。 •可行性约束函数:已选定x[1:i-1],最大连续邮资区间是 [1:r],接下来x[i]邮票的票面可取值范围是[x[i-1]+1:r+1]。 •首先x[1]=1是毫无疑问的,否则最小邮资1无法支付。 •面值为1的邮票构成的最大连续区间只能是[1,m](只贴1张就是1……m张邮票全贴满是m)。 如果这时候再给我们第二种面额的邮票。因为它需要比x[1]大,所以最少只能是2;又因为 单纯由x[1]支付的邮资区间最大只到m,再往上就出现了断档,所以x[2]最大也只能取 m+1(如果再大的话,m+1这个值就无法正常表示)…… •同样的道理,假设前面k种邮票面值都已经有了,并且能构成[1,r]的连续邮资区间,那么 第k+1种邮票的面值必须满足: •x[k]+1<=x[k+1]<=r+1计算机算法设计与分析计算机算法设计与分析37页//中间有一个是初始值maxint,就不连续了while(y[r]<maxint)r++;P174例子程序连续邮资问题 如何确定r的值? 计算X[1:i]的最大连续邮资区间在本算法中被频繁使用到,因 此势必要找到一个高效的方法。考虑到直接递归的求解复杂度 太高,我们不妨尝试计算用不超过m张面值为x[1:i]的邮票贴出 邮资k所需的最少邮票数y[k]。通过y[k]可以很快推出r的值。 事实上,y[k]可以通过递推在O(n)时间内解决: for(intj=0;j<=x[i-2]*(m-1);j++)//x[i-1]:新值,x[i-2]已有最大值 if(y[j]<m) for(intk=1;k<=m-y[j];k++)//还可以用几张凑(剩几张) if(y[j]+k<y[j+x[i-1]*k])y[j+x[i-1]*k]=y[j]+k; //y[j+x[i-1]*k的值由y[j]张该处值+k张x[i-1]的值累计而成计算机算法设计与分析计算机算法设计与分析38页连续邮资问题 if(i>n){ if(r-1>maxvalue){ maxvalue=r-1; for(intj=1;j<=n;j++) bestx[j]=x[j];} return; } //当到达n张不同票面时,结束 //如果r增大,取新值计算机算法设计与分析计算机算法设计与分析39页连续邮资问题 int*z=newint[maxl+1]; for(intk=1;k<=maxl;k++)z[k]=y[k];//保存 for(j=x[i-1]+1;j<=r;j++){ x[i]=j;//新值 Backtrack(i+1,r); for(intk=1;k<=maxl;k++)y[k]=z[k];//恢复 } delete[]z;计算机算法设计与分析计算机算法设计与分析40页回溯法效率分析 通过前面具体实例的讨论容易看出,回溯算法的效率在很大程 度上依赖于以下因素: (1)产生x[k]的时间; (2)满足显约束的x[k]值的个数; (3)计算约束函数constraint的时间; (4)计算上界函数bound的时间; (5)满足约束函数和上界函数约束的所有x[k]的个数。 好的约束函数能显著地减少所生成的结点数。但这样的约束函 数往往计算量较大。因此,在选择约束函数时通常存在生成结 点数与约束函数计算量之间的折衷。计算机算法设计与分析计算机算法设计与分析41页重排原理对于许多问题而言,在搜索试探时选取x[i]的值顺序是任意的。在其它条件相当的前提下,让可取值最少的x[i]优先。从图中关于同一问题的2棵不(a)同解空间树,可以体会到这种策略的潜力。 (b) 图(a)中,从第1层剪去1棵子树,则从所有应当考虑的3元组中 一次消去12个3元组。对于图(b),虽然同样从第1层剪去1棵子 树,却只从应当考虑的3元组中消去8个3元组。前者的效果明 显比后者好。
本文档为【5回溯法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
精品文库
一线资深教师,拥有丰富的教学经验!
格式:ppt
大小:6MB
软件:PowerPoint
页数:0
分类:
上传时间:2020-01-31
浏览量:9