于图搜索的方法主要包括Dijstra方法,A算法,JPS算法,A算法是Dijstra算法的拓展,JPS算法是A*算法的拓展。
- A*是一个比较经典的启发式寻路算法,是基于dijkstra算法,但是加入了启发函数,使路径搜索效率更高。实现起来很简单。不过要做到通用性高,比如支持各种不同类型的地图,甚至不仅仅是地图,而是个图结构如解决拼图游戏N-puzzle会用到的,就需要多花点心思。用C++实现的话,可以使用模板来适应不同的需要。也可以使用类继承。 由于A*算法无法消除对称性的问题,所以可以加入tie breaker消除对称性
- JPS算法有一套规则去打破搜索过程中的的“对称性”,速度与效率较高,但是,JPS仅仅适用于网格地图。
下面为A*算法的流程图:
- 从起点A开始, 把它作为待处理的方格存入一个"开启列表", 开启列表就是一个等待检查方格的列表。
- 寻找起点A周围可以到达的方格, 将它们放入"开启列表", 并设置它们的"父方格"为A。
- 从"开启列表"中删除起点 A, 并将起点 A 加入"关闭列表", "关闭列表"中存放的都是不需要再次检查的方格。
- 检查它所有相邻并且可以到达 (障碍物和 “关闭列表” 的方格都不考虑) 的方格。如果某个相邻方格已经在 “开启列表” 里了, 检查如果用新的路径到达G值是否会更低一些, 如果新的G值更低, 那就把它的 “父方格” 改为目前选中的方格,然后重新计算它的 F 值和 G 值 (H 值不需要重新计算, 因为对于每个方块, H 值是不变的). 如果新的 G 值比较高, 就说明经过 C 再到达 D 不是一个明智的选择, 因为它需要更远的路, 这时我们什么也不做。
就这样, 从 “开启列表” 找出 F 值最小的, 将它从 “开启列表” 中移掉, 添加到 “关闭列表”,再继续找出它周围可以到达的方块, 如此循环下去…