在一个低于国际象棋的战略游戏中,位板表示是否仍然有效,其中少于64个位置或者更简单的基于阵列的邮箱实现更实用?
我们学校的AI课程每年举办一次比赛,教授组成一个棋盘游戏,我们有四个星期的时间来创建一个玩游戏的AI。通常,这些棋子是具有类似规则的棋子的子集,并且在较小的棋盘上播放。即8x5,7x7等。我完全不确定如何仅使用40位与国际象棋的典型64位相比。
我唯一的问题是我对C或C ++不是很熟悉,并且更习惯用Java实现该程序。他们是否足够支持Java进行位操作,我可以实现一个位板表示,如果这样可以提高效率,是否值得增加复杂性?学习曲线会不会太陡峭?
我的计划是根据时间使用Negamax搜索与AB修剪,静止搜索,换位表,杀手移动等。在如此短的时间内创建竞争性AI的其他任何提示?
答案 0 :(得分:2)
位板可以工作,但在我看来,为了让它正常工作而增加的工作量和复杂性并不值得在以后计算效率上获得任何可能的收益。
在整体规模上,逐位屏蔽(&
或|
)提取数组元素(甚至是List
或Map
的效率无论您打算使用哪种AI或搜索算法,都会大肆黯然失色。
也就是说,指数或多项式复杂度的算法仍然需要O(e^n)
或O(n^d)
,而使用二进制算术而非指针解除引用所节省的CPU周期将是微不足道的。
只需使用此时可以使用的最简单的数据结构(可能是数组,或任何Collection
),并专注于让算法运行。
稍后,如果你有时间,你可以对你的程序进行概要分析,如果你发现数组查找正在占用,比如,20%的运行时间,那么也许,只是可能,考虑将所有内容重构为按位运算。
就个人而言,我会研究一种可能的方法,以并行方式搜索解决方案空间,最大化多个CPU核心,或者更好,以一种可以分布在多个计算节点上的方式。是的,如果你发现一些非常聪明的东西,那么你可能至少有资格获得硕士学位。 :)
答案 1 :(得分:1)
在大学里,我有与你类似的游戏人工智能写作比赛,而且当我担心一些像“正在快速编码的东西”或“理智检查会减慢我的程序速度”这样的小小的时候,我获得了最大的加速。但是'如果我把我的人工智能写得更聪明/更高效,它会更好地执行一个级别,所以我将实现我找到的这个很酷的新技巧。
惊人加速的常见例子是alpha-beta修剪,杀手启发式和选择一个好的算法来计算游戏状态的强度(注意好!=更准确 - 它也可能意味着更快,更准确。毕竟,如果您的分数计算更简单,它可以让您看到前方更多的动作,这意味着您可以在黑桃中进行弥补。
答案 2 :(得分:1)
你也可以使用位板。它并不是那么复杂,您可以在移动生成和静态交换评估中获得显着的加速。你的AI算法,无论多么聪明,仍然需要做大量的算法。
有一个关于这个主题的非常好的网站:chessprogramming.wikispaces.com/Bitboards
由于您的电路板尺寸不同,某些技巧可能不适用,具体取决于您如何将位分配给方块。另一方面,由于它只是部分的一部分,因此可能不存在传统上用位板解决的问题。
答案 3 :(得分:0)
以比特尺度设置单个位通常比布尔数组中的设置元素慢,因为前者需要读+按位AND / OR +写,而后者只需要写。
以比特尺读取单个位也比较慢:读取+按位AND / OR +移位而不是读取。
因此,如果您的AI需要大量的单个板单元的读/写状态,那么布尔数组将更有效。同时,当电路板使用较少的存储器时,即当电池被打包成位时,制作整个电路板的克隆的操作更快。如果您的AI经常克隆吟游诗人并且在克隆操作之间只进行少量获取/设置操作,那么无论电路板大小如何,比特尺度都会更好。