Astar算法基本概念及其实现

先介绍几个概念有助于理解Astar算法,
启发式搜索:对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。可以省略大量不必要的搜索,提高效率。
估价函数:从当前节点移动到目标节点的预估费用,这个估计就是启发式的,在寻路问题和迷宫问题中,我们通常用曼哈顿估价函数(Manhattan)预估费用。 (如果搜索区域的划分不是正方形,就不用Manhattan算法(|x|+|y|),换成其他的)
Astar算法与BFS: BFS是Astar算法的一个特例。对BFS算法,从当前节点拓展出来的每一个没有被访问过的节点都要放入队列进一步拓展,正因为如此,BFS算法的估计函数H永远为0,没有启发式的信息,所以可以认为是最烂的Astar算法。
开启列表: 将要被遍历的点的集合。
关闭列表:已经被遍历的点的集合。

Astar算法特点: 理论上是时间最优的,缺点是空间呈指数增长。(IDAstar 算法:这种算法被称为迭代加深Astar算法,可以有效的解决 Astar 空间增长带来的问题,甚至可以不用到优先级队列。)

搜索区域 (绿色–起点A,红色–终点B,蓝色–墙)

搜索区域被划分成了方形网格(二维数组),像这样简化搜索区域,是寻路的第一步。
Astar算法基本概念及其实现_第1张图片

二维数组的每一个元素都是一个方格,被标记为 可通过不可通过,路径就是从起点到终点所经过的方块的集合。(通过的路径也可以叫节点的集合,因为路径不一定要分割成方块,完全可以是菱形,三角形或是其他形状,而节点可以放在形状的任意位置,所以简单通用。)

开始搜索
从A开始,通过查找相邻方格,向外拓展直至找到B点。

  1. 从A开始将其存入一个“开启列表”(待检查方格的列表)。
  2. 寻找起点A周围所有的可通行方格(忽略墙,水等不可通行的地形方格),将他们加入“开启列表”。然后设置起点A为他们的父方格
  3. 从”开启列表“删除起点A,将其存入一个“关闭列表”(保存所有不需要再次检查的方格)。如图暗绿色方格是起始点A的中心。它被用浅蓝色描边,以表示它被加入到关闭列表中了。所有可通行相邻方格都在”开启列表“之中,被用浅绿色描边。每个方格都有一个灰色指针指向父方格。
    Astar算法基本概念及其实现_第2张图片
    接着我们就要开始选择开启列表中的临近方格,选中之后重复前边的过程。但是,如何选择临近方格呢?

路径评分
选择临近方格的关键是这个等式:F = G + H,我们选取F值最低的方格。
G = 从 起点 开始到 待选方格 的路径的移动耗费。(是可以明确计算出的,而且要实时保持是最短最优的)
H = 临近方格 到 终点B 的预估移动耗费。(大致预测,假设所有方格可通行忽略了障碍物对移动耗费的影响,通常越靠近终点越小)

计算方法:
G: 通常我们令垂直移动一格耗费为1,水平移动一格耗费为1,对角线移动一格为1.414。但是为了简化,我们要用近似值,因为整数对计算机而言计算更便捷,垂直耗费10,水平耗费10,对角线耗费14。(如果不用简化方法,寻路将变得十分缓慢)
求值的方法就是取其父节点的G值,再根据它相对于父节点的位置(水平,垂直,对角线)取耗费值,二者相加。
H: H值得估算方法有多种,本文仅介绍一种–曼哈顿f方法(Manhattan)。它计算的是当前格到目标格之间水平和垂直得方格的数量之和,忽略对角线,障碍物,只是对剩余距离的一个估算,非实际值,这也是这类方法被称为启发式的原因。

F = G + H, 如下图,F,G,H的值分别位于方格的左上角,左下角,右下角。

Astar算法基本概念及其实现_第3张图片
继续搜索
继续搜索时,从开启列表中选择F值最低的方格(如果有两个F值相同的方格,通常后存入列表的格子会更快捷)。然后:
4. 将它从开启列表删除,存入关闭列表。
5. 检查所有相邻的方格,略过已经在关闭列表中的和不可通过的格子,将他们存入开启列表,如果它们不在开始列表中,就将当前节点作为他们的父节点。
6. 如果某个相邻格已经在开启列表中,则通过判断G值,检查当前当前路径是否更好,如果新的G值更低,则将此相邻节点的父节点改为当前节点,从新计算它的G和H值,如果不是就什么也不做。

经过上边的过程,我们会很快找到终点。

显示路径
从目标格开始,按箭头方向朝父节点移动,最终会回到起始格,这条路径就是我们所找到的最优路径。

Astar算法基本概念及其实现_第4张图片
方法总结
1.将起始格添加入开启列表。
2.重复如下操作:
a. 寻找开启列表中F值最低的格子,称其为当前格。
b. 把它存入关闭列表,从当前列表中删除。
c. 对于相邻格,如果不可通过或者已在关闭列表,则略过。
反之 ①如果它不在开启列表就将它存入开启列表,以当前节点为父节点,计算相邻格的F,G,H.
②若已经存在于开启列表,则用G值检查新的路径是否更好,如果G值耕地就把这一相邻格的父节点改 为当前格,重新计算相邻格的G和H。 如果保持开启列表按F值排序,改变后就需要重新对开启列表进行排序。
d. 停止,
①如果没有找到目标格,而开启列表已经空了,就表示路径不存在。
②如果目标格被添加如关闭列表,这是路径被找到。
3. 保存路径,从目标格开始沿着父节点移动直至回到开始节点。

你可能感兴趣的:(算法,机器学习)