【问题标题】:Is it possible to use A* search for non grid graphs是否可以使用 A* 搜索非网格图
【发布时间】:2014-12-08 22:48:11
【问题描述】:

我知道 A* 是寻找最短路径的最佳算法,但我看不出任何启发式算法如何在非格图上起作用?这让我想知道 A* 实际上是否能够用于无向图或有向图。如果 A* 能够做到这一点,那么可以使用哪种启发式方法?如果 A* 不是,那么在有向或无向非格图上计算最短路径的当前最快算法是什么?如果需要更多信息,请发表评论。

【问题讨论】:

  • wikipedia 举了几个例子。一个例子是用于路由的直线距离,它不是在格结构中搜索,而是有向的。只要启发式方法的估计过于乐观,它就会做得很好。
  • 虽然 wikipedia 确实给出了一些例子,但对于这样的图表,启发式方法是什么?该算法如何估计给定节点和端点之间的距离?

标签: algorithm graph-theory path-finding a-star


【解决方案1】:

可能是的,但 A* 是一种流行的算法,用于在网格(如图形)中查找最短路径。对于一般的图表,还有很多其他算法可以用于最短路径计算,它们会更好地匹配您的情况。这取决于您的设置使用哪一个。

如果您计划执行单源最短路径 (SSSP),在其中您尝试找到从一个节点到另一个节点的最短路径并且您的图表未加权,您可以使用 Breath-First-Search。该算法的双向版本在实践中表现良好。如果您执行 SSSP 并且您的图形是加权的 Dijkstra 算法是一种常见的选择,那么也可以使用双向版本。对于所有对的最短路径,其他算法(如 Floyd-Warshall 或 Johnson 算法)都是有用的。

如果您想在搜索完成之前使用启发式方法并估计距离,您可以进行预计算,这主要适用于上述每种算法。一些例子:

  • 快捷方式计算(ARC-Flags、SHARC、KFlags)
  • 集线器识别(也是中转节点):预先计算所有集线器节点之间的距离(在非动态图中只需要完成一次),找到源和接收器的下一个集线器,例如与dijkstra。将集线器和源之间的距离相加到下一个集线器和汇到下一个集线器
  • 结构化查找表,例如集线器之间的距离和集线器与特定距离内的节点之间的距离。在预先计算之后,您无需再次遍历图形,而是您的最短路径计算是多次查找。这会导致高内存消耗但性能强大。您可以使用距离计算的上近似值来调整内存。

我强烈建议您确定您的确切情况,并针对非常适合该情况的图算法进行一些研究。针对几十个应用领域的最短路径进行了大量的研究。

【讨论】:

  • 感谢您的回复。可以在有向图上使用的启发式方法是什么?大多数启发式方法都假设给定节点和端点之间的距离是已知的。在有向图中,此信息是未知的。你知道任何可以做到这一点的启发式方法吗?
  • 你能说得更清楚点吗?所有这些都是预先计算。集线器识别方法可以用作一种启发式方法。您只计算节点 A 到下一个集线器节点 HA 的最短路径(您也可以预先计算),节点 B 也是如此,我们称节点 HB。现在您只需计算 HA 和 HB 之间的 SSSP,最后将 A -> HA -> HB -> B 的距离相加。这不一定是最佳的,但对于过渡网络来说非常快。你的方案是什么?
  • 这回答了您的问题还是有什么不清楚的地方?随意询问,如果这有助于您考虑支持和/或接受此答案
猜你喜欢
  • 1970-01-01
  • 2020-02-20
  • 2013-04-14
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多