我正在編寫一個Connect Four遊戲引擎。目前,我使用Zobrist hashing爲不同的Connect Four板位置生成散列鍵(爲了不再做同樣的事情,評估板位置存儲在散列表中)。評估板位置(最小最大樹中的節點)總是彼此接近。不幸的是,關閉的棋盤位置被映射到統一分佈的散列鍵,導致大量的cpu緩存未命中。連接四個哈希函數:映射關閉元素以關閉哈希鍵
是否有可能建立一個散列函數來映射關閉板位置以關閉散列鍵?
一個玩家A板位置由以下結構的棋盤表示:
. . . . . . . TOP
5 12 19 26 33 40 47
4 11 18 25 32 39 46
3 10 17 24 31 38 45
2 9 16 23 30 37 44
1 8 15 22 29 36 43
0 7 14 21 28 35 42
我不知道,如果它甚至有可能。 感謝您的幫助!
這是凌晨1點,所以我現在不明白;-)在你的文本中,hash()是一個隨機散列函數?newhash()是基於前面的散列和差異的增量散列函數嗎?你怎麼確定hash()== newhash()一直都是這樣? – hirschhornsalz 2011-05-05 23:05:09
我試圖澄清。你一直不需要hash()== newhash()(因爲hash()的局部性很差)。關鍵的想法是使用槓桿的遊戲狀態結構,以便相關遊戲狀態g和g'的newhash(g)= hash(g')+小偏移量。 – 2011-05-06 01:45:56
但是不是必須一直使用hash()== newhash()嗎?假設你有一個通過newhash()生成的位置散列,並且想要檢查這個位置散列是否已經以不同的移動順序到達(這實際上是轉置表的主要點)。存儲的位置現在可能有不同的散列,因此您不會找到它。 – hirschhornsalz 2011-05-06 01:55:45