【问题标题】:Implementing a Minimax Algorithm in Java for Connect 4在 Java 中为 Connect 4 实现 Minimax 算法
【发布时间】:2016-03-22 05:05:14
【问题描述】:

我正在尝试使用 minimax(和 alpha beta 修剪)构建 Connect 4 游戏,主要是为了向自己证明我可以做到。然而,我遇到的一个大概念问题是如何实际利用极小极大算法。我这样做的方式是我有一个 AI 类,它有一个函数是执行返回 int 的 minimax 算法。

public int minimax(Board board, int depth, int alpha, int beta, String player) {

    if(depth == 0 || board.getScore() >= 512) {
        return board.getScore();
    }

    else if(player.equals("computer")) {
        int temp = -1000000;
        for(Integer[] moves : board.availableMoves) {
            board.putPiece(player, moves[0]);
            temp = Math.max(temp, minimax(board, depth-1, alpha, beta, "human"));
            board.removePiece(moves[0], moves[1]);
            alpha = Math.max(alpha, temp);
            if (alpha >= beta) {
                break;
            }

        }
        return temp;
    }

    else {
        int temp = 1000000;
        for(Integer[] moves : board.availableMoves) {
            board.putPiece(player, moves[0]);
            temp = Math.min(temp, minimax(board, depth+1, alpha, beta, "computer"));
            board.removePiece(moves[0], moves[1]);
            beta = Math.min(beta, temp);
            if(alpha >= beta) {
                break;
            }
        }
        return temp;
    }
}

这是由 Game 类的一个名为 computerMove() 的函数调用的。

public int computerMove() {
    Board tempBoard = board;
    int bestMove = 0;
    AI ai = new AI();
    ai.minimax(board, difficulty, -1000000, 1000000, "computer");

    return bestMove;
}

但是,我该如何处理返回的 int 呢?我如何利用它来实际移动这块?返回的 int 只是我能得到的最好的板子,对吧?它没有特别告诉我应该做的位置或棋盘。

非常感谢任何和所有帮助。

谢谢,

【问题讨论】:

  • 从递归方法中,您不仅应该返回目标函数值,即极小值,还应该返回从当前位置移动的值,这将导致该值。

标签: java artificial-intelligence minimax


【解决方案1】:

书籍都说只返回分数,但这对于实际玩游戏是不切实际的。当然,到处保持最佳移动的开销确实会减慢程序的速度,因此通常您使用驱动程序函数来执行第一级扩展,并另外跟踪最佳移动。这有效地将实现包装在 argmax function 中,这只是一种奇特的说法,它返回顶层的最佳移动而不是得分。你可以在a little project I worked on last year 中看到一个这样的例子。代码是用 C# 编写的,但它与 Java 非常接近,您可以理解。

或者,您可以修改代码以返回具有得分和最佳移动的元组(具有多个字段的类)。这比编写 argmax 包装器更容易(而且 IMO 更简洁),但如果没有一些额外的工程,这可能会导致 minimax 函数明显变慢,因为它会导致大量的分配。如果性能不是您的首要任务,那么这可能就是您要走的路。

我还应该指出,您的实现至少有一个错误。无论谁在玩,并且在您的人类分支中,您都应该为人类玩家增加深度。这意味着深度永远不会达到 0,并且只有当玩家被确定为获胜者时才会击中基本情况。此外,在使用 alpha beta 时,重要的是董事会评估知道轮到谁以及谁是最大化玩家,否则你会遇到很多难以发现的错误。您没有在此处显示该代码,但我想指出这一点,因为它每次都能吸引我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多