`
qbj071hl
  • 浏览: 13362 次
社区版块
存档分类
最新评论

A*搜索算法

 
阅读更多

A*搜索算法
2011年03月28日
  学无止境,把这几年收藏的文章都晒出来,大家共享吧! 声明:早期转载的文章未标明转载敬请原谅,以后将陆续改过来,向原创者致敬! C++ , Direct3D, OpenGL, GPU,OGRE,OSG,STL, Lua, Python, MFC, Win32 (有问题可留言,部分网页看不到图片可网页另存为到本地再打开即可看到) 痞子龙3D编程 QQ技术交流群:32103634
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  经典算法研究系列:一、A*搜索算法               
  作者:July、二零一一年一月
  ----------------------------------
  博主说明:
  1、本经典算法研究系列,此系列文章写的不够好之处,还望见谅。
  2、本经典算法研究系列,系我参考资料,一篇一篇原创所作,转载必须注明作者本人July及出处。
  3、本经典算法研究系列,精益求精,不断优化,永久更新,永久勘误。
  欢迎,各位,与我一同学习探讨,交流研究。
  有误之处,不吝指正。
  -------------------------------------------
  引言
  1968年,的一篇论文,"P. E. Hart, N. J. Nilsson, and B. Raphael. A formal basis for the heuristic determination of minimum cost paths in graphs. IEEE Trans. Syst. Sci. and Cybernetics, SSC-4(2):100-107, 1968"。从此,一种精巧、高效的算法------A*算法横空出世了,并在相关领域得到了广泛的应用。
  启发式搜索算法
  要理解A*搜寻算法,还得从启发式搜索算法开始谈起。
  所谓启发式搜索,就在于当前搜索结点往下选择下一步结点时,可以通过一个启发函数来进行选择,选择代价最少的结点作为下一步搜索结点而跳转其上(遇到有一个以上代价最少的结点,不妨选距离当前搜索点最近一次展开的搜索点进行下一步搜索)。
  DFS和BFS在展开子结点时均属于盲目型搜索,也就是说,它不会选择哪个结点在下一次搜索中更优而去跳转到该结点进行下一步的搜索。在运气不好的情形中,均需要试探完整个解集空间, 显然,只能适用于问题规模不大的搜索问题中。
  而与DFS,BFS不同的是,一个经过仔细设计的启发函数,往往在很快的时间内就可得到一个搜索问题的最优解,对于NP问题,亦可在多项式时间内得到一个较优解。是的,关键就是如何设计这个启发函数。
  A*搜寻算法
  A*搜寻算法,俗称A星算法,作为启发式搜索算法中的一种,这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上。该算法像Dijkstra算法一样,可以找到一条最短路径;也像BFS一样,进行启发式的搜索。
  A*算法最为核心的部分,就在于它的一个估值函数的设计上:
  f(n)=g(n)+h(n)
  其中f(n)是每个可能试探点的估值,它有两部分组成:
  一部分,为g(n),它表示从起始搜索点到当前点的代价(通常用某结点在搜索树中的深度来表示)。
  另一部分,即h(n),它表示启发式搜索中最为重要的一部分,即当前结点到目标结点的估值,
  h(n)设计的好坏,直接影响着具有此种启发式函数的启发式算法的是否能称为A*算法。
  一种具有f(n)=g(n)+h(n)策略的启发式算法能成为A*算法的充分条件是:
  1、搜索树上存在着从起始点到终了点的最优路径。
  2、问题域是有限的。
  3、所有结点的子结点的搜索代价值>0。
  4、h(n)=V5的路径,V0->V5的过程中,可以经由V1,V2,V3,V4各点达到目的点V5。下面的问题,即是求此起始顶点V0->途径任意顶点V1、V2、V3、V4->目标顶点V5的最短路径。
  
  //是的,图片是引用rickone 的。
  通过上图,我们可以看出::A*算法最为核心的过程,就在每次选择下一个当前搜索点时,是从所有已探知的但未搜索过点中(可能是不同层,亦可不在同一条支路上),选取f值最小的结点进行展开。
  而所有"已探知的但未搜索过点"可以通过一个按f值升序的队列(即优先队列)进行排列。
  这样,在整体的搜索过程中,只要按照类似广度优先的算法框架,从优先队列中弹出队首元素(f值),对其可能子结点计算g、h和f值,直到优先队列为空(无解)或找到终止点为止。
  A*算法与广度、深度优先和Dijkstra 算法的联系就在于:当g(n)=0时,该算法类似于DFS,当h(n)=0时,该算法类似于BFS。且同时,如果h(n)为0,只需求出g(n),即求出起点到任意顶点n的最短路径,则转化为单源最短路径问题,即Dijkstra算法。这一点,可以通过上面的A*搜索树的具体过程中将h(n)设为0或将g(n)设为0而得到。 
  A*算法流程:
  首先将起始结点S放入OPEN表,CLOSE表置空,算法开始时:
  1、如果OPEN表不为空,从表头取一个结点n,如果为空算法失败。
  2、n是目标解吗?是,找到一个解(继续寻找,或终止算法)。
  3、将n的所有后继结点展开,就是从n可以直接关联的结点(子结点),如果不在CLOSE表中,就将它们放入OPEN表,并把S放入CLOSE表,同时计算每一个后继结点的估价值f(n),将OPEN表按f(x)排序,最小的放在表头,重复算法,回到1。
  //OPEN-->CLOSE,起点-->任意顶点g(n)-->目标顶点h(n)
  closedset := the empty set                 //已经被估算的节点集合   
  openset := set containing the initial node //将要被估算的节点集合
  g_score[start] := 0                        //g(n)
  h_score[start] := heuristic_estimate_of_distance(start, goal)    //h(n)
  f_score[start] := h_score[start]     
  while openset is not empty    //若OPEN表不为空
  x := the node in openset having the lowest f_score[] value //x为OPEN表中最小的
  if x = goal                                               //如果x是一个解
  return reconstruct_path(came_from,goal)             //
  remove x from openset
  add x to closedset                            //x放入
  CLSOE表
  for each y in neighbor_nodes(x)
  if y in closedset
  continue
  tentative_g_score := g_score[x] + dist_between(x,y)
  if y not in openset
  add y to openset
  tentative_is_better := true
  else if tentative_g_score y-->goal
  f_score[y] := g_score[y] + h_score[y]
  return failure
  function reconstruct_path(came_from,current_node)
  if came_from[current_node] is set
  p = reconstruct_path(came_from,came_from[current_node] )
  return (p + current_node)
  else
  return the empty path 
  与结点写在一起的数值表示那个结点的价值f(n),当OPEN表为空时CLOSE表中将求得从V0到其它所有结点的最短路径。
  考虑到算法性能,外循环中每次从OPEN表取一个元素,共取了n次(共n个结点),每次展开一个结点的后续结点时,需O(n)次,同时再对OPEN表做一次排序,OPEN表大小是O(n)量级的,若用快排就是O(nlogn),乘以外循环总的复杂度是O(n^2 * logn),
  如果每次不是对OPEN表进行排序,因为总是不断地有新的结点添加进来,所以不用进行排序,而是每次从OPEN表中求一个最小的,那只需要O(n)的复杂度,所以总的复杂度为O(n*n),这相当于Dijkstra算法。
  本文完。
  July、二零一一年二月十日更新。
  ------------------------------------------------
  后续:July、二零一一年三月一日更新。
  简述A*最短路径算法的方法:
  目标:从当前位置A到目标位置B找到一条最短的行走路径。
  方法:从A点开始,遍历所有的可走路径,记录到一个结构中,记录内容为(位置点,最小步数)
  当任何第二次走到一个点的时候,判断最小步骤是否小于记录的内容,如果是,则更新掉原最小步数,一直到所有的路径点都不能继续都了为止,最终那个点被标注的最小步数既是最短路径,
  而反向找跟它相连的步数相继少一个值的点连起来就形成了最短路径,当多个点相同,则任意取一条即可。
  总结:
  A*算法实际是个穷举算法,也与课本上教的最短路径算法类似。课本上教的是两头往中间走,也是所有路径都走一次,每一个点标注最短值。(i am sorry。文章,写的差,恳请各位读者参考此A*搜寻算法的后续一篇文章: 一(续)、A*,Dijkstra,BFS算法性能比较及A*算法的应用。谢谢大家。)本文完。
  作者声明:
  本人July对本博客所有任何内容和资料享有版权,转载请注明作者本人July及出处。
  永远,向您的厚道致敬。谢谢。July、二零一零年十二月二十三日。
  http://blog.csdn.net/v_JULY_v/archive/2010/12/23/6 093380.aspx
分享到:
评论

相关推荐

    A*搜索算法源码和运行程序

    A* 搜索算法 A* 寻路算法 游戏算法 源码 可以到我的博客看到运行效果: http://blog.csdn.net/kakashi8841/article/details/7300893

    A星搜索算法教程确定目标最短路径的A*搜索算法教程

    确定目标最短路径的A*搜索算法教程

    A*搜索算法 C++

    使用C++实现了A*的搜索算法,在人工智能方面有很大的应用。采用的一些STL来简化,不过为了保持封装性与接口实现,程序本身还挺长的,很有参考价值。本人已经调试好,共有两个文件,一个是8个方向的算法,另外一个是...

    基于A*算法的最优路径规划系统

    A*算法是一种求解最短路径的有效方法,也是人工智能算法中一种简单的启发式搜索方法。本文介绍了A* 算法的原理及实现机制, 以及在搜索出的结点解空间集中,用A* 算法如何选择最优结点,最终求解出最短路径的过程。

    迷宫求解之A*搜素

    本程序采用A*搜索算法求解迷宫的最优路径。 开发环境:vs2013,.NET4.0

    A*搜索算法matlab实现GUI

    在D算法的基础上进行改进实现的A*搜索算法并且用matlab GUI进行演示,完美运行。绝对可用。

    A星算法 c语言实现 a*算法

    A星算法 用c语言实现 用到了队列 a*算法 A星算法 用c语言实现 用到了队列 a*算法

    迭代深度A*搜索算法

    1. 含有优化步骤:(1)采用Iterative deepening A*算法,加速了A*算法记录路径的步骤,(2)采用部分全局变量,加速了计算过程; 2. Linux编译通过,含makefile和readme 3. 可以解决15数码的问题,比传统的8数码...

    搜索最短路径的A*算法

    搜索最短路径的A*算法 专家论文 讲解了A*算法和其他几种算法的差异

    C语言实现:使用A*算法来解决15数码问题

    A*算法是一种预测算法,主要用于寻路等,根据当前状态和目标状态之间的差异,预测到达目标需要多少开销,根据这个开销来判断下一次选择以那个状态开始。这个开销在八数码问题中可以以路程为标准。

    基于A*搜索算法的飞行冲突解脱方案研究

    基于A*搜索算法的飞行冲突解脱方案研究,刘永欣,杨越,本文对启发式算法中的A*搜索算法在航空器飞行冲突解脱策略中的应用进行了研究。在分析适用于我国的冲突解脱策略的基础上,建立了�

    A*算法解决传教士与野人过河问题(可运行代码)

    A*算法解决传教士与野人过河问题 * 程 序 说 明 * * 功能: 用A*算法求解传教士与野人问题。M=C=5, K=3 * * 说明: * * 本程序按照《人工智能导论》一书所介绍的A*算法求解传教士与野人问题。 * * * * 注意:...

    a*算法流程图(只是流程图)

    a*算法流程图(只是流程图)A*算法是一种在静态路网中求解最短路径最有效的直接搜索方法,也是解决许多其他搜索问题的有效算法。算法中的距离估算值与实际值越接近,扩展的节点数越少, 搜索速度越快。

    A*搜索算法VB实现

    自编VB A星算法程序,可加载任意图片,设置路障,超强!自顶一下.

    【WHUT】*实验报告*《人工智能概论》课内实验:A*算法仿真实验

    请下载并安装附件(虚拟实验软件-启发式搜索.rar)里的智能搜索算法教学实验系统,然后点击A*算法进行仿真实验。 实验要求如下: 1. 单击"A*算法介绍",回顾A*算法的基本原理。 2. 在"A*算法演示程序"中,选择"自动...

    基于matlab的双向A*算法

    A*算法是从起始点开始向目标点搜索,而双向A*是在A*的基础上由起始点和目标点同时搜索,当一方检测到另一方的已检查节点时,搜索结束,在搜索时间效率上,双向A*更快。

    论文研究-汉英统计机器翻译中A*搜索算法研究与实现.pdf

    分析了基于IBM Model 4的A*搜索算法和启发函数,由于仅靠启发函数难以找到最优译文,因此在搜索中采用了部分宽度搜索,以扩大搜索的范围。将该算法应用于汉英统计机器翻译中,实验结果表明改进后的算法获得了较好的...

    A*算法Matlab实例实现

    A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 本实例主要针对自动驾驶技术当中A*算法的应用现象,...

    迷宫问题的A*算法(python实现)

    附件中A_star.py为算法实现,有两个txt文件作为测试样例,mediumMaze是一个封闭的迷宫,openmaze是一个开放的迷宫

    A*寻路算法源码 附带桌面演示工具

    A*算法是自动寻路的理想解决办法 像自动寻找NPC 自动寻找地图出口 我写的这个只是简单的实现了功能 在运算效率上没有做优化 在接下来的版本中我会增加二*堆算法 来提高A*算法的效率 请大家多多关注 包中还有一个我用...

Global site tag (gtag.js) - Google Analytics