Zobrist哈希,研究棋类博弈必须了解的一个小工具

Zobrist哈希,研究棋类博弈必须了解的一个小工具


在计算机博弈的研究中,经常需要使用到哈希表的技术。对于传统的Alpha-Beta剪枝来说,提高效率不可避免的需要用到置换表技术,也就是一种特殊的哈希表。即便是在蒙特卡罗方法洗刷了半个计算机博弈研究领域之后,其领先的UCT算法也常常需要用到哈希表来提高算法的效率。Zobrist就是一种非常有效的将局面映射为一个独特的哈希值的方法。对于任何一个不同的局面,其使用Zobrist所算出来的哈希值是完全不同的。


在英文Wiki中有着比较详尽的解释,但其使用的注解并不全面。

Link:Zobrist hashing - Wikipedia, the free encyclopedia


其大意如下:

Zobrist哈希(也被称为Zobrist关键词Zobrist特征法) 是一种用于复杂的棋类游戏程序中的哈希函数,例如象棋与围棋,以实现置换表技术。置换表是一种特殊的通过棋盘位置来排序的哈希表,可以用来避免重复的分析相同的棋局。Zobrist哈希由它的发明者Albert Lindsey Zobrist所命名,它也是一种在模拟水晶原料中辨识置换合金配置的方法。

Zobrist哈希首先对对棋类游戏每个可能小部分产生随机的比特串(Bitstrings),也就是说,对于每种单个棋子与单个位置的组合(比如在西洋跳棋中,存在12个棋子和64个位置)。现在任何的棋局配置都会被拆分为许多独立的棋子/位置的部件,并且每个部件都可以映射到之前随机产生的比特串(Bitstrings)中。最后,通过按位进行xor计算来将所有比特串组合起来。


简单的来说,为了得到一个独一无二的哈希值,我们在游戏开始时候,为所有可能的位置和棋子的组合设定一个随机数。一般我们设定为32位,很多时候为了校验还会再设定一个64位的随机数。举例来说,一个9x9的五子棋,其一共有9*9*2的可能的棋子和位置的组合,所以设定一个三维数组Z[9][9][2],并将这个数组中填满随机生成的32位数字。如Z[0][0][0] = 123456......654321。这样每一种可能的组合都有了一个几乎不可能重复的随机数了,在判定任何一个棋局的哈希特征值时候,将这个棋局上所有存在的组合相加,即为其特征值 。由于担心出现冲突,还可以配合64位的效验码做为校验。可以充分避免出现冲突的可能性。


在运算的时候,由于每次都计算特征值会降低算法效率,可以保存局面的特征值,在移动之后,减去移动前棋子的特征值,加上移动后棋子的特征值。如果有吃子等行为的,还要进行相应的计算,可以提高算法的效率。


在国内,最早可考的资料是王小春的《PC游戏编程》一书,在其中介绍置换表的部分提到了Zobrist哈希的方法。其书出版虽然已经十年,然而依旧是棋类博弈的入门经典作品。



你可能感兴趣的:(计算机博弈)