【问题标题】:Implementation of A Star (A*) Algorithm in Java在 Java 中实现 A 星 (A*) 算法
【发布时间】:2011-06-05 05:25:20
【问题描述】:

免责声明:我几乎没有 Java 背景,因为我主要是 C# 开发人员。

想要A*算法的java实现。
是的,我在网上看到了很多相同的版本,我无法在它们之间进行选择。

我正在寻找一种 A* 算法实现,它使用 java 的所有新特性,使算法更快(即使有点)。原因是我们正在为MMO 实现路径查找,因此性能是重中之重。

任何指针(至少在哪里看)?

【问题讨论】:

  • 您能给我们提供您已经找到的版本的链接吗?而且,顺便说一句,使用“Java 的新特性”不会使算法更快。
  • 链接又过期了,对于像我这样发现这个的人来说,这是最新的:github.com/graphhopper/graphhopper/blob/master/core/src/main/…
  • @BattleBarnes 包含的双向 A* 甚至更快

标签: java algorithm path-finding a-star


【解决方案1】:

多试几次,衡量,选择最快的,适应您的需求。性能主要取决于启发式函数的选择,它独立于 A* 本身。

如果启发式是固定的,优先队列的实现很可能会成为瓶颈,所以试试pairing heaps。这些是实践中最快的堆数据结构,它们比二进制堆具有优势,它们允许 O(1) 插入时间 + 摊销 O(log n) pop-min。这在许多 A* 循环的预期情况下很重要,其中队列已填满,但从未完全清空,即插入次数远大于弹出次数。

如果内存成为问题,请切换到迭代加深 A* (IDA*) 或递归最佳优先搜索 (RBFS)。

如果不起作用,请考虑使用近似算法(贪心搜索)。简单地优化一个写得体面的 A* 循环不会给你带来巨大的加速。

请参阅Russell and Norvig 了解算法和对问题的良好讨论。

【讨论】:

  • closedList 应该使用什么数据结构?
  • 哈希表。或者是一棵红黑树。或者一棵张开的树。或者任何结果是最快的。 @st0le,你说得对,这很重要,但根据我的经验,快速集合比快速优先队列更容易获得。
  • @sk0le: 如果完全需要一个闭集,那就是。
  • @罗伯特,谢谢。 SO 时不时出现“如何实现 A*”,而“阅读 R&N”几乎总是答案;)
【解决方案2】:

如果性能是您的首要任务,A* 可能不是您的最佳选择。 A* 提供了一个精确的解决方案,因此将继续处理,直到找到正确的答案。还有其他轻量级解决方案可以在更快的时间内提供足够好的解决方案:例如强制爬山或最佳优先,甚至是简单的深度优先。

【讨论】:

  • +1。优化 A* 代码不会为 OP 赢得性能奖杯。
  • -0,是的,A* 可能效率不高,但您需要的替代方案是特定于路径查找的加速技术,如收缩层次结构等。
  • 为了准确起见,A* 并不总是提供最佳答案。仅当启发式是 admissible 时才会这样做。
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多