Performance 在Clojure中实现的A*搜索的性能

Performance 在Clojure中实现的A*搜索的性能,performance,clojure,artificial-intelligence,a-star,Performance,Clojure,Artificial Intelligence,A Star,我已经实现了一个在两个州之间寻找最短路径的方法。 该算法使用哈希映射来存储访问状态的最佳已知距离。以及一个散列映射,用于存储重建最短路径所需的子-父关系 这是密码。算法的实现是通用的(状态只需要是“可散列的”和“可比较的”),但在这种特殊情况下,状态是int的成对(向量)[x y],它们表示给定高度图中的一个单元(用于跳到取决于高度差) 问题是是否有可能提高性能以及如何提高性能?可能通过使用1.2或未来版本的某些功能,通过更改算法实现的逻辑(例如,使用不同的方式存储路径)或在这种特定情况下更改状

我已经实现了一个在两个州之间寻找最短路径的方法。 该算法使用哈希映射来存储访问状态的最佳已知距离。以及一个散列映射,用于存储重建最短路径所需的子-父关系

这是密码。算法的实现是通用的(状态只需要是“可散列的”和“可比较的”),但在这种特殊情况下,状态是int的成对(向量)
[x y]
,它们表示给定高度图中的一个单元(用于跳到取决于高度差)

问题是是否有可能提高性能以及如何提高性能?可能通过使用1.2或未来版本的某些功能,通过更改算法实现的逻辑(例如,使用不同的方式存储路径)或在这种特定情况下更改状态表示

在瞬间运行,Clojure实现大约需要40秒。当然,这有一些自然而明显的原因:动态类型、持久数据结构、原语类型的不必要(非)装箱

使用瞬变没有多大区别。

使用
优先级映射
而不是
排序集
我首先使用
排序集
来存储打开的节点(搜索边界),然后切换到改进的性能:现在需要15-20秒(在40秒之前)

这很有帮助。“我的”新实现几乎是一样的


可以找到新的a*-搜索。

我不知道Clojure,但我可以给你一些关于改进Vanilla a*性能的一般建议

  • 考虑实现,这是*的一个变体,使用更少的内存,如果它适合您的域的话

  • 尝试不同的启发。一个好的启发式可以对所需的节点扩展数量产生重大影响

  • 使用缓存,在搜索算法中通常称为“”。由于搜索图通常是树,而不是真树,因此可以多次重复对某个状态的搜索;用于记住以前搜索的节点的缓存减少了节点扩展

Jonathan Schaeffer博士有一些关于这个主题的幻灯片:


我还没有看过你的Clojure代码。你能看看这个实现吗?Christophe Grand,一个备受尊敬的Clojure黑客。谢谢,它很有帮助,优先级映射听起来很棒。此外,阅读这些代码通常也会有所帮助。我将重写代码并进行测试。