dijkstra& amp;一个明星

时间:2012-10-23 13:24:33

标签: algorithm graph path-finding

我读到了这个: http://en.wikipedia.org/wiki/A*_search_algorithm

它说A *比使用dijkstra更快,并使用最佳优先搜索来加快速度。

如果我需要算法以毫秒运行,那么A *何时成为最突出的选择。

据我所知,它不一定能带来最好的结果。

如果我需要快速结果,预先计算路径是否更好?它可能需要几兆字节的空间来存储它们。

5 个答案:

答案 0 :(得分:55)

  

它说A *比使用dijkstra更快并使用最佳优先搜索   加快速度。

A *基本上是Dijkstra的知情变体。
A *被认为是“最佳的第一次搜索”,因为它根据f(v) [f(v) = h(v) + g(v)]的值贪婪地选择接下来要探索的顶点 - 其中h是启发式和g是到目前为止的成本。

请注意,如果您使用非信息启发式函数:h(v) = 0用于每个v:您会得到A *根据“到目前为止的成本”选择接下来要开发的顶点({{1 }}),与Dijkstra的算法相同 - 所以如果g(v),A *默认为Dijkstra的算法。

  

如果我需要算法以毫秒运行,A *何时变为   最突出的选择。

不完全,这取决于很多事情。如果你有一个下降启发函数 - 根据我的个人经验,贪心最好(仅根据启发函数选择) - 通常比A *快得多(但甚至不是最佳)。

  

据我所知,它并不一定能回归最好   结果

如果使用Admissible heuristic function,A *既完整(如果存在则找到路径)和最佳(总是找到最短路径)。如果您的功能不被允许 - 所有投注均已关闭。

  

如果我需要快速结果,预先计算路径是否更好?有可能   占用兆字节的空间来存储它们。

这是针对某些问题进行的常见优化,例如15-puzzle problem,但它更先进。从A点到B点的路径称为宏。有些路径非常有用,应该记住。机器学习组件被添加到算法中,以通过记住这些宏来加快速度。

请注意,此处从A点到B点的路径通常不在状态图上 - 但在问题本身中(例如,如何将正方形从最低行移动到上行...)< / p>

加快速度:
如果你有一个启发式,你发现它太慢了,你想要一个更快的解决方案,即使不是最优的 - A* Epsilon通常比A *更快,同时给你一个关于最优性的限制路径(与最优的接近程度)。

答案 1 :(得分:11)

Dijkstra是A *的特例(当启发式为零时)。

A *搜索:

它有两个成本函数。

g(n): same as Dijkstra. The real cost to reach a node n.
h(n): approximate cost from node n to goal node. It is a heuristic function. This heuristic function should never overestimate the cost. That means, the real cost to reach goal node from node n should be greater than or equal h(n). It is called admissible heuristic.

每个节点的总成本由f(n)= g(n)+ h(n)计算

迪杰斯特拉&#39; S:

它有一个成本函数,它是从源到每个节点的实际成本值:f(n)= g(n) 它通过仅考虑实际成本找到从源到每个其他节点的最短路径。

答案 2 :(得分:5)

A * 就像 Dijkstra 一样,唯一的区别是A *尝试通过使用启发式函数来寻找更好的路径,该函数优先考虑节点应该比其他人更好,而Dijkstra只是探索所有可能的路径。

它的最优性取决于所使用的启发式函数,因此它可以返回非最佳结果,同时更好地启用特定布局的启发式,更好的是结果(可能还有速度)。

它意味着比Dijkstra更快,即使它需要更多的内存和每个节点更多的操作,因为它探索了更少的节点,并且在任何情况下增益都很好。

如果您需要实时结果并且图表非常大,预计算路径可能是唯一的方法,但通常您希望不那么频繁地寻找路径(我假设您经常要计算它)。

答案 3 :(得分:4)

这些算法可用于寻路和图遍历,即在多个点(称为节点)之间绘制有效定向路径的过程。

a* is f =g + h.的公式,g表示实际成本,h表示启发式成本。 Dijktras的公式为f = g。没有启发式成本。当我们使用a*并且启发式费用为0时,它将等于Dijktras algorithem。

答案 4 :(得分:3)

简短回答: A *使用启发式方法来优化搜索。也就是说,您可以定义一个函数,该函数在某种程度上可以估计从一个节点到目标的成本。当您在地理表示(地图)上搜索路径时,这非常有用,例如,您可以从给定的图形节点猜测到目标的距离。因此,通常A *用于游戏等中的路径查找。其中Djikstra用于更一般的情况。

不,A *不会总是给出最好的路径。 如果启发式是“地理”距离,则以下示例可能会给出非最佳路径。

[airport] - [road] - [start] -> [road] -> [road] -> [road] -> [road] -> [target] - [airport]
        |----------------------------------------------------------------|