「 MazeofLife」パズルを解くためのAIを書いています。状態を保存しようとすると、HashSet
すべてが遅くなります。一連の探索された状態なしで実行する方が高速です。私のノード(状態ストレージ)はequalsを実装していると確信しています。hashCode
また、テストではHashSet
、重複した状態が追加されていないことが示されています。関数を作り直す必要があるかもしれませんが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
詳細については、ハッシュ関数を参照してください。グリッド値をバイト単位で2つの配列に格納し、タプルを使用してアクセスします。
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
、初期容量が設定されている場合でも、設定なしの場合は7秒未満であるのに対して80秒かかります