总起
A*算法常用于游戏的寻路中,用于求解静态路网中的最短路径,是最有效的直接搜索方法。
这次正好花了几天时间学习了一下Python,便拿这个算法做了一下练习。这篇文章也会对其思路做一个简单介绍。
文章中的源码可以在 GitHub - anguangzhihen/PythonTest 中的AStarTest.py找到。
算法思路
A*算法实际是由广度优先遍历和Dijkstra算法演变而来的:
1.广度优先遍历主要是通过从起点依次遍历周围的点而寻找最优的路径;
2.Dijkstra基本思路跟广度优先遍历一样,只不过给每次遍历的点增加了一个权值,用于表明当前移动了多少距离,然后每次从移动最短距离的点开始遍历;
3.A*在Dijkstra算法增加了一个期望值(启发函数,h),最优化遍历节点的数量。
广度优先遍历 -> Dijkstra算法 -> A*算法。其他寻路相关的算法也很多,如JPS跳点算法,但解决问题的侧重点不同,关键是针对具体问题选择合适的算法。
我们先来看一下地图,橙点为起始点和终点:
本文中,g为已走过的距离,h为期望距离、启发值。文中会频繁使用这两个概念。
A*算法中的h,根据实际地图的拓扑结构,可选用以下三种距离,假设A与B点横纵坐标距离x和y: