2

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

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

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

我的计划是根据时间将 Negamax 搜索与 AB 修剪、静默搜索、转置表、杀手移动等结合使用。在如此短的时间内创建具有竞争力的 AI 的任何其他技巧?

4

4 回答 4

2

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

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

也就是说,指数或多项式复杂度的算法仍然需要O(e^n),或者O(n^d)通过指针解引用的二进制算术节省的几个 CPU 周期将是微不足道的。

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

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

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

于 2013-02-06T05:07:32.553 回答
1

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

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

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

于 2013-02-06T08:39:22.460 回答
1

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

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

于 2013-02-06T05:23:29.847 回答
0

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

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

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

于 2013-02-06T05:07:49.097 回答