【问题标题】:TicTacToe minimax algorithm. Could use some inputTicTacToe 极小极大算法。可以使用一些输入
【发布时间】:2014-04-09 19:46:18
【问题描述】:

我正在尝试编写 minimax 函数,以便计算机始终获胜或平局。所以我的算法已经到了反动的地步,并且大部分时间都打成平手(有时赢有时输)。这是我到目前为止所拥有的。

public int minimax(char[][] state, int depth, boolean maximizingPlayer){
    BoardState node = new BoardState(state);

    if(depth == 0 || new BoardState(state).terminalState()){
        return score(node);
    }

    if(maximizingPlayer){
        int bestValue = Integer.MIN_VALUE;
        ArrayList<int[]> moves = node.moves();

        for(int[] move : moves){
            state[move[0]][move[1]] = mark;

            int value = minimax(state, depth - 1, false);

            if(value > bestValue){
                bestValue = value;
                bestX = move[0];
                bestY = move[1];
            }

            state[move[0]][move[1]] = '-';
        }

        return bestValue;
    }
    else{
        int bestValue = Integer.MAX_VALUE;
        ArrayList<int[]> moves = node.moves();

        for(int[] move : moves){
            state[move[0]][move[1]] = context.getOpposingMark();

            int value = minimax(state, depth - 1, true);

            if(value < bestValue){
                bestValue = value;
                bestX = move[0];
                bestY = move[1];
            }

            state[move[0]][move[1]] = '-';
        }

        return bestValue;
    }
}


private int score(BoardState node){
    if(node.winner(mark)){
        return 10;
    }
    else if(node.winner(context.getOpposingMark())){
        return -10;
    }
    else if(node.winningPosition(mark)){
        return 1;
    }
    else if(node.winningPosition(context.getOpposingMark())){
        return -1;
    }
    else{
        return 0;
    }
}

我的函数调用如下所示。

minimax(state, 2, true);

我遇到的问题是,如果深度增加,计算机阻止对手获胜的可能性就会降低。然而,由于深度只有两个,我认为该算法没有足够的洞察力来阻止分叉动作(当对方玩家有一个动作时,他们可以在两个位置放置一个动作来赢得比赛)。有人对我如何修改算法有一些建议或指示吗?如有必要,我可以提供额外的源代码。

【问题讨论】:

    标签: java search artificial-intelligence


    【解决方案1】:

    你所有的非终端位置的分数都是 0。仔细看看前终端位置,即一招就能立即获胜的位置。

    例如,尝试为您在该位置的每一个获胜动作得分 +1,为对手在该位置的每个获胜动作得分 -1 或 -2。这将使算法更容易修剪对手有很多获胜方式而你却很少的分支。

    计算立即获胜的动作应该相当便宜。当然,这基本上是一个内置的下降步骤,所以你的下降深度实际上会多一个。您可以减小初始允许深度。

    【讨论】:

    • 看起来是这样做的。编辑帖子以反映更改。向我的 BoardState 类添加了另一个函数,该函数通知 2 (n - 1) 件是否就位。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多