【问题标题】:Compression of chess position棋位压缩
【发布时间】:2021-02-20 12:19:30
【问题描述】:

我开发了一个国际象棋引擎,大约在 3300 Elo 下棋。 我需要处理和调整我用我的引擎生成的一组位置。 为此,在我的 RAM 中存储大约超过 1B 个位置将是理想的。 我正在尝试找出存储纯位置国际象棋数据的最有效方法。

castling、en passant 等信息可以忽略。

想法


  1. 幼稚的方法是使用恰好需要 12 个位板(每块)的位板 最后会是12*8=96 byte
  2. 或者,我只能使用 8 个位板,其中 6 个用于不同的部分,另外 2 个用于不同的颜色=64 byte
  3. 理论上,使用上面的方法我可以摆脱 7 个位板。我不需要 2 个用于颜色的位板。只要有白色的就足够了,我可以很容易地断定一件是白色还是黑色。 = 56 byte
  4. 我可以使用可以在48 byte 中解决的位板进行进一步压缩,但我无法使用位板进行进一步压缩。
  5. 还可以存储每件的纯位置信息。例如将前 6 位用于白国王,接下来的 6 位用于黑国王,接下来的 6 位用于白皇后,等等。 请注意,这里的棋子需要 8*(6+3) 位,因为棋子可以升级为需要在 3 位内编码的其他棋子。有问题的是编码缺少一块。
  6. 有一些压缩技术,例如 Huffman 树,但我还需要对板上的棋子进行一些快速计算。

那么存储国际象棋位置的最快/最佳压缩技术是什么?

问候 芬兰人

【问题讨论】:

  • 简单的想法:1个完整的位板标记占用位置。对于其余数据,仅对占用的位置进行编码。最多有32个被占用的位置,所以简单的方法是7组信息(颜色,6个)使用4个字节。如果我数对了,那是 36 个字节。
  • 如果您不介意不同编码位置的可变大小,请将上述内容扩展到仅针对您还不知道的位置的编码信息。
  • 嗯。我刚刚找到了一种总是摆脱 24 字节的方法。我可以使用 8 个字节来占用,然后每块使用 4 位。最多为 24 个字节。我想知道它是否容易降低帽子
  • 是否存在大量彼此非常相似的位置,因此您可以添加一些替代的增量编码? (如,“占据位置 123456 并在 F4 处移除一块”或类似的东西)
  • 很可能不是。我有时也需要交换条目

标签: compression chess


【解决方案1】:

霍夫曼代码在这里运行良好,而且速度可能比您想象的要快。

每个方块由可变数量的位表示。第一位为空 (0),或被占用 (1)。如果为 0,则下一位用于下一个方块。如果为 1,则下一位是白色 (0) 或黑色 (1)。接下来的一到四位是棋子的类型:卒 (0)、马 (100)、象 (101)、车 (110)、后 (1110)、国王 (1111)。

这平均用 16.9 个字节对一块板进行编码。 (运行超过 100 万场比赛。)最大 20.5 字节的完整棋盘代码。

使用查表可以非常快速地完成解码。最长的代码是六位。获取接下来的 6 位并在 64 条目表中查找。表中的每个条目都是方格的内容(例如黑主教、白国王、空)和代码中的位数(1..6)。删除那么多位,获取更多位来填充剩下的六位,然后重复。

您可以使用它转换为简单的 64 字节表示以进行快速操作,如果需要,可以将结果快速转换回压缩形式。

如果需要,可以剃掉更多。将空或占用表示为八列(文件),每列八位。霍夫曼对这些八位符号进行编码。它们平均可以编码为 6.6 位,将 16.9 字节减少到 15.5 字节。

除了文件的一个代码之外,您还可以使用四个文件代码再减少 2.2 个字节:一个用于 a/h,一个用于 b/g,一个用于 c/f,一个用于 d/e。平均下来到 13.3 字节。

【讨论】:

  • 令人印象深刻的答案。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多