- 1、本文档共29页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
避免无效搜索 单击增加标题内容 用约束函数在扩展结点出剪去不满足约束的子树 用限界函数剪去得不到最优解的子树 两类函数通称为剪枝函数 递归回溯 Void backTrace (int t) {If(tn) { output(x); }else{ for(i=f(n,t);i=g(n,t);i++){ x[t]=h[i]; if(constraint(t)bound(t)){ backtrack(t+1);} } } } Void iterativeBacktrack(int t) {t=1; While(t0){ if(f(n,t)=g(n,t)) for(i=f(n,t);i=g(n,t);i++){ x[t]=h[i]; if(constraint(t)bound(t)) { if(solution(t))output(x); else t++;} } else t---; } } 迭代回溯 在8×8的棋盘上放置8个皇后,使得这8个皇后不在同一行、同一列及同一斜角线上。如图: N后问题 剪枝函数 8皇后问题可以表示成8元组(x1,…,x8),其中xi是放在第i行的皇后所在的列号。于是,解空间由8个8元组组成。 约束条件:xi≠xj for all i, j |xi-xj|≠| j-i | 约束条件之一为没有两个xi相同(即任意两个皇后不在同一列上)。其二为没有两个皇后在同一斜线上。 Q Q Q Q Q Q Q Q 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 N后问题主要算法部分 boolean place(int k) { int i; for (i=1;ik;i++) { if((x[i]==x[k])||(abs(x[i]-x[k])==abs(i-k))) return false; } return true; } void backTrack(int t) { if (tn) { sum++; print(x); } else{ for(i=1;i=n;i++){ x[t]=i; if (place(t)) backtrack(t+1); } } 圆排列问题 ?给定n个大小不等的圆c1,c2,…,cn,现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。例如,当n=3,且所给的3个圆的半径分别为1,1,2时,这3个圆的最小长度的圆排列如图所示。其最小长度为 圆排列问题的解空间是一棵排列树。按照回溯法搜索排列树的算法框架,设开始时a=[r1,r2,……rn]是所给的n个元的半径,则相应的排列树由a[1:n]的所有排列构成。 ? ? 解圆排列问题的回溯算法中,CirclePerm(n,a)返回找到的最小的圆排列长度。初始时,数组a是输入的n个圆的半径,计算结束后返回相应于最优解的圆排列。center计算圆在当前圆排列中的横坐标,由x^2 = sqrt((r1+r2)^2-(r1-r2)^2)推导出x = 2*sqrt(r1*r2)。Compoute计算当前圆排列的长度。变量min记录当前最小圆排列长度。数组r表示当前圆排列。数组x则记录当前圆排列中各圆的圆心横坐标。 在递归算法Backtrack中,当in时,算法搜索至叶节点,得到新的圆排列方案。此时算法调用Compute计算当前圆排列的长度,适时更新当前最优值。 ? ? ?当in时,当前扩展节点位于排列树的i-1层。此时算法选择下一个要排列的圆,并计算相应的下界函数。 算法设计 ? ? ?如果不考虑计算当前圆排列中各圆的圆心横坐标和计算当前圆排列长度所需的计算时间按,则 Backtrack需要O(n!)计算时间。由于算法Backtrack在最坏情况下需要计算O(n!)次圆排列长度,每次计算需要O(n)计算时间,从而整个算法的计算时间复杂性为O((n+1)!) ? ? ?上述算法尚有许多改进的余地。例如,像1,2,…,n-1,n和n,n-1, …,2,1这种互为镜像的排列具有相同的圆排列长度,只计算一个就够了,可减少约一半的计算量。另一方面,如果所给的n个圆中有k个圆有相同的半径,则这k个圆产生的k!个完全相同的圆排列,只计算一个就够了。 算法效率 电路板排列问题 将n块电路板以最佳排列方式插入带有n个插槽的机箱中。n块电路板的不同排列方式对应于不同的电路板插入方案。设B={1, 2,
文档评论(0)