A*, A Star A星算法详解( 二 )


2 , 寻找起点周围所有可到达或者可通过的方格 , 跳过有墙 , 水 , 或其他无法通过地形的方格 。也把他们加入开启列表 。为所有这些方格保存点A作为“父方格” 。当我们想描述路径的时候 , 父方格的资料是十分重要的 。后面会解释它的具体用途 。
3 , 从开启列表中删除点A , 把它加入到一个“关闭列表” , 列表中保存所有不需要再次检查的方格 。
在这一点 , 你应该形成如图的结构 。在图中 , 暗绿色方格是你起始方格的中心 。它被用浅蓝色描边 , 以表示它被加入到关闭列表中了 。所有的相邻格现在都在开启列表中 , 它们被用浅绿色描边 。每个方格都有一个灰色指针反指他们的父方格 , 也就是开始的方格 。
[图2]
接着 , 我们选择开启列表中的临近方格 , 大致重复前面的过程 , 如下 。但是 , 哪个方格是我们要选择的呢?是那个F值最低的 。
路径评分
选择路径中经过哪个方格的关键是下面这个等式:
F = G + H
这里:
* G = 从起点A , 沿着产生的路径 , 移动到网格上指定方格的移动耗费 。
* H = 从网格上那个方格移动到终点B的预估移动耗费 。这经常被称为启发式的 , 可能会让你有点迷惑 。这样叫的原因是因为它只是个猜测 。我们没办法事先知道路径的长度 , 因为路上可能存在各种障碍(墙 , 水 , 等等) 。虽然本文只提供了一种计算H的方法 , 但是你可以在网上找到很多其他的方法 。
我们的路径是通过反复遍历开启列表并且选择具有最低F值的方格来生成的 。文章将对这个过程做更详细的描述 。首先 , 我们更深入的看看如何计算这个方程 。
正如上面所说 , G表示沿路径从起点到当前点的移动耗费 。在这个例子里 , 我们令水平或者垂直移动的耗费为10 , 对角线方向耗费为14 。我们取这些值是因为沿对角线的距离是沿水平或垂直移动耗费的的根号2(别怕) , 或者约1.414倍 。为了简化 , 我们用10和14近似 。比例基本正确 , 同时我们避免了求根运算和小数 。这不是只因为我们怕麻烦或者不喜欢数学 。使用这样的整数对计算机来说也更快捷 。你不就就会发现 , 如果你不使用这些简化方法 , 寻路会变得很慢 。
既然我们在计算沿特定路径通往某个方格的G值 , 求值的方法就是取它父节点的G值 , 然后依照它相对父节点是对角线方向或者直角方向(非对角线) , 分别增加14和10 。例子中这个方法的需求会变得更多 , 因为我们从起点方格以外获取了不止一个方格 。
H值可以用不同的方法估算 。我们这里使用的方法被称为曼哈顿方法 , 它计算从当前格到目的格之间水平和垂直的方格的数量总和 , 忽略对角线方向 。然后把结果乘以10 。这被成为曼哈顿方法是因为它看起来像计算城市中从一个地方到另外一个地方的街区数 , 在那里你不能沿对角线方向穿过街区 。很重要的一点 , 我们忽略了一切障碍物 。这是对剩余距离的一个估算 , 而非实际值 , 这也是这一方法被称为启发式的原因 。想知道更多?你可以在这里找到方程和额外的注解 。
F的值是G和H的和 。第一步搜索的结果可以在下面的图表中看到 。F,G和H的评分被写在每个方格里 。正如在紧挨起始格右侧的方格所表示的 , F被打印在左上角 , G在左下角 , H则在右下角 。