【发布时间】: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