有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java MiniMax返回反向实用程序值

我正在打印Mini Max的访问状态和实用性。 当值从终端状态返回到其根时,我遇到了问题,从而导致我访问的状态实用程序值中的4个不正确。我只是不知道是什么原因导致了这个错误。我很确定我的最小值和最大值方法是正确的


共 (1) 个答案

  1. # 1 楼答案

    对于列表中的第一个状态,您需要解释为什么ooxxxo-xo应该是1。如果我以我认为应该的方式重新写下这篇文章,那么州会这样写:

    oox
    xxo
    -xo
    

    如果我们正确地将x作为下一步,我们将得到正确的答案。所以,问题可能出在你们这一代人身上

    看看这个,你有一个静态数组来存储移动,但是当你进行递归调用时,你会一次又一次地覆盖这些移动。相反,每次递归调用都需要移动的本地副本。因此,将minChildrenmaxChildren的定义移动到MinTurnMaxTurn应该至少解决代码中的一个问题。(我还没有确认没有其他问题。)

    明确地说,您的调用堆栈是这样的:

    MaxTurn call
      Set maxChildren to legal moves // < - A
      Call MinTurn recursively
        MinTurn call
          Set minChildren to legal moves
          Call MaxTurn recursively
            MaxTurn call
              Set maxChildren to legal moves // < - B
              Call MinTurn recursively
    

    当到达标记为B的行时,将覆盖在A行计算的maxChildren。因此,当程序返回到A时,可用的移动将被覆盖,并且可能与之前预期的不同


    在解决了这个问题之后,我相信你的新问题就在于你打印东西的方式。如果查看打印代码,则记录当前的最大值,而不是子项返回的值:

    int maxValue = Setting.NEGATIVE_INFINITY;
    maxChildren = generateMoves(state);
    for (State aChildren : maxChildren) {
        maxValue = Math.max(maxValue, MinTurn(aChildren)); // <  A
        nodes.add(aChildren.getState() + " " + maxValue); // < B
    }
    

    因此,在标记为B的行中,您正在为迄今为止看到的所有儿童打印^{)。如果想查看子项的值,不应立即在A行中获取最大值,而是存储结果并记录。然后,拿最大值

    你在这种状态下遇到了麻烦:

    oox
    xxo
    -x-
    

    这是从父状态打印的,搜索可能从该状态开始:

    oox
    xxo
     -
    

    第一步是把x放在左下角,这将赢得比赛,并给出1的值。当应用第二个移动时,在中间出现X的状态,Max值仍然是前一个移动的1。p>

    您的代码应该如下所示:

    int nextValue = MinTurn(aChildren)
    maxValue = Math.max(maxValue, nextValue);
    nodes.add(aChildren.getState() + " " + nextValue);