我正在尝试用minimax(和alpha beta修剪)构建Connect 4游戏,主要是为了向自己证明我可以做到。但是,我遇到的一个重要概念问题是如何实际利用minimax算法。我这样做的方法是,我有一个具有一个函数的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就是我能得到的最好的板卡,对吗?它没有告诉我关于我应该做的位置或木板的任何事情。

任何帮助都将不胜感激。

谢谢,

最佳答案

所有的书都说只返回分数,但这对于实际玩游戏是不切实际的。当然,在任何地方保持最佳移动的开销确实会减慢程序的速度,因此通常使用驱动程序功能执行第一级扩展,并同时跟踪最佳移动。这有效地将实现包装在argmax function中,这只是一种奇特的说法,可以说它返回了最高得分而不是最高得分。您可以在a little project I worked on last year中查看此示例。该代码在C#中,但是与Java足够接近,您可以理解它。

或者,您可以修改代码以返回具有得分和最佳移动的元组(具有多个字段的类)。这比编写argmax包装器要容易(并且更干净一些的IMO),但是如果不做一些额外的工程,这可能会导致minimax函数的速度明显下降,因为这将导致大量分配。如果性能不是您的重中之重,那么这可能就是您的最佳选择。

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

关于java - 在Java中为Connect 4实现Minimax算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36146480/

10-12 18:11