用Java实现用于Connect 4的Minimax算法

时间:2016-03-22 05:05:14

标签: java artificial-intelligence minimax

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

array (
    'key' => 'field_5426684ccbad6',
    'label' => 'Gender',
    'name' => 'gender',
    'type' => 'radio',
    'required' => 1,
    'choices' => array (
        'male' => 'Male',
        'female' => 'Female',
    ),
    'other_choice' => 0,
    'save_other_choice' => 0,
    'default_value' => '',
    'layout' => 'horizontal',
),

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

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;
    }
}

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

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

谢谢,

1 个答案:

答案 0 :(得分:1)

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

或者,您可以修改代码以返回具有分数和最佳移动的元组(具有多个字段的类)。这比编写argmax包装器更容易(并且更清洁一点IMO),但是如果没有一些额外的工程设计,这可能会导致极小极大功能显着减慢,因为它会导致更多的分配。如果表现不是您的首要任务,那么这可能就是您的选择。

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