【问题标题】:minimax algorithm returning different value with alpha beta pruningminimax 算法通过 alpha beta 剪枝返回不同的值
【发布时间】:2014-09-10 06:09:04
【问题描述】:

我正在为国际象棋编写 Minimax 算法。

对于没有 alpha beta 修剪的 minimax 和带有 alpha beta 修剪的 minimax,我得到了不同的最终结果值。

我的伪代码如下。谁能帮我?

miniMax()

public int miniMax(int depth, Board b, boolean maxPlayer) {
    if(depth == 0)
        return evaluateBoard(b);
    if(maxPlayer) {
        int bestMoveVal = 0;  
        for( each Max player's moves) {
            // make a move on a temp board
            int eval = miniMax(depth - 1, tempBoard, false);
            bestMoveVal = Math.max(bestMoveVal, eval);
        }
        return bestMoveVal;
    }
    else {
        int bestMoveVal = 0; 
        for (each Min player's moves) {
            // make a move on a temp board. 
            int eval = miniMax(depth - 1, tempBoard, true);
            bestMoveVal = Math.max(bestMoveVal, eval);
        }
        return bestMoveVal;
    }
}

alphabeta()

public int alphabeta(int depth, Board b, int alpha, int beta, boolean maxPlayer) {
        if(depth == 0)
            return evaluateBoard(b);
        if(maxPlayer) {
            for(each max player's moves) {
                // make a move on a temp board
                int eval = alphabeta(depth - 1, temp, alpha, beta, false);
                alpha = Math.max(alpha, eval);
                if(beta <= alpha) //beta cut off;
                    break;
            }
            return alpha;
        }
        else {
            for(each of min's moves) {
                // make a move on a temp board
                int eval = alphabeta(depth - 1, temp, alpha, beta, false);
                beta = Math.min(beta, eval);
                if(beta <= alpha)
                    break; // alpha cut off;
            }
            return beta;
        }
    }

Board 代表棋盘。对于每一步,我都会在传递的 Board 对象的副本上进行移动,然后将这个临时 Board 传递给进一步的调用。

evaluateBoard(Board b) 接受一个 Board 并根据给定的 Board 场景计算分数。

【问题讨论】:

  • 在 minimax 中 min 播放器应该调用 min 函数。

标签: algorithm chess minimax alpha-beta-pruning


【解决方案1】:

您的代码中的一个大问题是 alphabeta 不是递归的,因为它应该是。它调用miniMax

alphabeta中的递归调用应该调用alphabeta,否则根本就错了。也就是说,alpha-beta 剪枝作用在每个深度层,而不仅仅是顶层。

minMax 函数中,bestMoveVal = Math.max(bestMoveVal, eval); 用于最小化和最大化播放器。

【讨论】:

    最近更新 更多