连接四个哈希函数:将关闭元素映射到关闭哈希键



我正在编写一个Connect Four游戏引擎。目前,我正在使用 Zobrist 哈希为不同的 Connect Four 板位置生成哈希键(为了不做两次相同的事情,评估的板位置存储在哈希表中)。评估的电路板位置(最小最大值树中的节点)始终彼此靠近。不幸的是,关闭的电路板位置映射到均匀分布的哈希键,导致大量 CPU 缓存未命中。

是否可以构建一个哈希函数来映射关闭板位置以关闭哈希键?

一个玩家的棋盘位置由以下结构的位板表示:

.  .  .  .  .  .  .  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

我不知道这是否可能。感谢您的帮助!

我认为这是不可能的。一个好的哈希键(如 zobrist 哈希用于棋盘游戏)很可能具有伪随机属性,以实现键在转置表中的均匀分布。让表中"关闭"位置的键彼此靠近与此相矛盾。

考虑一下:即使您将电路板位置

一对一映射到具有 (2^7-1)^7 个位置的表格,您也无法将"关闭"电路板位置映射到关闭内存位置:如果低索引的棋子发生变化,位置将接近,但棋子索引越高,每次的位置差异都会翻倍, 高的人将相距数TB;-)

作为国际象棋引擎的作者,我知道这个问题。AFAIK还没有人解决这个问题,每个人都使用zobrist哈希,也许有一些小的修改。

无论如何,祝你好运解决连接-4...我知道以前做过,但自己做会更令人满意;-)

下面介绍如何修改你大概几乎均匀的随机哈希函数,使其偏置,使类似的板位置在某种程度上可能发生在附近的哈希值上。

让hash(gamestate)成为你现有的函数。 我们将创建一个 newhash(gamestate),它使用哈希作为随机行为,但对于密切相关的游戏状态,生成彼此接近的哈希的概率相当高。

让棋盘状态的"颜色"成为下一个要移动的玩家。 如果要查找白色播放器的哈希键,请使用newhash(board) = hash(board)。 如果你想找到一个黑色仓位的哈希值,请根据你的顺序找到具有最大数字的黑块,比如说,在位置 i。 从游戏状态中删除棋子 i 并调用修改后的状态 proableparent 然后使用 newhash(board) = hash(probableparent) + i。 如果您按可能的放置顺序对位置进行排序(更高的东西作为一阶标准出现得更晚,也许中间位置作为第二标准来得更早?我真的不知道 connect4 的好策略),那么很可能在黑色转弯之前的白色转弯处很可能是父级,因此在您的缓存中很好,因此我在附近。 此外,8 种可能的黑色移动可能会共享相同的prev_board状态,因此具有接近哈希位置。

您可以将此想法扩展到一次回滚多个层。 假设当前转 % 3 == 2,删除棋盘位置 i 和 j 的最大两次移动,然后使用 newhash(board) = hash(board-two-moves-ago) + i*48 + j。

最新更新