佐布里斯特散列法
編輯佐布里斯特散列法(也被稱為佐布里斯特鑰匙或佐布里斯特簽名)是一種散列函數結構,用于玩抽象棋類游戲的計算機程序,如國際象棋和圍棋,以實現換位表,這是一種特殊的散列表,以棋盤位置為索引,用于避免多次分析同一位置。佐布里斯特散列法是以其發明人阿爾伯特-林賽-佐布里斯特命名的。它也被作為一種方法用于識別晶體材料模擬中的替代合金配置。佐布里斯特散列法是被稱為制表散列法的普遍有用的基礎技術的xxx個已知實例。
計算散列值
編輯Zobrist散列法首先為棋盤游戲的每個可能元素隨機生成比特串,即為每個棋子和位置的組合(在國際象棋游戲中,這就是12個棋子×64個棋盤位置,或者如果可能仍然是城堡的國王和車,以及可能捕捉通行的卒,對兩種顏色分別處理,則是18×64)。現在,任何棋盤配置都可以被分解成獨立的棋子/位置組件,這些組件被映射到之前生成的隨機比特串上。最終的Zobrist哈希值是通過使用位數XOR將這些位串結合起來計算出來的。國際象棋游戲的示例偽碼。
常數索引
編輯white_pawn:=1white_rook:=2#等。black_king:=12
佐布里斯特散列法的函數
編輯init_zobrist():#填充一個隨機數/比特串表table:=一個大小為64×12的2維數組forifrom1to64:#循環計算棋盤,以線性數組的形式表示j從1到12:#循環計算棋子table[i][j]:=random_bitstring()table.black_to_move=random_bitstring()functionhash(board):h:=0ifis_black_turn(board):h:=hXORtable.black_to_moveforifrom1to64:#循環計算棋盤位置,如果棋盤[i]≠空:j:=棋盤[i]處的棋子,如上面常數索引中所列h:=hXORtable[i][j]返回h
散列值的使用
編輯如果比特串足夠長,不同的棋盤位置幾乎肯定會散列成不同的值;然而較長的比特串需要成比例的計算機資源來操作。最常用的位串(key)長度是64位。許多游戲引擎在換位表中只存儲哈希值,完全省略了位置信息本身以減少內存的使用,并假設哈希碰撞不會發生,或者即使發生也不會對換位表的結果產生很大影響。Zobrist散列是xxx個已知的制表散列的例子。其結果是一個3維獨立的哈希族。特別是,它是強通用的。舉個例子,在國際象棋中,在任何時候,64個格子中的每個格子都可能是空的,或者包含6個棋子中的一個,這些棋子要么是黑的,要么是白的。另外,可以是輪到黑棋下,也可以是輪到白棋下。因此,我們需要生成6x2x64+1=769個隨機比特串。給定一個位置,通過找出哪些棋子在哪些位置上,并將相關的位串組合在一起,就可以得到佐布里斯特哈希值。如果這個位置是黑棋走的,那么黑棋走的位串也會包含在佐布里斯特哈希值中。
更新哈希值
編輯與其像上面的偽代碼那樣每次都計算整個棋盤的哈希值,不如通過XOR掉位置發生變化的位串,再XOR入新位置的位串,來逐步更新棋盤的哈希值。例如,如果一個棋盤上的小卒被另一個棋盤上的車所取代,那么產生的位置將通過將現有的哈希值與以下的位串進行XOR而產生。卒在此方"(XOR出此方的卒)"車在此方"(XOR入此方的車)"車在源方"(XOR出源方的車)這使得佐布里斯特散列法在遍歷棋譜樹時非常有效。在計算機圍棋中,這種技術也被用于超級子的檢測。
更廣泛的用途
編輯更廣泛的是,佐布里斯特散列可以應用于有限的元素集(在國際象棋的例子中,這些元素是{displaystyle(piece,position)}的圖元)。圖元),只要能給每個可能的元素分配一個隨機位串就可以了。對于較小的元素空間,可以用隨機數發生器來完成,對于較大的元素空間,可以用哈希函數來完成。這種方法在蒙特卡洛模擬過程中被用來識別替代合金配置,以防止在已經計算過的狀態上浪費計算精力。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/174853/