A* (A-star A星)寻路算法

原创 2008年11月01日 18:54:00
A*在游戏寻路算法里使用很广,可是感觉很多介绍它的文章故意让人看不懂。
仔细看了看gamedev.net的一片文章(A* Pathfinding for Beginners http://www.gamedev.net/reference/articles/article2003.asp ),对A*更了解了一点,写点东西记录一下。
A*是一种启发式的算法,所谓的"启发式",就是对每一个搜索的位置进行评估,也就是把找的位置离目标的距离当成找点的一个依据,然后猜测这个点是否最佳("启发式"就是猜测)。

image001.jpg

为了找到最佳的那个点
可以规定:
G = 从起点,沿着产生的路径,移动到网格上指定方格的距离。
H = 从网格上那个方格移动到终点B的预估移动距离。

F = G + H
F最小的点可以认为是该选的点。
引用一下原文的翻译:
我们令水平或者垂直移动的耗费为10,对角线方向耗费为14。我们取这些值是因为沿对角线的距离是沿水平或垂直移动耗费的的根号2(别怕),或者约1.414倍。为了简化,我们用10和14近似。比例基本正确,同时我们避免了求根运算和小数。


既然我们在计算沿特定路径通往某个方格的G值,求值的方法就是取它父节点的G值,然后依照它相对父节点是对角线方向或者直角方向(非对角线),分别增加14和10。例子中这个方法的需求会变得更多,因为我们从起点方格以外获取了不止一个方格。

H 值可以用不同的方法估算。我们这里使用的方法被称为曼哈顿方法,它计算从当前格到目的格之间水平和垂直的方格的数量总和,忽略对角线方向。然后把结果乘以 10。这被成为曼哈顿方法是因为它看起来像计算城市中从一个地方到另外一个地方的街区数,在那里你不能沿对角线方向穿过街区。很重要的一点,我们忽略了一 切障碍物。这是对剩余距离的一个估算,而非实际值,这也是这一方法被称为启发式的原因。想知道更多?你可以在这里找到方程和额外的注解。



第一步搜索的结果可以在下面的图表中看到。F,G和H的评分被写在每个方格里。正如在紧挨起始格右侧的方格所表示的,F被打印在左上角,G在左下角,H则在右下角。

image003.jpg

引用一下原文的翻译:

我们做如下操作开始搜索:
   
1,从点A开始,并且把它作为待处理点存入一个“开启列表”。开启列表就像一张购物清单。尽管现在列表里只有一个元素,但以后就会多起来。你的路径可能会通过它包含的方格,也可能不会。基本上,这是一个待检查方格的列表。
   
2,寻找起点周围所有可到达或者可通过的方格,跳过有墙,水,或其他无法通过地形的方格。也把他们加入开启列表。为所有这些方格保存点A作为“父方格”。当我们想描述路径的时候,父方格的资料是十分重要的。后面会解释它的具体用途。
   
3,从开启列表中删除点A,把它加入到一个“关闭列表”,列表中保存所有不需要再次检查的方格。

为了继续搜索,我们简单的从开启列表中选择F值最低的方格。然后,对选中的方格做如下处理:

   
4,把它从开启列表中删除,然后添加到关闭列表中。
   
5,检查所有相邻格子。跳过那些已经在关闭列表中的或者不可通过的(有墙,水的地形,或者其他无法通过的地形),把他们添加进开启列表,如果他们还不在里面的话。把选中的方格作为新的方格的父节点。
   
6,如果某个相邻格已经在开启列表里了,检查现在的这条路径是否更好。换句话说,检查如果我们用新的路径到达它的话,G值是否会更低一些。如果不是,那就什么都不做。
      另一方面,如果新的G值更低,那就把相邻方格的父节点改为目前选中的方格(在上面的图表中,把箭头的方向改为指向这个方格)。最后,重新计算F和G的值。如果这看起来不够清晰,你可以看下面的图示。


image004.jpg

image005.jpg

image006.jpg

image007.jpg

这样就可以找到最佳路径了。

A*(也叫A star, A星)寻路算法Java版

A*(也叫A star, A星)寻路算法Java版 寻路算法有很多种,A*寻路算法被公认为最好的寻路算法。 原创文章,转载请注明出处:http://blog.csdn.net/ruils/articl...
  • u012379847
  • u012379847
  • 2014年11月04日 10:43
  • 4394

A*算法中二叉堆的使用

这里讲解的二叉堆,其实是以堆的形式存在的二叉树,这个特殊的结构把A*算法对开启列表的排序需求演绎的出神入化,毫无疑问是A*的最佳拍档。     A*算法中最缓慢的部分就是在开启列表中寻找F值最低的节...
  • Ymiku
  • Ymiku
  • 2015年05月24日 22:38
  • 1743

A-Star(A星)寻路算法

转自: https://www.cnblogs.com/yangyxd/articles/5447889.html 参考  http://www.cnblogs.com/technology/...
  • mincheat
  • mincheat
  • 2017年11月29日 17:07
  • 41

A星(A-Star)寻路算法

unit aStarSearchPath;interface uses Classes,SysUtils; type  pAStarPathNode=^tAStarPathNode;  tAStarP...
  • chenyq2008
  • chenyq2008
  • 2008年03月03日 16:45
  • 4567

[Unity] A-Star(A星)寻路算法

在游戏中,有一个很常见地需求,就是要让一个角色从A点走向B点,我们期望是让角色走最少的路。嗯,大家可能会说,直线就是最短的。没错,但大多数时候,A到B中间都会出现一些角色无法穿越的东西,比如墙、坑等障...
  • qq_35957011
  • qq_35957011
  • 2017年07月24日 22:29
  • 520

Unity3d 中的 A*寻路

在本章中,我们将在Unity3D环境中使用C#实现A*算法.尽管有很多其他算法,像Dijkstra算法,但A*算法以其简单性和有效性而广泛的应用于游戏和交互式应用中.我们之前在第一章AI介绍中短暂的涉...
  • aisajiajiao
  • aisajiajiao
  • 2013年12月27日 23:54
  • 13409

一个高效的A-star寻路算法(八方向)

原帖:http://blog.sina.com.cn/s/blog_53a5865c0102dycw.html 原作者是http://www.codefans.net的JAROD 之所以说这个A-...
  • java886o
  • java886o
  • 2013年05月29日 10:34
  • 1445

a*自动寻路算法详解

这篇博文是在其他博客基础上加工的,主要原因是感觉原博客举得例子不太好,很多细节感觉没有描述。 A*算法主要是在父节点更新那个地方很容易误解,但是父节点的更新又是A*算法的核心,因为遍历到目标节点之后就...
  • jialeheyeshu
  • jialeheyeshu
  • 2016年11月09日 20:47
  • 1111

js实现A*寻路算法

js使用canvas绘制界面。
  • lj745280746
  • lj745280746
  • 2014年03月08日 00:00
  • 2142

如何实现A星寻路算法 Cocos2d-x 3.0 beta2

本文实践自 Johann Fradj 的文章《How To Implement A* Pathfinding with Cocos2D Tutorial》,文中使用Cocos2D,我在这里使用Coco...
  • akof1314
  • akof1314
  • 2014年02月17日 13:50
  • 11054
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:A* (A-star A星)寻路算法
举报原因:
原因补充:

(最多只允许输入30个字)