在简化版的类似国际象棋的策略游戏中,如果棋盘位置少于64个,使用位板表示法是否仍然有效,或者使用更简单的基于数组的信箱实现是否更实用?
我们学校的AI课程每年都会举办一次比赛,教授会设计一个棋盘游戏,我们有四个星期的时间来创建一个玩这个游戏的AI。通常,棋子是国际象棋棋子的一部分,规则类似,并且在较小的棋盘上进行游戏,例如8×5、7×7等。我完全不确定使用仅40位与国际象棋的典型64位相比会有什么不同。
我的唯一问题是我对C或C++不太熟悉,我更愿意用Java来实现这个程序。Java中是否有足够的位操作支持,使我能够实现位板表示法,如果这能增加效率,是否值得增加复杂性?学习曲线会不会太陡峭?
我的计划是使用带有AB剪枝的Negamax搜索、静态搜索、置换表、杀手走法等,具体取决于时间。还有其他什么建议可以在这么短的时间内创建一个有竞争力的AI?
回答:
位板确实可以使用,但在我看来,为了正确运行而增加的努力和复杂性并不值得任何可能的后续计算效率提升。
从整体来看,位掩码操作(&
或 |
)相对于获取数组元素(甚至是List
或Map
)的任何效率提升,都将被你打算使用的任何AI或搜索算法所掩盖。
也就是说,一个指数或多项式复杂度的算法仍然需要O(e^n)
或O(n^d)
的时间,而你通过二进制运算而不是指针解引用节省的少量CPU周期将是微不足道的。
此时,最好使用你能使用的、最简单的数据库结构(可能是数组,或任何Collection
),并专注于使你的算法正常工作。
之后,如果你有时间,你可以对你的程序进行性能分析,如果你发现数组查找占用了运行时间的20%,那么也许,只是也许,考虑将所有内容重构为位操作。
就我个人而言,我会考虑可能的方式来并行进行解决方案空间的搜索,以最大化利用多个CPU核心,或者更好的是,以一种可以分布在多个计算节点上的方式。是的,如果你发现了真正巧妙的东西,这可能会让你至少获得硕士学位。:)