国际象棋引擎通常使用Zobrist散列来快速查找。 Zobrist散列的理想(与一般的散列一样)是生成的键与类似位置尽可能不同。
那么问题是 - 如何将类似的位置映射到类似的键?简而言之,我想要的是一种快速而又脏的方法来对象棋位置进行分类(仅通过哈希函数)。谁有任何有趣的想法?
这里国际象棋位置的定义不仅仅是棋盘位置,而且还包括游戏的当前状态(无论是铸造还是使得传球捕获成为可能等)
理想情况下,国际象棋的位置概念应该包含在散列函数中。也许应该有两个哈希表,一个用于黑色移动,一个用于白色移动,因为这些位置本质上可能非常不同。我发现了几个类似的问题,例如efficient storage of a chess position在stackoverflow和其他地方,但答案很少。
这个问题可能是针对stackoverflow的国际象棋,但它对于https://chess.stackexchange.com/来说也是面向编程的
编辑:道歉,如果遇到好像我期待一个完整的解决方案,而不是自己做任何工作,但我只是希望有一些讨论或有趣的想法,我自己对主题知之甚少。到目前为止,我发现的所有东西都旨在尽可能地将键分开,而不是故意将它们组合在一起,例如http://chessprogramming.wikispaces.com/Zobrist+Hashing
编辑:一个相关的问题(以及解决潜在问题的另一种方法)是设计两个国际象棋位置之间的某些相似性度量。有没有人对这种方法有任何想法?
寻找国际象棋位置的良好相似性措施是一个非常难的问题。我建议将位置分成不同的位置元素,这在国际象棋中通常很重要:例如
为每个元素生成哈希值(hash1 ... hashn)。
两个位置的相似性可以通过相应的散列值的相等来表示。