【问题标题】:Chess position representation for non-playing software非下棋软件的棋位表示
【发布时间】:2013-06-18 23:54:49
【问题描述】:

我正在寻找一种表示国际象棋位置的有效方法。 我的“效率”标准是:

  1. 需要尽可能少的内存
  2. 给定位置表示和合法移动(以通常的方式表示,例如 pgn 格式),很容易计算得到的位置表示。也就是说,函数 new_position = compute_position(old_position, move) 可以(或已经)以一种非常有效的方式实现(从运行时的角度来看)。
  3. 比较两个位置是否相同很容易

我试图偏离标准表示的原因是我的要求略有不同。具体来说,我不是在尝试开发国际象棋引擎,因此不需要移动生成和相关问题。我只需要关注一些现有的游戏,并代表某些位置,并将它们存储在数据库中。

如果有已经提供此功能的软件包,那就太好了。如果你对如何做有想法,我很乐意开发它:)

谢谢...

【问题讨论】:

  • 这可能不满足要求 1),但 FEN 确实满足 2) 和 3):en.wikipedia.org/wiki/Forsyth–Edwards_Notation
  • 我想到了 FEN,它的内存效率不高,但它可能会。有没有实现我的第 2 点的免费软件?我没有找到这样的代码,因此认为如果我要自己编写它,我可能会尝试找到一种更有效的记忆方式。

标签: chess representation


【解决方案1】:

我将提供一些可能的解决方案,根据您的规范使用“尽可能少的内存”。我知道您可以使其中一些更紧凑,但是这样做会使使用起来更加困难。

  1. 64 位:我不知道您需要能够从表示中检索什么样的信息,但满足您所有给定要求的技术是Zobrist hashing。它需要很少的内存(您可以使用 64 位密钥,然后在预计发生冲突之前存储 232 个位置)。增量更新(按位 XOR 操作)非常简单有效,当然也易于比较。但是,如果您需要显示位置或检索有关棋子的任何信息,这会让您不走运。

  2. 328 位:您可以使用一个片段列表,每个片段(4 位)位于一个正方形(6 位)上。由于有 32 件,您需要跟踪易位权(4 位)、过路文件(3 位)和边移动(1 位)。

  3. 468 位:bitboard representation。我知道您没有开发国际象棋引擎,但这仍然是一个非常紧凑的表示。您需要 7 个位板(全白、全黑、所有皇后、所有车、所有主教、所有骑士、所有棋子),分别跟踪国王(12 位)和所有其他杂项信息。是的,这将需要一些工作来实现,但这允许您做许多其他表示中不可能做的事情,所以如果您需要分析位置,这很好。

【讨论】:

  • 这些表示中的大多数的问题在于,虽然它们的内存效率很高,但从一种表示移动到另一种表示(基于合法移动)在计算上是困难的。事实上,这个标准对我来说更重要。
  • btw 2^32 位置容量太小,无法进行任何实际分析。另外,我认为使用 hufmann 编码可以将完整编码减少到 200 位以下,而不会丢失信息。这样做的代价是计算的复杂性。
  • @amit 除非您使用现有的框架,否则总是很难采取行动。 en passant 和 castling 之类的事情至少需要一些国际象棋逻辑,因此您将很难找到不依赖于某些内部国际象棋表示的表示。这就是为什么我建议直接使用这些低级表示。是的,我知道如果您愿意,您可以使用编码方案来进一步减少内存占用。如果超过 20 亿个位置还不够好,那么使用 128 位密钥进行 Zobrist 散列。然后您将有 2^64 个职位可供使用。
【解决方案2】:

这里有一个免费的 PGN 查看器:http://chesstempo.com/pgn-viewer.html

关于空间要求,您可以使用您选择的压缩算法来压缩 FEN,而不会失去检查相等性的能力。根据移动的编码方式(g1f3 与 Nf3),您可能需要一个合法的移动生成器来满足要求 2)。

【讨论】:

  • 我在提供的链接中找不到我需要的东西。我可能给出了不清楚的描述 - 所以让我澄清一下。我需要一个实现 FEN(或任何其他表示)操作的软件实用程序包/库。我需要的主要功能是从给定的 FEN 和合法的移动计算一个新的 FEN。我在提供的链接中看到的是一个可能知道如何做我需要的应用程序,但是没有代码或 API,我无法在我想编写的软件中使用它。我错过了什么吗?
  • 说实话我也没有找到 API。就在今天早上,我发现了一个由两个本科生设计的简单程序......也许它可能会有所帮助? github.com/slepkin/chess
猜你喜欢
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多