我在做一个学校项目,需要编写一个由AI控制的Alpha-Beta算法,但我的算法表现得非常不一致。有时候它能成功阻挡我的所有移动,有时候却会忽略我的三连线,如这里所示。为什么会发生这种情况?我该如何解决这个问题?
int alphaBeta(const State board, int alpha, int beta, const Player player, int depth){ //Max player = Player::O //Min player = Player::X std::vector<Move> possibleMoves = getMoves(board); if(eval(board)==Player::X){return 9999-depth;} //Player X wins else if(eval(board)==Player::O){return -9999+depth;} //Player O wins else if(possibleMoves.size()==0){return 0;} //Tie else{ //Zoek verder depth++; State nextBoard = board; int result; if(player==Player::O){ for (Move move: possibleMoves) { nextBoard = doMove(nextBoard, move); result = alphaBeta(nextBoard, alpha, beta, Player::X, depth); if (result > alpha){ alpha = result; if (depth == 1){ choice = move; //The actual move he will do } } else if (alpha >= beta){ return alpha; } } return alpha; } else{ for (Move move: possibleMoves) { nextBoard = doMove(nextBoard, move); result = alphaBeta(nextBoard, alpha, beta, Player::O, depth); if (result < beta){ beta = result; if (depth == 1){ choice = move; } } else if (beta <= alpha){ return beta; } } return beta; } }}
回答:
你反复修改nextBoard
,向其中添加了(可能是非法的)移动:
nextBoard = doMove(nextBoard, move);
但你应该在原始棋盘上依次尝试每个移动:
State nextBoard = doMove(board, move);
(免责声明:可能还存在其他问题。)