Magic Bitboards 介绍

简介

一个乘法右移完美散列算法索引一个攻击位棋盘数据库——这使两个线攻击的 Bishop 或 Rook 在一次运行。得益于最近处理器的快速 64 位乘法和快速且巨大的缓存,Magic Bitboards 已成为现代引擎的标准,例如在 Crafty、Arasan、Stockfish 和 Houdini 中使用。虽然 Robert Hyatt 在 Crafty 中报道了旋转位棋盘没有立即获得速度提升,但 Jon Dart 在 Arasan 中提到旋转位棋盘的速度提升了 20 ~ 25 %。

历史

这种神奇的位棋盘方法是由 Gerd Isenberg 的多向哈希技术 Kindergarten Bitboards 激发的,也可能是由 Gerd 和 Tony van Roon-Werten 的早期实验激发的,他们绘制了 De Bruijn 的按线排列的占位值,也就是随机数字乘法。Lasse Hansen 想出了一个主意,在一个 Rook 或 Bishop 运动的两个方向同时讨论多达 12 个相关的占位。

Pradu Kannan 对 Lasse Hansen 最初的方法进行了改进,引入了一个类似 Java 的二维数组,每个方块都有各自的大小,所有相关的占用值。大大节省表的大小——因为许多在正交或对角线上的格子比其它格子需要更少的位,特别是考虑到内部的 6 个位。而对于 Rook 来说,中心方块的密度更大,对于 Bishop 来说则相反。

最近,Robert Purves 创造了 Plain 和 Fancy Magics 并且发现 Hansen 最初的 Plain Magics 2 MiB Rooks 表和 256 Kib 简约的 Bishops 几乎无法分辨 Fancy(约 800 Kib 和 38 Kib)在 Intel i5 巨大的 L3 智能缓存,看到 plain 与 fancy 的源代码。在同一个 CCC 论坛的帖子中,Robert Houdart 提出了每格子查找以进一步缩减表格的方法。

它是如何工作的

一个魔数的移动位棋盘生成技术包含以下 4 个步骤:

  1. 屏蔽相关占用位以形成密钥。例如,如果 a1 上有一个 Rook,则相关占用位将来自 a2-a7 和 b1-g1。
  2. 将键与“魔数”相乘以获得索引映射。这个魔数可以很容易地通过暴力试验和错误生成,尽管不能 100 % 确定魔数是最好的(参见步骤 3)。
  3. 右移索引映射 64-n 位以创建索引,其中 n 是索引中的位数。一个更好的魔数在索引中所需的位将更少。
  4. 使用索引引用预初始化的移动位棋盘数据库。

下面的插图应该给人一个印象,Magic Bitboards 是如何工作的。所有被掩蔽的相关占用位被完美地散列到连续的占用状态,以索引预先计算的攻击集。构造性冲突,其中不同的占用映射相同的攻击集——因为不同的位是“在”第一个阻止后面的外部冗余位,是需要的,甚至是必须的,以应用 N 位的完美散列。

                                        any consecutive
relevant occupancy                      combination of
bishop b1, 5 bits                       the masked bits
. . . . . . . .     . . . . . . . .     . . .[C D E F G]
. . . . . . . .     . 1 . . . . . .     . . . . . . . .
. . . . . . G .     . 1 . . . . . .     . . . . . . . .
. . . . . F . .     . 1 . . . . . .     . . . . . . . .
. . . . E . . .  *  . 1 . . . . . .  =  . . garbage . .    >> (64- 5)
. . . D . . . .     . 1 . . . . . .     . . . . . . . .
. . C . . . . .     . . . . . . . .     . . . . . . . .
. . . . . . . .     . . . . . . . .     . . . . . . . .

                                        any consecutive
relevant occupancy                      combination of
bishop d4, 9 bits                       the masked bits
. . . . . . . .     . . . . . . . .     2 4 5 B C E F G]
. . . . . . G .     . . .some . . .     . . . . . . .[1
. 5 . . . F . .     . . . . . . . .     . . . . . . . .
. . 4 . E . . .     . . .magic. . .     . . . . . . . .
. . . . . . . .  *  . . . . . . . .  =  . . garbage . .    >> (64- 9)
. . C . 2 . . .     . . .bits . . .     . . . . . . . .
. B . . . 1 . .     . . . . . . . .     . . . . . . . .
. . . . . . . .     . . . . . . . .     . . . . . . . .

                                        any consecutive
relevant occupancy                      combination of
rook d4, 10 bits                        the masked bits
. . . . . . . .     . . . . . . . .     4 5 6 B C E F G]
. . . 6 . . . .     . . .some . . .     . . . . . .[1 2
. . . 5 . . . .     . . . . . . . .     . . . . . . . .
. . . 4 . . . .     . . .magic. . .     . . . . . . . .
. B C . E F G .  *  . . . . . . . .  =  . . garbage . .    >> (64-10)
. . . 2 . . . .     . . .bits . . .     . . . . . . . .
. . . 1 . . . .     . . . . . . . .     . . . . . . . .
. . . . . . . .     . . . . . . . .     . . . . . . . .

                                        any consecutive
relevant occupancy                      combination of
rook a1, 12 bits                        the masked bits
. . . . . . . .     . . . . . . . .     5 6 B C D E F G]
6 . . . . . . .     . . .some . . .     . . . .[1 2 3 4
5 . . . . . . .     . . . . . . . .     . . . . . . . .
4 . . . . . . .     . . .magic. . .     . . . . . . . .
3 . . . . . . .  *  . . . . . . . .  =  . . garbage . .    >> (64-12)
2 . . . . . . .     . . .bits . . .     . . . . . . . .
1 . . . . . . .     . . . . . . . .     . . . . . . . .
. B C D E F G .     . . . . . . . .     . . . . . . . .

上面的插图对于 b1 Bishop 是正确的,因为它每个列只有一条射线和一个位,工作方式类似 Kindergarten。通常,由于溢出,N 个分散的占用位到 N 个连续位的一对一映射并不总是可能的。N 个散乱位到 N 个连续位的完美映射对于大多数正方形来说可能不是最小的。它要求在连续的 N 位中有一个或两个间隙,以避免冲突,扩大表的大小。

但其目的是完全散列攻击集,而不是连续占用位。不同攻击集的数量远小于相关占用。因此,在构造性碰撞的帮助下,一些初始猜测如何映射位,和/或试错,使用正好 N 位总是可能的。如果一个人努力最大化建设性碰撞——甚至更少。到目前为止,bestmagics 报告了一些 N-1 个,这将是广泛使用的 Fancy Magic Bitboards 方法中某些方块的表大小的一半。

猜你喜欢

转载自blog.csdn.net/ad44275783/article/details/114164467
今日推荐