我正在编写一个Connect Four游戏引擎。目前,我使用Zobrist hashing为不同的Connect Four板位置生成散列键(为了不再做同样的事情,评估板位置存储在散列表中)。评估板位置(最小最大树中的节点)总是彼此接近。不幸的是,关闭的棋盘位置被映射到统一分布的散列键,导致大量的cpu缓存未命中。连接四个哈希函数:映射关闭元素以关闭哈希键
是否有可能建立一个散列函数来映射关闭板位置以关闭散列键?
一个玩家A板位置由以下结构的棋盘表示:
. . . . . . . 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
我不知道,如果它甚至有可能。 感谢您的帮助!
这是凌晨1点,所以我现在不明白;-)在你的文本中,hash()是一个随机散列函数?newhash()是基于前面的散列和差异的增量散列函数吗?你怎么确定hash()== newhash()一直都是这样? – hirschhornsalz 2011-05-05 23:05:09
我试图澄清。你一直不需要hash()== newhash()(因为hash()的局部性很差)。关键的想法是使用杠杆的游戏状态结构,以便相关游戏状态g和g'的newhash(g)= hash(g')+小偏移量。 – 2011-05-06 01:45:56
但是不是必须一直使用hash()== newhash()吗?假设你有一个通过newhash()生成的位置散列,并且想要检查这个位置散列是否已经以不同的移动顺序到达(这实际上是转置表的主要点)。存储的位置现在可能有不同的散列,因此您不会找到它。 – hirschhornsalz 2011-05-06 01:55:45