A*算法入门

来源:互联网 发布:全景漫游制作软件 编辑:程序博客网 时间:2024/06/14 04:56

http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx  收藏一下



在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算法。


启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。


估价函数:从当前节点移动到目标节点的预估费用;这个估计就是启发式的。在寻路问题和迷宫问题中,我们通常用曼哈顿(manhattan)估价函数(下文有介绍)预估费用。


A*算法与BFS:可以这样说,BFS是A*算法的一个特例。对于一个BFS算法,从当前节点扩展出来的每一个节点(如果没有被访问过的话)都要放进队列进行进一步扩展。也就是说BFS的估计函数h永远等于0,没有一点启发式的信息,可以认为BFS是“最烂的”A*算法。


选取最小估价:如果学过数据结构的话,应该可以知道,对于每次都要选取最小估价的节点,应该用到最小优先级队列(也叫最小二叉堆)。在C++的STL里有现成的数据结构priority_queue,可以直接使用。当然不要忘了重载自定义节点的比较操作符。


A*算法的特点:A*算法在理论上是时间最优的,但是也有缺点:它的空间增长是指数级别的。


IDA*算法:这种算法被称为迭代加深A*算法,可以有效的解决A*空间增长带来的问题,甚至可以不用到优先级队列。如果要知道详细:google一下。




 
A*寻路初探(转载)


 


作者:Patrick Lester


译者:Panic2005年


 


译者序:很久以前就知道了A*算法,但是从未认真读过相关的文章,也没有看过代码,只是脑子里有个模糊的概念。这次决定从头开始,研究一下这个被人推崇备至的简单方法,作为学习人工智能的开始。


这篇文章非常知名,国内应该有不少人翻译过它,我没有查找,觉得翻译本身也是对自身英文水平的锻炼。经过努力,终于完成了文档,也明白的A*算法的原理。毫无疑问,作者用形象的描述,简洁诙谐的语言由浅入深的讲述了这一神奇的算法,相信每个读过的人都会对此有所认识(如果没有,那就是偶的翻译太差了--b)。


现在是年月日的版本,应原作者要求,对文中的某些算法细节做了修改。


原文链接:http://www.gamedev.net/reference/articles/article2003.asp


原作者文章链接:http://www.policyalmanac.org/games/aStarTutorial.htm


更多 内容请点击这里看原文


理解A*寻路算法具体过程

http://www.cnblogs.com/technology/archive/2011/05/26/2058842.html

0 0