ImageVerifierCode 换一换
格式:DOC , 页数:9 ,大小:71.50KB ,
资源ID:6546235      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-6546235.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(谈搜索算法的剪枝优化.doc)为本站会员(lxhqcj)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

谈搜索算法的剪枝优化.doc

1、谈搜索算法的剪枝优化【摘要】本文讨论了搜索算法中“剪枝”这一常见的优化技巧。首先由回溯法解决迷宫问题展开论述,介绍了什么是剪枝;而后分析剪枝的三个原则棗正确、准确、高效,并分别就剪枝的两种思路:可行性剪枝及最优性剪枝,结合例题作进一步的阐述;最后对剪枝优化方法进行了一些总结。【关键字】搜索、优化、剪枝、时间复杂度引 论在竞赛中,我们有时会碰到一些题目,它们既不能通过建立数学模型解决,又没有现成算法可以套用,或者非遍历所有状况才可以得出正确结果。这时,我们就必须采用搜索算法来解决问题。搜索算法按搜索的方式分有两类,一类是深度优先搜索,一类是广度优先搜索。我们知道,深度搜索编程简单,程序简洁易懂,

2、空间需求也比较低,但是这种方法的时间复杂度往往是指数级的,倘若不加优化,其时间效率简直无法忍受;而广度优先搜索虽然时间复杂度比前者低一些,但其庞大的空间需求量又往往让人望而却步。所以,对程序进行优化,就成为搜索算法编程中最关键的一环。本文所要讨论的便是搜索算法中优化程序的一种基本方法棗“剪枝”。什么是剪枝相信刚开始接触搜索算法的人,都做过类似迷宫这样的题目吧。我们在“走迷宫”的时候,一般回溯法思路是这样的:1、这个方向有路可走,我没走过2、往这个方向前进3、是死胡同,往回走,回到上一个路口4、重复第一步,直到找着出口这样的思路很好理解,编程起来也比较容易。但是当迷宫的规模很大时,回溯法的缺点便

3、暴露无遗:搜索耗时极巨,无法忍受。我们可不可以在向某个方向前进时,先一步判断出这样走会不会走到死胡同里呢?这样一来,搜索的时间不就可以减少了吗?答案是:可以的。 剪枝的概念,其实就跟走迷宫避开死胡同差不多。若我们把搜索的过程看成是对一棵树的遍历,那么剪枝顾名思义,就是将树中的一些“死胡同”,不能到达我们需要的解的枝条“剪”掉,以减少搜索的时间。搜索算法,绝大部分需要用到剪枝。然而,不是所有的枝条都可以剪掉,这就需要通过设计出合理的判断方法,以决定某一分支的取舍。在设计判断方法的时候,需要遵循一定的原则。剪枝的原则1、正确性正如上文所述,枝条不是爱剪就能剪的。如果随便剪枝,把带有最优解的那一分支

4、也剪掉了的话,剪枝也就失去了意义。所以,剪枝的前提是一定要保证不丢失正确的结果。2、准确性在保证了正确性的基础上,我们应该根据具体问题具体分析,采用合适的判断手段,使不包含最优解的枝条尽可能多的被剪去,以达到程序“最优化”的目的。可以说,剪枝的准确性,是衡量一个优化算法好坏的标准。3、高效性 设计优化程序的根本目的,是要减少搜索的次数,使程序运行的时间减少。但为了使搜索次数尽可能的减少,我们又必须花工夫设计出一个准确性较高的优化算法,而当算法的准确性升高,其判断的次数必定增多,从而又导致耗时的增多,这便引出了矛盾。因此,如何在优化与效率之间寻找一个平衡点,使得程序的时间复杂度尽可能降低,同样是

