在 深入浅出 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*算法(带有障碍物)的案例就讲解完毕了,谢谢大家