【问题标题】:Efficient board representation for strategy board game AI战略棋盘游戏 AI 的高效棋盘表示
【发布时间】:2013-02-06 04:51:57
【问题描述】:

在少于 64 个位置的类似象棋的简单策略游戏中,位板表示是否仍然有效,或者基于数组的更简单邮箱实现更实用?

我们学校的 AI 班每年都会举办一场比赛,教授制作棋盘游戏,我们有四个星期的时间来创建一个玩游戏的 AI。通常,这些棋子是具有相似规则的棋子的子集,并且在较小的棋盘上进行。即 8x5、7x7 等。我完全不确定仅使用 40 位与国际象棋的典型 64 位相比如何。

我唯一的问题是我对 C 或 C++ 不是很熟悉,并且更愿意用 Java 实现程序。他们在 Java 中是否足够支持位操作,我可以在其中实现位板表示,如果这会提高效率,是否值得增加复杂性?学习曲线会不会太陡?

我的计划是根据时间将 Negamax 搜索与 AB 剪枝、静止搜索、换位表、杀手招式等结合使用。在如此短的时间内创建具有竞争力的 AI 的任何其他技巧?

【问题讨论】:

    标签: java data-structures artificial-intelligence bit-manipulation bitboard


    【解决方案1】:

    位板可以工作,但在我看来,为了让它正常工作而付出的额外努力和复杂性不值得以后在计算效率方面获得任何可能的收益。

    在事物的整体规模上,任何从位掩码(&|)到获取数组元素(甚至是 ListMap)的效率都将在很大程度上被任何 AI 所掩盖或您打算使用的搜索算法。

    也就是说,指数或多项式复杂度的算法仍将占用 O(e^n)O(n^d) 并且使用二进制算术而不是指针取消引用节省的 CPU 周期将是微不足道的。

    只需使用此时您可以使用的最简单的数据结构(可能是数组,或任何Collection),并专注于让您的算法正常工作。

    稍后,如果您有时间,您可以分析您的程序,如果您发现数组查找占用了例如 20% 的运行时间,那么也许,只是也许,考虑将所有内容重构为按位运算。

    就个人而言,我会考虑并行搜索解决方案空间的可能方法,以最大化多个 CPU 内核,或者更好的是,以一种可以分布在多个计算节点上的方式。是的,如果你发现了一些非常聪明的东西,那你可能至少有资格获得硕士学位。 :)

    【讨论】:

    • 我喜欢用更简单的方法让它工作,然后根据时间和性能进行调整。同时搜索游戏树将是我的下一个问题...感谢您的建议。
    • 在 4-8 核机器上运行时,并行执行的收益远不及位摆弄可能获得的收益。虽然它可能更容易点击(例如,如果你无论如何都以函数式编程)。但是与位摆弄相比,大规模并行性非常复杂(例如 GPU)。
    • 您可能还会从使算法更智能而不是位摆弄优化中学到更多。
    • 同意@ziggystar。如果您正在设计一个与其他玩家对战的游戏玩家,那么并行性不会有太大帮助,其他玩家也可能会使用它们。 Bitwise 很难,这就是为什么很多人被吓跑的原因。并行性也不是那么容易实现的,瓶颈总是存在的。
    【解决方案2】:

    在大学时,我参加过与您类似的游戏 AI 写作比赛,当我担心诸如“静态编码是否更快”或“健全性检查会减慢我的程序速度?”之类的小细节时,我获得了最大的加速。但是“如果我将我的 AI 编写得更智能/更高效,它的性能会一个数量级更好,所以我将实施我发现的这个很酷的新技巧”。

    惊人加速的常见示例是 alpha-beta 修剪、杀手启发式和选择一个好的算法来计算游戏状态的强度(请注意,好的 != 更准确 - 这也可能意味着更快且仍然准确。毕竟,如果你的分数计算更简单,它可以让你看到更多的动作,这意味着你可以用黑桃弥补它。

    【讨论】:

    • 评估是更快还是更准确?两者兼顾?
    • 这种问题只能通过让不同的机器人相互竞争并看哪个获胜来回答:)
    【解决方案3】:

    您不妨使用位板。它并没有那么复杂,而且你在移动生成和静态交换评估方面得到了显着的加速。你的 AI 算法,无论多么聪明,仍然需要做很多这样的事情。

    关于这个主题有一个非常好的网站:chessprogramming.wikispaces.com/Bitboards

    由于您的棋盘尺寸不同,因此某些技巧可能不适用,具体取决于您将位分配给方格的方式。另一方面,由于它只是部分的一部分,一些传统上用位板解决的问题可能不存在。

    【讨论】:

      【解决方案4】:

      在位尺度中设置单个位通常比在布尔数组中设置元素慢,因为前者需要读+按位与/或+写,而后者只需要写。

      按位读取单个位也较慢:读取 + 按位 AND/OR + 移位与仅读取相比。

      因此,如果您的 AI 需要单个板单元的大量读/写状态,那么布尔数组会更有效。同时,当板使用较少的内存时,即当单元被打包成比特时,克隆整个板的操作会更快。如果你的 AI 会经常克隆吟游诗人,并且在克隆操作之间只执行少量的 get/set 操作,那么无论电路板大小如何,位规模都会更好。

      【讨论】:

      • 如果我实现了一个好的制作和取消移动功能,我根本不需要克隆板。问题出现在移动生成中......我可以在不使用位板的情况下非常快速地生成移动吗?
      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 2018-02-04
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      相关资源
      最近更新 更多