Hash 国际象棋转体位置散列

Hash 国际象棋转体位置散列,hash,language-agnostic,puzzle,chess,Hash,Language Agnostic,Puzzle,Chess,国际象棋引擎通常使用Zobrist哈希进行快速查找。Zobrist散列的一个理想(与一般的散列一样)是生成的密钥对于相似的位置尽可能不同 那么,问题是——如何将相似的位置映射到相似的键?简言之,我想要的是一种快速而肮脏的国际象棋位置分类方法(仅通过哈希函数)。有人有什么有趣的想法吗 这里对国际象棋位置的定义不仅仅是棋盘位置,还包括游戏的当前状态(无论是投掷还是让顺道捕获成为可能等) 理想情况下,国际象棋中的位置概念应该合并到哈希函数中。也许应该有两个散列表,一个用于黑色移动,一个用于白色移动,因

国际象棋引擎通常使用Zobrist哈希进行快速查找。Zobrist散列的一个理想(与一般的散列一样)是生成的密钥对于相似的位置尽可能不同

那么,问题是——如何将相似的位置映射到相似的键?简言之,我想要的是一种快速而肮脏的国际象棋位置分类方法(仅通过哈希函数)。有人有什么有趣的想法吗

这里对国际象棋位置的定义不仅仅是棋盘位置,还包括游戏的当前状态(无论是投掷还是让顺道捕获成为可能等)

理想情况下,国际象棋中的位置概念应该合并到哈希函数中。也许应该有两个散列表,一个用于黑色移动,一个用于白色移动,因为这些位置在本质上可能非常不同。我发现了几个类似的问题,例如关于stackoverflow和其他方面,但答案很少

对于stackoverflow,这个问题可能是面向国际象棋的,但是对于stackoverflow,它也太面向编程了

编辑:如果这让我觉得好像我在期待一个完整的解决方案,但我自己没有做任何工作,我很抱歉,但我只是希望一些讨论或有趣的想法,我自己对这个主题的知识相对较少。到目前为止,我所发现的一切都是为了尽可能地将键分开,而不是有意地将它们组合在一起,例如


编辑:一个相关的问题(以及解决潜在问题的另一种方法)是在两个棋局之间设计一些相似性度量。有人对这种方法有什么想法吗?

为国际象棋位置找到良好的相似性度量是一个相当困难的问题。 我建议把位置分成不同的位置元素,这在国际象棋中通常很重要

  • 材料
  • 典当结构
  • 王位
  • 重件位置
  • 轻件的位置
  • 为每个元素生成哈希值(hash1…hashn)


    两个位置的相似性可以用相应散列值的相等来表示。

    Whoa!虽然这的确是一个有趣的话题,但问题的措辞(特别是关于加分的部分)让人觉得你希望得到一个你没有试图解决的问题的完整解决方案。我们在这里帮助您解决问题,而不是免费为您编写解决方案。请参阅。请考虑改写你的问题,以使它看起来不可能是完全的解决方案,或者是你现在所做的努力来解决这个问题。一般来说,散列局部性是不可能的。对于终局数据库来说,您想要的东西是可能的,但终局数据库可能表示为DAG,由物料平衡和一些物料提示索引。有关Zobrist散列的有趣想法,请参见定义“相似位置”-相同位置但颜色反转会被视为“相似”吗?如果您告诉我们您试图解决的实际问题是什么,可能有更好的解决方案。@BlueRaja-Danny Pflughoeft:不,它们可能不应该被视为相似,这就是为什么我建议有两个哈希表,一个供黑人移动,一个供白人移动。区分黑白移动只需要一点额外的信息。为“black to move”分配一个zobrist哈希值,并在每次移动时将其xor分配给整个棋盘哈希,就像对Casting状态或EP状态所做的那样。或者使用移动号码%2。