此时你将得到如下图所示的样子。在这张图中,中间深绿色的方格是你的起始方格, 所有相邻方格目前都在开放列表中,并且以亮绿色描边。每个相邻方格有一个灰色 的指针指向它们的父方格,即起始方格
接下来,我们在开放列表中选一个相邻方格并再重复几次如前所述的过程。但是我 们该选哪一个方格呢?具有最小F值的那个
路径排序
决定哪些方格会形成路径的关键是这个等式:F = G + H
G=从起点A沿着已生成的路径到一个给定方格的移动开销
H=从给定方格到目的方格的估计移动开销。这种方式常叫做试探,有点困惑人吧。 其实之所以叫做试探法是因为这只是一个猜测。在找到路径之前我们实际上并不知 道实际的距离,因为任何东西都有可能出现在半路上(墙啊,水啊什么的)。本文中 给出了一种计算H值的方法,网上还有很多其他文章介绍的不同方法
我们要的路径是通过反复遍历开放列表并选择具有最小F值的方格来生成的。本文稍 后将详细讨论这个过程。我们先进一步看看如何计算那个等式。
如前所述,G是从起点A沿着已生成的路径到一个给定方格的移动开销,在本例中, 我们指定每一个水平或者垂直移动的开销为 10,对角线移动的开销为 14。因为对角 线的实际距离是 2 的平方根(别吓到啦),或者说水平及垂直移动开销的 1.414 倍。 为了简单起见我们用了 10 和 14 这两个值。比例大概对就好,我们还因此避免了平 方根和小数的计算。这倒不是因为我们笨或者说不喜欢数学,而是因为对电脑来说, 计算这样的数字也要快很多。不然的话你会发现寻找路径会非常慢。
我们要沿特定路径计算给定方格的G值,办法就是找出该方格的父方格的G值,并根 据与父方格的相对位置(斜角或非斜角方向)来给这个G值加上 14 或者 10。在本例 中这个方法将随着离起点方格越来越远计算的方格越来越多而用得越来越多。
有很多方法可以用来估计H值。我们用的这个叫做曼哈顿(Manhattan)方法, 即计算通过水平和垂直方向的平移到达目的地所经过的方格数乘以 10 来得到H值。之所 以叫Manhattan方法是因为这就像计算从一个地方移动到另一个地方所经过的城市 街区数一样,而通常你是不能斜着穿过街区的。重要的是,在计算H值时并不考虑 任何障碍物。因为这是对剩余距离的估计值而不是实际值(通常是要保证估计值不大于实际值)。这就是为什么这个方式被叫做试探法的原因了。
G和H相加就得到了F。第一步搜索所得到的结果如下图所示。每个方格里都标出了F、 G和H值。如起点方格右侧的方格标出的,左上角显示的是F值,左下角是G值,右 下角是H值。
我们来看看这些方格吧。在有字母的方格中,G=10,这是因为它在水平方向上离 起点只有一个方格远。起点紧挨着的上下左右都具有相同的G值 10。对角线方向的 方块G值都是 14。
H值通过估算到红色目标方格的曼哈顿距离而得出。用这种方法得出的起点右侧方 格到红色方格有 3 个方格远,则该方格H值就是 30。上面那个方格有 4 个方格远(注 意只能水平和垂直移动),H就是 40。你可以大概看看其他方格的H值是怎么计算出 来的。
每一个方格的F值,当然就不过是G和H值之和了。
继续搜索
为了继续搜索,我们简单的从开放列表中选择具有最小 F 值的方格,然后对选中的 方格进行如下操作:
4.将其从开放列表中移除,并加到封闭列表中。
5.检验所有的相邻方格,忽略那些不可通过的或者已经在封闭列表里的方格。如果这 个相邻方格不在开放列表中,就把它添加进去。并将当前选定方格设为新添方格的 父方格。
6.如果某个相邻方格已经在开放列表中了(意味着已经探测过,而且已经设置过父方 格――译者),就看看有没有到达那个方格的更好的路径。也就是说,如果从当前选 中方格到那个方格,会不会使那个方格的 G 值更小。如果不能,就不进行任何操作。
相反的,如果新路径的 G 值更小,就将该相邻方格的父方格重设为当前选中方格。
(在上图中是改变其指针的方向为指向选中方格。最后,重新计算那个相邻方格的 F 和 G 值。如果你看糊涂了,下面会有图解说明。