从 A 点到 B 点最短路径,# 是障碍物。
% % % % % % %
% o o o o o %
% o o # o o %
% A o # o B %
% o o # o o %
% o o o o o %
% % % % % % %
算法的核心公式为:F = G + H
把地图上的节点看成一个网格。
G:从起点A沿着产生的路径,移动到网格上指定节点的移动消耗,在这个例子里,我们令水平或者垂直移动的耗费为10,对角线方向耗费为14。我们取这些值是因为沿对角线的距离是沿水平或垂直移动耗费的的根号2,或者约1.414倍。为了简化,我们用10和14近似。既然我们在计算沿特定路径通往某个方格的G值,求值的方法就是取它父节点的G值,然后依照它相对父节点是对角线方向或者直角方向(非对角线),分别增加 14 和 10。例子中这个方法的需求会变得更多,因为我们从起点方格以外获取了不止一个方格。
H:从当前格移动到终点B的预估移动消耗。为什么叫“预估”呢,因为我们没有办法事先知道路径的长度,这里我们使用曼哈顿方法,它计算从当前格到目的格之间水平和垂直的方格的数量总和,忽略对角线方向。然后把结果乘以10。
F 的值是 G 和 H 的和,这是我们用来判断优先路径的标准,F 值最小的格,我们认为是优先的路径节点。
操作过程如下:
- 从起点 A 出发,抓取 A 身边的其他 8 个点(不为障碍物,不重复抓取),存入列表 open 中。
- 根据 F = G + H 算出 open 中最小的 F 值取出这个点当作起点,再次执行 1 操作,并将这个点存入列表 close 中。
- 直到找到终点 B 。
- 从 B 点回溯,得到的点就是最短路径。
close 列表
Node{x=3, y=1, value='A', FValue=0.0, GValue=0.0, HValue=0.0, Reachable=false}
Node{x=3, y=2, value='o', FValue=40.0, GValue=10.0, HValue=30.0, Reachable=false}
Node{x=2, y=2, value='o', FValue=54.0, GValue=14.0, HValue=40.0, Reachable=false}
Node{x=4, y=2, value='o', FValue=54.0, GValue=14.0, HValue=40.0, Reachable=false}
Node{x=1, y=3, value='o', FValue=54.0, GValue=14.0, HValue=40.0, Reachable=false}
Node{x=2, y=4, value='o', FValue=34.0, GValue=14.0, HValue=20.0, Reachable=false}
Node{x=3, y=5, value='B', FValue=14.0, GValue=14.0, HValue=0.0, Reachable=false}
去掉 A点 和 B点还有 4 个点,(4,2) 这个点我们在回溯的时候去掉了。
% % % % % % %
% o o * o o %
% o * # * o %
% A o # o B %
% o o # o o %
% o o o o o %
% % % % % % %