现在,看看网上流传的很广的一篇文章《A* Pathfinding for Beginners》,经典的A STar算法的入门文章,也是我前面推荐的阅读文章。
个人认为,这篇入门文章的算法不能找出最短路径,只能找出较短路径。因为算法有两个问题:
1,这篇入门文章的算法的H函数采用曼哈顿距离,该距离不是节点到终点的最短距离。根据前篇文章的注意点5,算法找出来的不一定是最短路径。看下图
绿色的点代表起点,红色的点代表终点。灰色的点代表不可通过的路径。
根据文章的算法,从起点开始依次扩展最左边的列的点,左下角的点的F值是180。而左上角的点的F值200.那么,根据文章中的算法,图下半面的点的F值统一是180,直至终点都是180,而左上角的点直至算法结束都不会被扩展。
因此,根据文章中的算法选择的路径就是下半面的唯一的一条通向终点的路径。如下图所示,紫色的格代表了选择的路径。
可是实际上的最短路径是下图所示的路径:
2,将AStar算法入门文章中的算法和本文前面列出的算法进行比较,可以发现一个区别,就是当某个节点已经在close链表中时。AStar算法入门文章中的算法是当某个节点已经在close链表中时就不会被重新放到open链表再次进行扩展,但是本文前面列出的的算法是当某个节点在close链表中时可以被重新放到open链表中并且重新被扩展。根据注意点2,AStar算法入门文章中的算法是不对的。看下图