我正在尝试将 Java 中的 Gomoku(连续五个)游戏编写为一个单独的项目。对于 AI,我知道使用带有 Alpha-beta 修剪的 Minimax 函数是解决这个问题的好方法。但是,我很难想象这将如何工作。
我的问题是:对于极小极大树中的节点,什么是好的表示?
我认为我的评估函数将“加权”板上的所有空白空间。然后它将从该板上取最佳值作为 minmax 决策树的节点。我在正确的方向吗?
也欢迎任何其他提示!提前致谢!
状态空间搜索是通过棋盘的不同状态进行的。有很多动作,因为你可以在任何无人的地方放置一块石头。每个状态都可以表示为一个 9x9 矩阵,具有 3 个值——白色、黑色或未占用。因此,对于 9x9 板,有 3 ^ 81 种可能的板状态。
在任何棋盘状态下,移动的数量是未占用顶点的数量。您可以在这些顶点中的任何一个上放置一块石头。你只能玩自己的颜色。因此,最多有 81 种可能的移动.. 第一次移动 81 次,第二次移动 80 次,依此类推。因此,您可以合理地搜索到深度 5,并且可能更多……还不错。
如前所述,正确的表示是一个 2D 矩阵——这可以只是一个 2D 整数数组,其值例如 0 表示未占用,1 表示白色,2 表示黑色。... int[9,9]。
您的评估功能听起来不太好。相反,我会给以下几点:
-- 连续获得 5 分 -- 基本上给它最高分,因为这是一场胜利 -- 连续 4 分,有 2 个开放端 -- 也是最高分,因为对手无法阻止您获得 5 分。 -- 连续 4 次有 1 个开端 -- 仍然是一个非常有威胁的位置,因为对手必须在一个位置上进行阻挡。-- 连续 3 个,有 2 个开放端 -- 再次获得非常高的分数 --- 4, 3, 2, 1 有两个封闭端 -- 0,因为不可能连续获得 5 个。
等等。
然后,您只需应用标准的极小极大算法——即 alpha beta pruning——它与国际象棋完全相同,但您有不同的状态空间生成器和评估函数。
我会考虑以下形式的评估函数:考虑每组,例如,一行中的 6 个位置。(在 19x19 的棋盘上,每条线有 14 个,每条对角线有 0 到 14 个不等的数字;我认为整个棋盘上有 742 个。我的算术可能是错误的。)每组有 729 种可能的排列黑色、 白色和空白空间。或者,呃,378,如果你考虑到端到端的对称性。或者,呃,嗯,比那个少,但如果你也考虑黑白对称性,我不会费心去计算少了多少。
因此,现在您的评估函数将包括在 378 或许多元素的表中对每块 6 块石头进行表查找(或者可能其中两个,一个用于水平线和垂直线,一个用于对角线) . 把结果加起来,这就是你对这个职位的评价。
事实证明,实际上更大的表格(从更长的位置行派生)效果更好。
但是表里有什么?让你的程序解决这个问题。从表中的任意值开始(例如,您可以使用 eval(line) = #black(line)-#white(line) 或其他值)。让您的程序自行运行,使用 alpha-beta 搜索。现在根据发生的情况更新表条目。有很多不同的方法可以做到这一点;这里有一些(粗略描述的)。
For a more sophisticated version of these ideas (applied to chess, but the same ideas would work fine for gomoku), take a look at http://cs.anu.edu.au/~Lex.Weaver/pub_sem/publications/knightcap.pdf .