围棋博弈程序的实现与思考(8)——Zobrist哈希

        本来并不想写着篇,因为英文维基上的zobrist hashing词条已经够详实了。后来发现自己的论文上有图文并茂的一节介绍zobrist哈希,想是为凑字数与图片写的,贴出来倒也方便:

        Zobrist 哈希是一种专门针对棋类游戏而提出来的编码方式,以其发明者 Albert L.Zobrist 的名字命名。Zobrist 哈希通过一种特殊的置换表,也就是对棋盘上每一位置的各个可能状态赋予一个编码索引值,来实现在极低冲突率的前提下在一个整型数据上对棋盘进行编码。其编码步骤描述如下:

        1)  将棋盘分为最小单位(如果将9X9围棋盘分为81个交叉点),求出每个单位上不同状态数(如围棋盘上的 1 个交叉点有 3 个状态)。

        2)  为每个单位上的每种状态生成一个一定范围内(如64位整数)随机数。

        3)  对于特定的棋局,将每个单位上的状态对应的随机数作异或运算,所得即为哈希值。


        用 Zobrist 哈希为棋局状态编码至少具备两个优点:

        1)  当随机数的范围足够大时,不同的棋局产生哈希冲突的概率非常小,在实际应用中通常可以忽略。

        2)  在棋局进行过程中,不必每次重新开始计算棋局的哈希值,只需计算棋局状态发生改变的部分。


        以下以一个 的围棋棋盘为例对 Zobrist 哈希作进一步说明:

  1. 2X2的围棋棋盘一共有 4 个单位,每个单位有 3 种状态(黑子,白子,空点),则为每种状态生成 1 个 8 位的随机数: 

    围棋博弈程序的实现与思考(8)——Zobrist哈希_第1张图片

    对于如下棋局:

    围棋博弈程序的实现与思考(8)——Zobrist哈希_第2张图片


    围棋博弈程序的实现与思考(8)——Zobrist哈希_第3张图片

           额,贴得图文混杂,效果不太好……

你可能感兴趣的:(思考)