Algorithm Negamax-玩家移动两次

Algorithm Negamax-玩家移动两次,algorithm,minmax,Algorithm,Minmax,如果满足条件,你如何处理同一玩家移动的游戏 我试过这样的方法,但我觉得不太对: function negamax(node, depth, α, β, color) if node is a terminal node or depth = 0 return color * the heuristic value of node else foreach child of node if (condition is met)

如果满足条件,你如何处理同一玩家移动的游戏

我试过这样的方法,但我觉得不太对:

function negamax(node, depth, α, β, color)
    if node is a terminal node or depth = 0
        return color * the heuristic value of node
    else
        foreach child of node
            if (condition is met) // the same player moves
               val := negamax(child, depth-1, α, β, color)
            else
               val := -negamax(child, depth-1, -β, -α, -color)
            if val≥β
                return val
            if val≥α
                α:=val
        return α

在negamax中,您正在探索一种树结构,其中每个节点都有对应于玩家移动的子节点。如果在某些情况下,一个玩家可以移动两次,你可能会认为该玩家的“移动”是该玩家所做的两次移动序列。更一般地说,您应该将当前游戏状态的子级视为当前玩家在轮到他们之后可以使游戏进入的所有可能状态。这包括一个移动可以达到的所有游戏状态,以及如果玩家能够在一个回合中做出两个移动,那么两个移动可以达到的所有游戏状态。因此,您应该保持negamax的基本逻辑不变,但要更新代码以生成后续状态,以处理单个玩家可以移动两次的情况


希望这有帮助

不要尝试为此更改minimax算法本身,而是修改游戏表示以适应。基本上有两种解决方案:

  • 将单个玩家的动作序列表示为一个动作。这在游戏简单时有效,但并不总是如此。我为一个游戏编写了一个AI引擎,在这个游戏中生成这棵树(在游戏规则中称为一个“移动”)很难(对于真正的游戏,有一个很大的n),这意味着它在计算上不可行。另一方面,如果这种建模方法对于您的特定游戏来说很容易,那么就这样做吧
  • 将一名玩家的动作序列表示为交替动作序列,其中另一名玩家做任何事情。也就是说,只要你的条件满足,你就会在游戏状态中添加一条信息,这样其他玩家唯一能做的动作就不会改变状态。这个方法在数学上是正确的,当我使用它的时候,它在实践中非常有效。要记住的唯一复杂性是,如果使用,将低估一个玩家连续多次移动的游戏树。在设计用于和其他散列的存储启发式时,您可能还需要小心
  • 我知道没有任何文献讨论你的特殊问题。当我想出上面的解决方案2时,我觉得自己很聪明,但我怀疑很多其他人也发明了同样的把戏


    我应该说,正确处理极小极大族是非常困难的。用高级语言设计游戏搜索AI的一个技巧是在更简单的游戏上测试搜索算法(缩小棋盘大小,使用tic-tac-toe等),以确保正确性。如果游戏很小,你可以玩。通过手动和b进行游戏,确保其结果有意义。测试高级算法,例如确保它们给出与naive negamax相同的答案。尝试使具有游戏特定行为(评估函数、棋盘表示、搜索和存储启发式等)的代码远离执行树搜索的代码也是一个好主意

    当条件满足时,不要减少深度。

    如果你能解释更多关于所有变量的信息,我们可能会帮助…@Dhaivat Pandya代码摘录取自wiki ah。那么,这不完全是游戏开发,是吗?@Dhaivat:为什么不是?例如,你可以在绘图/检查评估函数中使用它。@John:你为什么不认为它是对的?在我看来不错。我不够清楚,如果满足某些条件,球员可以多次移动。因此,如果我要实现您的解决方案,我将处理一个新的树结构,只是为了找到节点的后续节点。@JohnRetallack-是的,这是正确的。我认为关键的想法是要认识到“移动”不仅仅是一个游戏,而是一个玩家的完整游戏序列,而另一个玩家不能干预。或者,您可以将一名玩家的一系列移动想象为一系列交替移动,其中另一名玩家被迫执行“无操作”移动。@templatetypedef:操作代码有什么问题?在我看来,这很好。@TonyK-我担心的是,如果一个玩家可以反复玩动作,negamax代码将永远不允许另一个玩家移动,因此无法在适当的深度对游戏进行准确评估。将移动捆绑在一起会迫使玩家交替轮换,直到达到深度,从而更好地了解游戏状态。@templatetypedef:相反,如果第一个玩家有一大串连续移动可供选择,则按自己的方式操作可能会导致组合爆炸。