我正在编写一个人工智能来解决“生命迷宫”难题。尝试将状态存储到 aHashSet
会减慢一切。在没有一组探索状态的情况下运行它会更快。我相当有信心我的节点(状态存储)实现了 equals 并且hashCode
测试显示 aHashSet
不会添加重复状态。我可能需要重新设计该hashCode
功能,但我相信减慢它的速度是HashSet
重新散列和调整大小。
我尝试将初始容量设置为一个非常大的数字,但它仍然非常慢:
val initCapacity = java.lang.Math.pow(initialGrid.width*initialGrid.height,3).intValue()
val frontier = new QuickQueue[Node](initCapacity)
这是快速队列代码:
class QuickQueue[T](capacity: Int) {
val hashSet = new HashSet[T](capacity)
val queue = new Queue[T]
//methods below
有关更多信息,这里是哈希函数。我将网格值以字节为单位存储在两个数组中,并使用元组访问它:
override def hashCode(): Int = {
var sum = Math.pow(grid.goalCoords._1, grid.goalCoords._2).toInt
for (y <- 0 until grid.height) {
for (x <- 0 until grid.width) {
sum += Math.pow(grid((x, y)).doubleValue(), x.toDouble).toInt
}
sum += Math.pow(sum, y).toInt
}
return sum
}
关于如何设置HashSet
不会减慢速度的任何建议?也许另一个关于如何记住探索状态的建议?
PS 使用java.util.HashSet
,即使设置了初始容量,也需要 80 秒 vs < 7 秒 w/o