在Gomoku中有一个很好的Minimax表示?

时间:2011-03-29 08:42:01

标签: java minimax gomoku

我正在尝试将Java中的Gomoku(连续五个)游戏编码为单个项目。对于AI,我理解使用具有Alpha-beta Pruning的Minimax函数是一种很好的方法。但是,我有点想象一下它是如何工作的。

我的问题是:极小极大树中节点的良好表示是什么?

我认为我的评估功能会“加权”电路板上的所有空白区域。然后,它将从该板获取最佳值作为minmax决策树的节点。我正朝着正确的方向前进吗?

欢迎任何其他提示! 提前谢谢!

2 个答案:

答案 0 :(得分:4)

状态空间搜索是通过电路板的不同状态。有很多动作,因为你可以在任何地方放置一块石头。每个州可以表示为例如9x9矩阵,有3个值 - 白色,黑色或未占用。使用9x9电路板,因此可能有3 ^ 81个电路板状态。

从任何电路板状态,移动次数是未占用顶点的数量。您可以在任何这些顶点上放置石头。你只能玩自己的颜色。因此,最多有81个可能的移动。第一步移动81,第二移动80,依此类推。所以你可以合理地搜索到5深度,也可能更多......也不会太糟糕。

正如所提到的,正确的表示是2D矩阵 - 这可以是一个二维的二维数组,其值例如是: 0表示空闲,1表示白色,2表示黑色。 ...... int [9,9]。

您的评价功能听起来不太好。相反,我会给出以下几点:

- 连续获得5分 - 基本上给出了这一分的最高分,因为这是一场胜利 - 连续4个,有2个开放端 - 也是最高分,因为对手不能阻止你获得5分。 - 连续4个开放端 - 仍然是一个非常威胁的位置,因为对手必须发挥 在一个地方阻止。 - 连续3次,2个开口 - 再次获得非常高的分数 --- 4,3,2,1两个封闭端 - 0,因为不能连续5个。

等等。

然后,你只应用标准的minimax算法 - 即alpha beta修剪 - 它与国际象棋完全相同,但你有一个不同的状态空间生成器和评估函数。

答案 1 :(得分:1)

我会考虑以下形式的评估函数:在一行中考虑每组,例如6个位置。 (在一个19x19的电路板上,沿着每条线有14个,每条对角线的数字从0到14不等;我认为在整个电路板上有742个。我的算术可能是错误的。)对于每一组,有729种可能的安排黑色,白色和空白的空间。或者,呃,378如果考虑到端到端的对称性。或者,呃,嗯,少于那个,但如果你考虑黑/白对称性,我也不会费心去研究多少。

所以现在你的评估函数将包括一个表格查找,每个块有6个宝石,在一个378或多元素的表格中(或者其中两个,一个用于水平和垂直线,一个用于对角的)。添加结果,这是您对该职位的评估。

事实证明,实际上更大的表格(从更长的一排位置得出)效果更好。

但桌子上有什么?让你的程序解决这个问题。从表格中的任意值开始(例如,您可以采用eval(line)= #black(line) - #white(line)或其他内容)。使用alpha-beta搜索让您的程序自行播放。现在根据发生的情况更新表条目。有很多不同的方法可以做到这一点;这里有一个(粗略描述的)少数。

  • 在每场比赛中,记录每个球员位置每个模式发生的次数。当游戏结束时,调整每个模式的分数,以便获胜玩家更常看到的模式看起来更好。
  • 每次进行搜索时,请调整当前位置模式的分数,使当前静态分数更接近搜索获得的分数。
  • 每次进行一次移动时,调整“之前”位置中每个模式的分数,使“之前”分数与“之后”分数更好地匹配。
  • 有许多不同的表格(因此评估函数有很多不同的变体)。让他们互相对抗。应用某种进化(例如,全部对抗所有,然后抛弃表现最差的表演者并用来自表现较好者的突变体替换它们。)

对于这些想法的更复杂版本(适用于国际象棋,但相同的想法适用于gomoku),请查看http://cs.anu.edu.au/~Lex.Weaver/pub_sem/publications/knightcap.pdf