[互联网]ACM 搜索篇.ppt

  1. 1、本文档共47页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[互联网]ACM 搜索篇

搜索算法是利用计算机的高性能来有目的的穷举一个问题的部分或所有的可能情况,从而求出问题的解的一种方法。 搜索算法被称为“通用解题法”在算法和人工智能中占有重要地位 很多算法其实是搜索算法的拓展(如图论中的某些算法、动态规划、贪心等,只是他们找到了某些规律来进行变相剪枝而已)。;;状态和状态转移:状态(state)是对一个问题在某一时刻进展情况的数学描述,状态转移(state-transition)就是问题从一种状态到另一种(或几种)状态的操作 状态空间state space:搜索的过程其实是在遍历一个隐式图(请回忆数据结构中图的概念)它的结点是所有的状态,有向边对应状态转移,而搜索的一个可行解就是一条从起始结点出发到目标状态集中任一结点的路径!!;题目描述:某人要带一条狗、一只鸡、一箩米过河,但小船除需要人划外,最多只能载一物过河,而当人不在场时,狗要咬鸡、鸡要吃米。问此人应如何过河? 思考:如何建立状态及状态转移方程??;状态:建立四元空间(人,狗,鸡,米)。用0表示在左岸,1表示在右岸。 起始状态(0,0,0,0),终止状态(1,1,1,1) 状态转移规则: (a,b,c,d) →(1-a,1-b,c,d)(当a=b) →(1-a,b,1-c,d)(当a=c) →(1-a,b,c,1-d)(当a=d) →(1-a,b,c,d) 约束:(a,b,c,d)中,当a≠b时b≠c;当a≠c时c≠d;盲目搜索: 深度优先搜索depth first search(DFS) 广度优先搜索breadth first search(BFS) 纯随机搜索、重复式搜索、迭代加深搜索、 迭代加宽搜索、柱型搜索 启发式搜索: A*算法 IDA*算法 主要介绍前两种 ;算法描述:按照深度优先的顺序遍历状态空间,通常用递归或者栈来实现。 说白了就是往深里搜,当某个结点的所有子节点都搜索过了就返回父结点继续进行。 就像走迷宫,你没有办法用分身术来站在每个走过的位置。不撞南山不回头。;算法框架: Procedure DFS(State:Statetype;depth:integer) Begin for operand:=1 to operandcount(state) do begin NewState:=DoOperand(State,Operand); if answer then print else if depthmaxdepth then DFS(Newstate,depth+1); end; End.;问题描述:输入正整数t、n,然后是n个正整数(单调非递增)。若n个数中某几个数的和是t,输出这些加法表达式(表达式不重复输出) ;无解输出“NONE” ;状态:计算中间值r 转移规则: r →r-ai(取第i个数ai) →r (不取第i个数) 起始状态:所输入的t 中止状态:0 ;有一个字母序列,对它每个元素进行入栈、出栈操作。判断是否能得到指定输出序列,如果可以,输出相应的栈操作。;n个数排一圆环,要求相邻两个数和为素数。;练习: 八皇后问题 思考如何剪枝;因为大量的搜索状态空间可以看成一个树形结构,我们的任务就是探测每个叶子节点来获取信息,如果我们能在某个结点就将其所有子结点的可能性都排除我们就能减少搜索量!;算法描述:按照广度优先的顺序遍历状态空间,优先搜索当前结点的所有子结点,一般采用队列实现 就像你的眼镜掉在地上以后,你趴在地板上找。你总是先摸最接近你的地方,如果没有,再摸远一点的地方……;从某个顶点出发开始访问,被访问的顶点作相应的标记,并输出访问顶点号; 从被访问的顶点出发,依次搜索与该顶点有边的关联的所有未被访问的邻接点,并作相应的标记。 再依次根据上一步中所有被访问的邻接点,访问与这些邻接点相关的所有未被访问的邻接点,直到所有顶点被访问为止。;算法框架: Procedure BFS(initialstate:statetype); Begin enqueue(initialstate); while not emptyqueue do begin dequeue(state); for operand:=1 to operandcount(state) do

文档评论(0)

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

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

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档