一个*搜索gydF4y2Ba
A*(发音为“A star”)是一台计算机gydF4y2Ba算法gydF4y2Ba这广泛用于路线坑和gydF4y2Ba图gydF4y2Ba遍历。该算法有效地在图上绘制出多个节点或点之间的可步行路径。gydF4y2Ba
在一个有许多障碍的地图上,从点寻路gydF4y2Ba 来gydF4y2Ba 是很困难的。例如,一个机器人,在没有太多其他方向的情况下,会继续前进,直到遇到障碍,就像下面左边的寻路例子一样。gydF4y2Ba
然而,A*算法引入了AgydF4y2Ba启发式gydF4y2Ba进入常规图形搜索算法,基本上在每个步骤中规划,因此进行了更优化的决定。使用a *,机器人将以类似于下面的图表的方式找到路径。gydF4y2Ba
a *是一个延伸gydF4y2Ba迪杰斯特拉算法gydF4y2Ba具有gydF4y2Ba宽度第一搜索(BFS)gydF4y2Ba.gydF4y2Ba
内容gydF4y2Ba
A *算法gydF4y2Ba
和Dijkstra一样,A*通过制作成本最低的路径来工作gydF4y2Ba树gydF4y2Ba从开始节点到目标节点。对于许多搜索来说,A*的不同和更好的地方在于,对于每个节点,A*使用一个函数gydF4y2Ba 这给出了使用该节点的路径的总成本估计。因此,A *是一种启发式功能,其与算法不同,因为启发式更多是估计,并且不一定是可怕的。gydF4y2Ba
A*通过使用这个函数扩展已经比较便宜的路径:gydF4y2Ba
在哪里gydF4y2Ba
=通过节点的总估计路径的总成本gydF4y2Ba
=到达节点所需的成本gydF4y2Ba
=估计成本gydF4y2Ba 目标。这是成本函数的启发式部分,所以它就像一个猜测。gydF4y2Ba
在上面的网格中,A*算法从开始(红色节点)开始,并考虑所有相邻的单元格。一旦填充了相邻的单元格列表,它就会过滤掉那些不可访问的单元格(墙、障碍、界外)。然后它选择最低的单元格gydF4y2Ba成本gydF4y2Ba,这是估计的f(n)。递归地重复该过程,直到找到最短路径到目标(蓝节点)。计算gydF4y2Ba 通过一个通常提供良好结果的启发式完成。gydF4y2Ba
的计算gydF4y2Ba 可以以各种方式完成:gydF4y2Ba
的gydF4y2Ba曼哈顿距离gydF4y2Ba(解释如下)从节点gydF4y2Ba To the goal是常用的。这是一个标准的启发式网格。gydF4y2Ba
如果gydF4y2Ba = 0, A*成为Dijkstra算法,保证找到最短路径。gydF4y2Ba
启发式函数必须为gydF4y2Ba容许gydF4y2Ba,这意味着永远不能高估达到目标的成本。曼哈顿的距离和gydF4y2Ba = 0是允许的。gydF4y2Ba
启发式gydF4y2Ba
使用一个好的启发式算法是决定性能的重要因素gydF4y2Ba .的价值gydF4y2Ba 理想情况下会等于到达目的地的确切成本。然而,这是不可能的,因为我们甚至不知道道路。但是,我们可以选择一种方法,这些方法将为我们提供一些时间的精确值,例如在没有障碍物的直线上行驶。这将导致完美的表现gydF4y2Ba 在这种情况下。gydF4y2Ba
我们希望能够选择一个函数gydF4y2Ba 这比达到我们目标的成本还低。这将允许gydF4y2Ba 准确地工作,如果我们选择一个值gydF4y2Ba 这将导致更快但更不准确的性能。因此,通常情况下,我们选择angydF4y2Ba 这比实际成本要低。gydF4y2Ba
曼哈顿距离启发式gydF4y2Ba
这种计算方法gydF4y2Ba 被称为曼哈顿方法,因为它是通过计算从当前方块水平和垂直移动到目标方块的方块总数来计算的。我们忽略了对角线移动和任何可能存在的障碍。gydF4y2Ba
这次启发式是准确的,只要我们的道路遵循直线就会。那是,gydF4y2Ba 将发现路径是直线运动的组合。有时,我们可能更喜欢沿着一条直线直接到达目的地的路径。gydF4y2Ba
欧几里得距离启发式gydF4y2Ba
这个启发式比它的曼哈顿版本稍微准确一些。如果我们尝试同时在同一个迷宫中运行,欧几里得寻径器倾向于沿着直线走。这更精确,但也更慢,因为它必须探索更大的区域才能找到路径。gydF4y2Ba
深度优先搜索是否总能扩展至少和A*搜索一样多的节点?gydF4y2Ba
答案是否定的,但深度首先搜索可能是可能的,有时候,通过财富,扩展较少的节点gydF4y2Ba 搜索受理启发式。gydF4y2Ba如gydF4y2Ba..在逻辑上,有时,如果运气好,深度优先搜索可以直接到达目标,而不需要回溯。gydF4y2Ba
主要缺点gydF4y2Ba 算法和任何最佳首先搜索的算法是其内存要求。由于至少必须保存整个开放列表,因此A *算法在实践中严重空间限制,并且不太实用于当前机器上的最佳搜索算法。gydF4y2Ba
实现gydF4y2Ba
A*算法的伪代码采用类似python的语法。gydF4y2Ba
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 18gydF4y2Ba |
|
时间复杂性gydF4y2Ba 取决于启发式。在最坏的情况下,扩展的节点数是解长度(最短路径)的指数,但当搜索空间是树时,它是多项式。gydF4y2Ba
例子gydF4y2Ba
使用a *找到下面的网格中的绿色方块的最短路径。gydF4y2Ba
让我们从选择一个可接受的启发式开始。对于这种情况,我们可以使用曼哈顿启发式。然后我们继续开始单元格。我们称之为我们的gydF4y2Ba
当前的细胞gydF4y2Ba
然后我们继续观察它所有的邻居并计算gydF4y2Ba 对每一个人来说。然后我们选择最小的邻居gydF4y2Ba 成本。这是我们的新产品gydF4y2Ba当前的细胞gydF4y2Ba
然后我们重复上面的过程。(填充邻居和计算gydF4y2Ba ,gydF4y2Ba 和gydF4y2Ba 并选择最低)。我们这样做,直到我们在目标单元格。下面的图像演示了搜索如何进行。在每个细胞中相应的gydF4y2Ba ,gydF4y2Ba 和gydF4y2Ba 值显示。还记得gydF4y2Ba 在到达细胞和时所产生的成本是多少gydF4y2Ba 曼哈顿离黄色牢房的距离是多少gydF4y2Ba 是gydF4y2Ba 和gydF4y2Ba .gydF4y2Ba
参考gydF4y2Ba
- Patel,A。gydF4y2Ba介绍一个*gydF4y2Ba.2016年4月29日,从gydF4y2Bahttp://theory.stanford.edu/~aamitp/gameprogramming/concave1.png.gydF4y2Ba
- Patel,A。gydF4y2Ba介绍一个*gydF4y2Ba.2016年4月29日,从gydF4y2Bahttp://theory.stanford.edu/~amitp/GameProgramming/concave2.pnggydF4y2Ba