深入浅出 A* 算法 (二)

143 阅读2分钟

在 深入浅出 A* 算法 (一)中,我们讲解了 A* 算法的运行逻辑,通过一个简单的小案例,来展示怎么寻找最优路径,但是在上一篇节的末尾,我留了一个疑问,如果在路径上存在障碍物,A* 算法又应该怎么执行

接下来我们通过第二个小案例来展示A * 算法

假设还是一样的地图,还是从C1 到 C5

不过此时 【B3,C3,D3】这三个点位是障碍物

我们第一步还是和以前一样,寻找C1 附近的点位

算出五个点位的最终评分

B1 = 1 + 5 = 6

B2 = 1.4 + 4 = 5.4

C2 = 1 + 3 = 4

D1 = 1 + 5 = 6

D2 = 1.4 + 4 = 5.4

取出这里面的最小值,放入到关闭列表中,其他放入到开放列表中

并且C2 在放入关闭列表时,要附加一个parent属性,值为C1,表示C2是通过C1所得到的

此时我们再根据C2去查找相邻的点位,但是我们发现,由于B3,C3,D3是障碍物,与C2相邻,且没有被发现的点位为null

那么遇到这种情况,我们就需要去开放列表里面去找评分最小的点位

可以得出 【B2,D2】的评分最小,我们需要随机取其中一个点位,假设我们以B2为下一个点位,

并将B2放入到关闭列表中

然后我们在拿到B2 相邻的点位 【A1,A2,A3】,并计算出他们的最终评分

A1 = 1.4 + 1.4 + 6 = 8.8

A2 = 1.4 + 1 + 5 = 7.4

A3 = 1.4 + 1.4 + 4 = 6.8

其中 A3的最终评分最低,将A3放入到关闭列表中

此时,地图上的点位如下

我们再根据A3 去查找【A4,B4】的点位

A4 = 2.8 + 1 + 3 = 6.8

B4 = 2.8 + 1.4 + 2 = 6.2 

我们将B4放入到关闭列表中

接下来我们再次获取B4的相邻点位 【B5,C4,C5】

由于C5是我们的目标点位,所以当查找到C5时,遍历也就结束

C5是根据B4查找到的,所以C5的parent是B4,然后我们再根据关闭列表里面每个元素,以及每个元素的parent来得出最优路径

由C5得出B4

B4的parent是A3

A3  -->  B2 -->  C1

最优路径就是   C1-B2-A3-B4-C5

到此我们的A*算法(带有障碍物)的案例就讲解完毕了,谢谢大家