我正在尝试使用带有alpha-beta修剪的minimax算法为游戏创建AI播放器。我在尝试正确实施它时遇到了一些麻烦。我有2个函数可以使用,一个用于评估给定玩家的董事会当前状态(返回一些分数)getBoardScore,另一个用于返回由每个可能的移动创建的所有可能的董事会状态(从给定的董事会状态为一个给定的玩家)getPossibleBoards。
我的AI通过最初调用alphaBeta进行移动,将其传递给当前的棋盘状态。然后它从变量'bestBoard'设置一个新的板状态,alphaBeta函数已递归修改。这是我的alphaBeta函数的代码:
static int MAX = -1;
static int MIN = 1;
Board node;
Board bestBoard;
public int alphaBeta(Board node, int depth, int alpha, int beta, int player) {
if (depth == 0 || node.gameFinished()) {
return node.getBoardScore(player);
}
ArrayList<Board> childNodes = node.getPossibleBoards(player); //All valid moves from current the board state
if (player == MAX) {
for (Board currentBoard: childNodes) {
int result = alphaBeta(currentBoard, depth-1, alpha, beta, -player);
if (alpha < result) {
alpha = result;
bestBoard = currentBoard;
}
if (beta <= alpha) {
break; //alpha cut-off
}
}
return alpha;
}
else {
for (Board currentBoard: childNodes) {
int result = alphaBeta(currentBoard, depth-1, alpha, beta, -player);
if (beta > result) {
beta = result;
bestBoard = currentBoard;
}
if (beta <= alpha) {
break; //alpha cut-off
}
}
return beta;
}
}
我的问题是它只是将我的bestBoard变量设置为最后一个查看的板状态(而不是最佳状态)。我似乎无法弄清楚我应该在哪里设置我的bestBoard变量(或者如果我在设置它之前应该有一些条件)。有人能指出我正确的方向吗?感谢
答案 0 :(得分:0)
我认为问题在于,只有当您处于搜索的第一层时才需要保存bestBoard
。