计算涉及的变量
F = G + H
G的计算依赖于来自每个格子与相邻8个方向格子的距离D,文中不同格子的D1-8相同。
如果S到V的最短路径G是准确的,那么最终获得的最短路径就是准确的,因为终点的G就是所求的最短路径。
任何情况第一和第二个加入关闭列表的G都是准确的,即其V到S的最短路径是最优解。第三个开始才有可能G为可行解。
关闭与开放列表
点V加入关闭列表:起点S到点V的最短路径(既定规则下的可行解中最短的)已确定。
点V加入开放列表:起点S到点V的距离计算过了,但最短路径未确定。
A*、最小消耗、广搜 的区别
A*采用容器堆,采用启发式,把估值出来经过此点起点到终点(H)可能最短的弹出来,遍历其周围的格子,而后加入堆。
最小消耗采用容器堆,把到起点最短(G)的格子弹出来,遍历其周围的格子而后加入堆。最小消耗是A*的特化,H估为0,G最短就是F最短。
广搜采用优先队列,把队列头弹出来,遍历其周围的格子而后加入队列。广搜是最小消耗的特化,格子周围8方向估值距离都相同时,用优先队列代替堆,因为队列头就是到起点最短的。
加入容器就是加入了开发列表,弹出来的就是加入关闭列表的。
广搜也不是最优解,找到路径中,只是终点周围8个格子中到起点最短的V,而不是终点E到起点S最短的。因为V到E的距离可能很长。
A*偏离处
1.因为H是估计的,不同的估计方法所得到的路径都是不一样的。所以导致A*算法找到的最短路径肯定只是可行解而不是最优解。
2.假定每个格子给出的H是准确的,是否就是最优解呢?
还不一定是,假如不同格子的D1-8不同,G还是有问题的。
假入目前在寻找上图的第3个关闭点V。
A*是确定了S右下的点V,GV=14。如果左侧的格子VL到V的距离为1而不是10,则通过VL到V的距离为GV=11。比A*算法得到的要短。
3.假如H准确,且不同格子的D1-8相同,也就是文中设定的情况。那么通过A*算法每次加入关闭列表的V,是否就是准确的最短G?
这种情况我尚未找到证明其G是否最短的方法,如果不是最短应该需要通过反证法证明。