如何调整我的Minimax搜索树来处理没有基于游戏的游戏?

时间:2013-05-20 19:32:30

标签: algorithm artificial-intelligence minimax alpha-beta-pruning

我必须做一个我们需要实施mancala棋盘游戏的项目,然后为它实现AI。

我们已经被指示我们需要修改或更改minimax树以便能够与mancala一起使用,因为在游戏中玩家可以连续多次转弯。

我已经实现了我的游戏逻辑和GUI,但现在在我开始使用AI之前,我想尝试一下它背后的理论。我在网上搜索了非转弯的迷你最大树,我似乎无法找到任何东西。但是我看到很多人都在谈论使用minimax来制作mancala。

现在,我理解了正常的minimax树以及每个级别如何在最小节点和最大节点之间交替。有了我现在需要的树,我会说:min > max > max > min > max如果第二个玩家有两个转弯吗?

我们还需要能够指定Minimax树的给定层深度。我们还需要进行alpha beta修剪,但是一旦我真的有了树,那就是以后的。[/ p>

2 个答案:

答案 0 :(得分:3)

据我所知,你的主要问题如下:你已经看到如何在max / min进入周期的情况下使用minimax,现在你有一个游戏,有时一个玩家可以在一个游戏中做多个动作行。

我将向您解释基本上适用于任何游戏的一般方法,然后我将添加一些可以为mancala做的不同的事情。

所以一般方法

标准极小极大如下:

function minimax(node, depth, maximizingPlayer)
    if depth = 0 or node is a terminal node
        return the heuristic value of node
    if maximizingPlayer
        bestValue := -∞
        for each child of node
            val := minimax(child, depth - 1, FALSE)
            bestValue := max(bestValue, val)
        return bestValue
    else
        bestValue := +∞
        for each child of node
            val := minimax(child, depth - 1, TRUE)
            bestValue := min(bestValue, val)
        return bestValue

使用max / min初始化minimax调用,然后不断更改。在您的情况下,您只需要添加一个小支票。

function minimax(node, depth, maximizingPlayer)
    if depth = 0 or node is a terminal node
        return the heuristic value of node
    if maximizingPlayer
        bestValue := -∞
        for each child of node
            # here is a small change
            if freeTurn(child):
               isMax := TRUE
            else:
               isMax := FALSE
            val := minimax(child, depth - 1, isMax)
            bestValue := max(bestValue, val)
        return bestValue
    else
        bestValue := +∞
        for each child of node
            # here is a small change
            if freeTurn(child):
               isMax := FALSE
            else:
               isMax := TRUE
            val := minimax(child, depth - 1, isMax)
            bestValue := min(bestValue, val)
        return bestValue

您的功能freeTurn会让您回复当前行动后是否有空转。请注意,无论您是连续2次移动还是连续5次移动,此算法都没有区别。

关于Mancala

mancala有很多变种,但游戏的分支因素非常小(我所知道的是<= 6)。现在假设您有三个移动ABCD,移动C可让您再玩一次。从C位置,您可以移动C1C2。因此,您可以将它们组合起来(C + C1C + C2)并将它们视为一次移动(应该进行小额记账以记住这实际上是两个动作)。所以现在你最终得到最小的最大迭代次数,你没有4次移动:ABC + C1C + C2D。实际上,对于具有更大分支因子的游戏,使用这种方法并没有错。

答案 1 :(得分:0)

如果一方可以在一个回合中有多个动作,那么必须有某种方法来检测它。当检测到具有用于对手的移动生成器时生成仅包含空移动的列表,即不执行任何操作的移动。对手将被迫进行该动作(什么都不做),然后第一个玩家可以计算他的下一步动作。