搜索算法基础.doc

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
搜索算法基础 2003-07-30同济大学编程之道 搜索算法是利用计算机的高性能来有目的的穷举一个问题的部 分或所有的可能情况,从而求出问题的解的一种方法。搜索过程实际 上是根据初始条件和扩展规则构造一棵解答树并寻找符合冃标状态 的节点的过程。 所有的搜索算法从其最终的算法实现上来看,都可以划分成两个 部分——控制结构和产生系统,而所有的算法的优化和改进主要都是 通过修改其控制结构來完成的。现在主要对其控制结构进行讨论,因 此对其产生系统作如下约定: Function ExpendNode (Situation:Tsituation;ExpendWayNo:Integer) :TSitua tion; 表示对给出的节点状态Si tution采用第ExpendWayNo种扩展规 则进行扩展,并且返回扩展后的状态。(本文所采用的算法描述语言 为类 Pascal o) 第一部分基本搜索算法 一、回溯算法 回溯算法纭所有搜索算法中最为基本的一种算法,其采用了一种 “走不通就掉头”思想作为其控制结构,其相当于采用了先根遍彷的 方法来构造解答树,可用于找解或所有解以及最优解。具体的算法描 述如下: [非递归算法] Type Node (节点类型)=Record Situtation:TSituation (当前节点 状态); Way-N0: Integer (已使用过的扩展规则的数B ); End Var List (回溯表):Array[1.. Max(最大深度)]of Node; pos (当前扩展节点编号):Integer; Init List~0; pos~l; List [1]. Situation-初始状态; Main Program While (pos0(有路可走))and ([未达到目标])do Begin If pos=Max then (数据溢出,跳出主程序); Li st [pos]? Way-NO:二Li st[pos]. Way-No+1; Tf (Li st [pos]. Way-NO=TotalExpendMethod= then (如果还 有没用过的扩展规则) Begin Tf (可以使用当前扩展规则)then Begin (用第way条规则扩展当前节点) Li st[pos+1]? Si tuation:二ExpendNode(Li st[pos]? Si tua tion, List[pos]? Way-NO); List [pos+1]. Way-NO:二0; pos:二pos+1; End-If; End-If Else Begi n pos:二pos-1; End-Else End-While; [递归算法] Procedure BackTrack(Situation:TSituation;deepth:Integer); Var I :Integer; Begin If deepthMax then (空间达到极限,跳出本过程); If Situation二Target then (找到目标); For 1:二1 to TotalExpendMethod do Begin BackTrack(ExpendNode(Situation, I), deepth+1); End-For; End; 范例:一个的棋盘上某一点上有一个马,要求寻找一条从这 一点出发不重复的跳完棋盘上所有的点的路线。 评价:回溯算法对空间的消耗较少,当其与分枝定界法一起使用 时,对于所求解在解答树屮层次较深的问题有较好的效果。但应避免 在后继节点可能与前继节点相同的问题中使用,以免产生循环。 二、深度搜寧与广度搜李 深度搜索与「度搜索的控制结构和产生系统很相似,唯一的区别 在于对扩展节点选取上。由于其保留了所有的前继节点,所以在产生 后继节点吋可以去掉一部分重复的节点,从而提高了搜索效率。这两 种算法每次都扩展一个节点的所有子节点,而不同的是,深度搜索下 一次扩展的是本次扩展出来的子节点中的一个,而广度搜索扩展的则 是本次扩展的节点的兄弟节点。在具体实现上为了提高效率,所以釆 用了不同的数据结构. [广度搜索] Type Node(节点类型)^Record Situtation:TSituation (当前节点状态); Level: Integer (当前节点深度); Last : Integer (父节点); End Var List (节点表):Array [1.. Max(最多节点数)]of Node(节点类型); open(总节点数):Integer; close(待扩展节点编号):Integer; New-S:TSituation;(新节点) Init List-0; open-l; close-0; List[

文档评论(0)

ggkkppp + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档