minimax算法返回与alpha beta修剪不同的值
我正在写国际象棋的Minimax算法。
我获得了不同的最终结果值,包括alpha beta修剪和alpha beta修剪的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;
}
}
的Alpha-Beta()
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对象的副本上进行移动,然后将此临时董事会传递给进一步的呼叫。
评估委员会(董事会b)根据董事会情景计算得分。
你的代码中的一个大问题是, alphabeta
不是递归的,因为它应该是。 它叫miniMax
。
alphabeta
的递归调用应该调用alphabeta
,否则它从根本上说是错误的。 也就是说,alpha-beta修剪应用于每个深度级别,而不仅仅是最高级别。
在minMax
函数中,您有bestMoveVal = Math.max(bestMoveVal, eval);
为最小化和最大化的球员。
上一篇: minimax algorithm returning different value with alpha beta pruning