【问题标题】:A good Minimax representation in Gomoku?Gomoku 中一个好的 Minimax 表示?
【发布时间】:2011-03-29 08:42:01
【问题描述】:

我正在尝试将 Java 中的五子棋(五连冠)游戏编写为一个单独的项目。对于 AI,我知道使用带有 Alpha-beta 修剪的 Minimax 函数是解决这个问题的好方法。但是,我很难想象这将如何工作。

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

我认为我的评估函数将“加权”板上的所有空白区域。然后它将从该板上取最佳值作为 minmax 决策树的节点。我的方向正确吗?

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

【问题讨论】:

    标签: java minimax gomoku


    【解决方案1】:

    状态空间搜索是通过棋盘的不同状态进行的。有很多动作,因为你可以在任何无人的地方放置一块石头。每个状态都可以表示为例如9x9 矩阵,具有 3 个值 - 白色、黑色或未占用。因此,对于 9x9 棋盘,有 3 ^ 81 种可能的棋盘状态。

    在任何棋盘状态下,移动的数量是未占用顶点的数量。您可以在这些顶点中的任何一个上放置一块石头。你只能玩你自己的颜色。因此,最多有 81 种可能的移动.. 第一次移动 81 次,第二次移动 80 次,依此类推。因此,您可以合理地搜索到深度 5,并且可能更多……还不错。

    如前所述,正确的表示是一个二维矩阵——这可以只是一个二维整数数组,其值例如0 表示未占用,1 表示白色,2 表示黑色。 ... int[9,9].

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

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

    等等。

    然后,您只需应用标准的极小极大算法 - 即 alpha beta 剪枝 - 这将与国际象棋完全相同,但您有不同的状态空间生成器和评估函数。

    【讨论】:

    • 其中一些评估功能可能会更好地作为搜索调整来实现。例如,如果您在每个位置都在寻找“连续 4 个,一个开口端”,那么您不妨说:任何时候我看到这样的位置,就在那个开口端移动,也许会增加搜索深度1。(计算机国际象棋中使用了类似的技术。)
    • 需要搜索的状态数是 81^n,而不是 9^(n+1)。另一方面,如果你的移动顺序恰好是好的,那么 alpha-beta 将大致平方根,毕竟回落到大约 9^n。
    • 这真的很有帮助,谢谢。 9x9 参考框架将允许更有效的决策树。对于上面的评论,我认为是 3^81 个可能的董事会状态,而不是 81^3。 81 个独立单元,每个单元有 3 种可能的状态
    【解决方案2】:

    我会考虑以下形式的评估函数:考虑每组,例如,一行中的 6 个位置。 (在 19x19 的棋盘上,每条线有 14 个,每条对角线有 0 到 14 个不等的数字;我认为整个棋盘上有 742 个。我的算术可能是错误的。)每组有 729 种可能的排列黑色、 白色和空白空间。或者,呃,378,如果你考虑到端到端的对称性。或者,呃,嗯,比这要少,但如果你也考虑黑白对称性,我也懒得计算少了多少。

    因此,现在您的评估函数将包括在 378 或许多元素的表中对每块 6 块石头进行查找表(或者可能其中两个,一个用于水平线和垂直线,一个用于对角线的)。把结果加起来就是你对职位的评价。

    事实证明,实际上更大的表格(源自更长的位置行)效果更好。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多