5、非常重要的。倘若一个剪枝的判断效果非常好,但是它却需要耗费大量的时间来判断、比较,结果整个程序运行起来也跟没有优化过的没什么区别,这样就太得不偿失了。综上所述,我们可以把剪枝优化的主要原则归结为六个字:正确、准确、高效。剪枝算法按照其判断思路可大致分成两类:可行性剪枝及最优性剪枝。下面分别结合例题对这两种方法进行阐述。可行性剪枝这个方向可不可以走?走下去会不会碰到死胡同?这就是对某一枝条进行可行性剪枝的简要判断过程。我们现来看这样一道题。问题简述:一个规则矩形网络状的城市,城市中心坐标为(0,0)。城市包含 M 个无法通行的路障(M= clogt.y) or (y-pathwayi2*i cl

6、ogt.y)and(y = clogt.x) or (x-pathwayi1*i clogt.x)and(x _sum(step) or(abs(y) _sum(step) or 不能“回头”了? (i = wayo) 重复走同一个方向了? or (abs(i-wayo) = 2) 折返了? then _is_able_to_pass := FALSEEnd;Procedure _main(step, x, y : integer); step 第几步 x, y 当前坐标 Var i : byte;Begin if (x = 0) and (y = 0) and (step = n+1)the

7、n Begin_out; 若到达(0,0)则输出,回溯 Exit End;if step n then Exit; 如果超过步数没有回到起点就回溯 for i := 1 to 4 do 尝试每个方向 if _is_able_to_pass 如果通行 (x+pathi1*step, y+pathi2*step, i, step) then BeginInc(o); wayo := i; 存下路径 _main(step+1, 走下一步 x+pathi1*step, y+pathi2*step); 改变坐标 Dec(o) 恢复原来的路径 EndEnd;Procedure _exit;BeginWri

8、teln(fp, Found , results, golygon(s).);Close(fp)End;Begin_init;o := 1; way1 := 1;_main(2, 1, 0);_exitEnd.二、用动态规划求上界再搜索的迷宫问题源程序: (为了便于测试,没有输出路径 )Constinput = trip.dat;output= trip.out;path : Array 14, 12 of shortint =(-1, 0), (1, 0), (0, -1), (0, 1);maxn = 30;maxm = 30;Varfp : text;n, m, x0, y0, x1,

9、y1, all, o, results, xx : longint; all 路径总数;results 上界 r : Array 1maxn, 1maxm of shortint; 迷宫,0-可行,-1 障碍 way : Array 11000 of byte; 储存路径 l : Array 1maxn, 1maxm of integer; 动态规划的数组 Procedure _init;Var a, b, x : byte;BeginAssign(fp, input); Reset(fp);Readln(fp, n, m, x);for x := x downto 1 do BeginRea

10、dln(fp, a, b);ra,b := -1End;Readln(fp, x0, y0, x1, y1);Close(fp);Assign(fp, output); Rewrite(fp)End;Procedure _solve; 动态规划 Var i, j, k : integer; b : boolean;Beginlx0,y0 := 1;Repeatb:= TRUE;for i := 1 to n do for j := 1 to m do for k := 1 to 4 doif (li,j 0) thenif (i+pathk1 0) and (i+pathk1 0) and (

11、j+pathk2 -1) then 不是障碍 if (li,j+1 results then Exit; 如果超出上界就立刻回溯 if (x = x1) and (y = y1) then Begin Inc(all); Exit End; 到达终点,输出 for i := 1 to 4 do if (x+pathi1 0) and (x+pathi1 0) and (y+pathi2 -1) 不越界,而且不遇到障碍 and (abs(lx1,y1-lx+pathi1,y+pathi2) abs(lx1,y1-lx,y) 如果那一格的“估价值”比当前这一格好才往那个方向走 then BeginInc(o);wayo := i; rx,y := -1; 存储路径,把走过的格置成障碍 _main(x+pathi1, y+pathi2); 搜索下一格 Dec(o); rx,y := 0EndEnd;Procedure _exit;Var i, j : byte;BeginWriteln(fp, all);Close(fp)End;Begin_init;_solve;_main(x0, y0);_exitEnd.

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报