基于A* 算法的路径搜索 -《大数据时代的算法》学习笔记
基于A* 算法的路径搜索 -《大数据时代的算法》学习笔记
1. A* 算法简介
“A* ” 算法擅长解决镜头路径只能够最短路径问题,又不同于Dijkstra算法和Floyd算法。该算法综合了广度优先搜索(BFS)和Dijkstra算法的有点: 在进行启发式搜索提高算法效率的同时,可以保证找到一条最优路径。Floyd算法更多地使用场景在于机器人路径规划、游戏路径、卫星路径探寻等领域。
2. A* 算法的应用实例: 绕过障碍区到达目的地
== 极地探险队探险时,遇到一条河流,他们不能直接穿越河流,但是他们知道要达到露营的字符,则需要绕过该河流。因此,他们试图通过利用计算机来测绘最终到达目的地的最近行走距离 ,用以下示意图表示探险队、河流、露营地的关系。==
探险队标识:
露营地标识:
中间的黑线为河流。
3. A* 算法 与最短距离计算
对于地理环境中的一个固定地理位置,它至少可以被标记为两种状态: 可使用区和不可使用区(障碍区),同时可以把该固定位置视为九宫格里面的中心点,如下图所示:
根据上图可以确定该中心点的移动方向包含8个方向,分别是:上、下、左、右、左上、左下、右上、右下。因此,A* 算法的寻路流程可以通过如下三个步骤完成。
-
从中心点开始,把它放入一个待计算的开放列表,开放列表可以理解为一个准备进行路径分析的队列;
-
寻找中心点周围可达到的方格集,这些方格的状态需要是可以使用的,将这些方格放入到开放列表中,但是将这些方格的来源都标记为中心点
-
在开放列表中移除刚刚分析的中心点,将该中心点放入关闭列表中,关闭列表表示后续不再对该表进行可达到的路径分析
通过上述3步已经完成了开放列表的获取,但是如何从开放列表中选择下一步的移动方格是A* 算法思想中最核心的内容。A* 算法利用公司f(n)=g(n)+h(n)筛选下一步移动方格,其中:
- g(n)表示从起初开始的方格移动到当前方格的移动距离;
- h(n)表示从即将移动到的方格到终点方格的距离;
- f(n)表示两者相加,即为当前预估的可能路径;
-
这种可能路径中最小的值对应的方格即为当前可以从开放列表中选择的下一步移动方格
选择该方格之后再依次重复上述步骤,直到邻近的方格中存在终点方格(或者终点方格进入了开放列表)
1)g(n)的计算
g(n)表示从起初开始的方格移动到当前方格的移动距离: 在实际应用中,每个方向的距离都有可能不同,g(n)则是从起点方格开始通过不断的方格移位累计的距离和。
2)h(n)的计算
A* 算法的路径寻找是一种启发式搜索,启发式搜索减少了再路径搜寻过程中可能耗费的时间性能,如从一个方格到另外一个方格的可能距离,如果通过穷举法的确是可以计算出最短距离,但还是如果方格过大,则可能导致计算性能严重下降。启发式搜索在于对距离的估算,省去大量不必要的路径计算。h(n)即是对当前方格到目的地方格的距离估算。
距离的算法有多种,曼哈顿距离算法能够较好第用于计算h(n),在所有的平面方格中,可以用二维数据表示每个方格的二维做吧,通哥曼哈顿距离算法可以计算出距离值。
通过上述过程,当找到终点方格时,只需要通过每个方格的父方格进行回溯即可找到整个移动路径。
基于启发式搜索的 A* 算法是对路径穷举过程的优化,也优于Dijkstra在路径搜索过程中漫无目的的搜索路径。试图让每次的路径搜索尽可能靠近目的地,所以估值函数h(n)是整个过程的关键。