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