Tic Tac Toe Alpha Beta Minimax

时间:2015-08-29 06:32:19

标签: java tic-tac-toe minimax alpha-beta-pruning

我一直在研究一个tic tac toe程序,以便更好地理解minimax算法的工作原理。以下实现无法正常工作,因为计算机可能会松动游戏。如果程序工作正常,理论上这应该是不可能的......

我是否犯了极小极大的实施错误,或获得最佳动作?

我之前从未实现过算法:s

评估功能

public static int evaluate(char[] board, char turn) {
    if (isWinFor('x', board)) {
        return -1;
    } else if (isWinFor('o', board)) {
        return 1;
    } 
    return 0;
}

极小

public static int alphabeta(char[] board, int depth, char turn, int alpha, int beta) {
    if (depth == 0 || gameOver(board)) {
        return evaluate(board, turn);
    } else {
        for (int move : possibleMoves(board)) {
            makeMove(board, turn, move);
            turn = changeTurn(turn);
            int value = alphabeta(board, depth--, turn, alpha, beta);   
            makeMove(board, ' ', move);
            if (turn == 'o') {
                if (value > alpha) {
                    alpha = value;
                }
                if (alpha >= beta) {
                    return beta;
                }
            } else if (turn == 'x') {
                if (value < beta) {
                    beta = value;
                }
                if (beta <= alpha) {
                    return alpha;
                }
            }               
        }
        if (turn == 'o') {
            return  alpha;
        } else {
            return  beta;
        }             
    }
}

找到最佳动作

public static void getBestMove(char[] board, char turn) {
    Random random  = new Random();
    int bestValue = -10000;
    List<Integer> choices = new ArrayList<Integer>();
    for (int move : possibleMoves(board)) {
        makeMove(board, turn, move);
        turn = changeTurn(turn);
        int value = alphabeta(board, 3, turn, -10000, 10000);   
        makeMove(board, ' ', move);
        if (value > bestValue) {
            bestValue = value;
            //start code edit
            choices.clear();
            //end code edit
            choices.add(move);
        } else if (value == bestValue) {
            choices.add(move);
        }
    }
    makeMove(board, turn, choices.get(random.nextInt(choices.size())));
}

谢谢。

2 个答案:

答案 0 :(得分:0)

这很简单:一个完美的玩家必须搜索整个树的最大深度(截止节点除外),但是你的程序仅限于4层!

找到最佳动作是错误的:

int value = alphabeta(board, 3, turn, -10000, 10000);        

将其更改为

int value = alphabeta(board, 8, turn, -10000, 10000);

答案 1 :(得分:0)

除了之前的回答,我很确定你的GetBestMove是错误的:只要一个移动更好或等于你当前最好的移动,你就会添加一个选择。但是,当最佳值发生变化时,您实际上并没有清除列表。这意味着您的选择列表中会有松动的动作。