搜索算法深入.ppt

  1. 1、本文档共68页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
搜索优化方法及其应用 什么是搜索 树、图结构基础上 给出初始状态,要求寻找到符合约束条件的目标状态 给出初始状态和目标状态,要求找到从初始状态到目标状态的一条路径。 最优解?全部解? 搜索算法 广度优先搜索 深度优先搜索 搜索实质 穷举 回溯 如果数据量加大? 为什么要优化 减少搜索量,提高搜索效率,尽可能快地找到问题的解。 竞赛的特点(时间\空间限制) 优化的基本方法 时间 提早剪枝、A*、贪心、记忆…… 空间 根据求解的性质、是否保留中间结果…… 引例1 迷宫。以一个 m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,如果只能按上下左右四个方向移动,求出一条从入口到出口的通路。或得出没有通路的结论。 方向:上下左右 方向:右下左上 分析原因 上下左右时 从(1,1)?(5,9)、(5,9)?(1,1),搜索顺序的影响是对等的,因此两者深搜路径长度几乎相等。 右下左上时, 基本符合从(1,1)?(5,9)的大致位置状况,而对从(5,9)?(1,1)显然是不利的,因此,两者在深搜长度上会有很大的变化。 对策? 对时间的优化 (1)缩小搜索范围——避免无效搜索 (2)改变搜索次序 (3)剪枝 (4)记忆化搜索 一、缩小搜索范围 避免无效搜索 (1)对状态进行预处理,减少计算量 (2)增加约束条件,控制搜索树的深广度 (一)预处理 素数环:将1~20这20个数摆成一个环,要求相邻的两个数的和是一个素数。 预处理方案:素数 (二)增加约束条件 邮票面值设计 给定一个信封,最多只允许粘贴N 张邮票,计算在给定K(N+k=40) 种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大max ,使得1-max之间的每一个邮资值都能得到。 算法基本框架 (1)面额为1的邮票是必需的,可以固定。 (2)增加一种面额并把当前所能取到的金额记录下来 (3)通过k-1次(2)的操作 (4)穷举所有的方案得到最优解 优化策略 策略1:在搜索的过程中,对数据的记录方式很关键。如果仅仅记录一个金额能否得到,当下一次添加邮票时并不能明确是否能从这个金额出发添加邮票额,所有的金额必须重新计算,浪费了大量的时间。 记录最少要用几张邮票达到一个面值是比较重要的,这样有利于添加新邮票时迅速判断可行性。 优化策略 策略2:当添加一张新邮票时,对邮票面额的搜索可适当缩小范围。 直接从上一个面额加1直到当前连续取得的最大金额加1就行了。 其他范围内的搜索都是无效的:过大导致不连续;如果小于前一面额的值,就会导致产生面额大小的无序性,造成大量的重复搜索,因此,保证邮票面额递增是基本原则。 数据结构设计 continue[0..maxs]:记录得到各面额最小需要的邮票数量 temp[1..40]:工作数组,记录当前邮票面额设计 max1[1..40]:记录采用当前方案能连续取得的最大面额 project[1..40]:记录最优解 stack[1..40]:栈,用于邮票面额数组temp的维护 procedure maxcont(top,j:integer); {统计本次方案能得到的最大连续数} for i:=1 to n do for t:=0 to max2 do if continue[t+j*i]continue[t]+i then continue[t+j*i]:=continue[t]+i; t:=1; while continue[t]=n do t:=t+1; if t-1max2 then begin max2:=t-1; if (top=k) and (max2max) then begin max:=max2;project:=temp; end; end; init read(n,k); for i:=0 to maxs do continue[i]:=n+1; temp[1]:=1; for i:=0 to n do continue[i]:=i; top:=2; max:=n;j:=temp[1]; max1[1]:=max;stack[1]:=continue; max2:=max; while top1 do begin j:=j+1; if (jmax1[top-1]+1) or (topk) then {?} begin top:

文档评论(0)

精华文档888 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档