我目前正在为国际象棋编写一个带有 alpha beta 剪枝的极小极大算法。
从我见过的所有示例中,极小极大算法将返回一个 int 值,该值表示最佳得分或最佳移动所产生的棋盘状态。
我的问题是我们如何返回与分数返回值相关的最佳动作?
例如,下面的伪字母表()...
public int alphabeta(int depth, Board b, int alpha, int beta, boolean maxPlayer) {
if(depth == 0)
return evaluateBoard(b);
if(maxPlayer) {
for(each of max player's moves) {
// make move on a tempBoard
int eval = alphabeta(depth - 1, tempBoard, alpha, beta, false);
alpha = Math.max(alpha, eval);
if(beta <= alpha)
break;
}
return alpha;
}
else {
for(each of min's moves) {
// make move on a tempBoard
int eval = alphabeta(depth - 1, tempBoard, alpha, beta, true);
beta = Math.min(beta, eval);
if(beta <= alpha)
break;
}
return beta;
}
}
在我的 minimax / Alphabeta 实现中,我有一个代表棋盘的 Board 对象,棋子可以在其上移动以代表不同的棋盘纹理/游戏状态。
我的功能evaluateBoard(Board b)
接收 Board 并计算参数 Board 的板状态值。
本质上,evaluateBoard() 为我提供了 Alphabeta() 的最终 int 结果值,作为最佳移动的值。然而,我没有看到evaluateBoard()返回导致最终得分的移动的方法。即使我要返回一些包含分数值和棋子信息的对象,我也不确定如何才能获得树顶部给我最终最佳分数的棋子的信息。
有谁知道我如何访问/返回给出最佳得分值的最佳动作的信息?
我是否缺少最小最大算法中的关键元素和/或我是否必须以不同的方式实现alphabeta()?
EDIT:
例如,假设 minimax 返回以下动作的最佳分数:
e4、e5、nf3、nc6。我所拥有的将返回棋盘情况的数值。我怎样才能返回“e4”? E4 是产生最高值的棋步。
Thanks.