我正在尝试实现负最大值算法,这就是我认为它应该是这样的:
public Move getBestMove(Board board){
List<Move> possibleMoves = board.getPossibleMoves();
Move optimalMove;
int maxScore;
foreach(Move move in possibleMoves){
Board newBoard = board.clone();
newBoard.makeMove(move);
int score = negamax(newBoard, DEPTH, Integer.MAX, Integer.MIN, 1);
if (score > maxScore){
optimalMove = move;
maxScore = score;
}
}
}
以及相应的负最大值函数
public int negamax(Board board, int depth, int alpha, int beta, int sign){
if(depth == null || board.getPossibleMovesNumber(colour) == 0){
return calculateBoardFunction(board);
}
else{
List<Move> possibleMoves = board.getPossibleMoves();
foreach(Move move in possibleMoves){
Board newBoard = board.clone();
newBoard.makeMove(move);
alpha = Math.max(alpha, -negamax(newBoard, depth-1, -beta, -alpha, -sign);
if(alpha >= beta){
break;
}
}
return alpha;
}
是的,我知道它不是在编译,但我只是想对它进行一些伪编码。
编辑
计算板功能(板板)将始终评估板以计算最佳移动的颜色。
此外,我试图使它通用,因此它对每场比赛(国际象棋、逆转、围棋)等都是一样的......(但这不是问题的一部分)
我也用维基百科的negamax伪代码作为例子。但是使用该代码我>>认为<<我可以很好地创建游戏树,具有正确的启发式值。但我在getBestMove
函数中有代码的原因是弄清楚什么动作实际上是最好的。
但我不确定我是否可以做到这一点。
这看起来或多或少是正确的。有一个印刷错误(-sign
而不是-colour
),你需要每次通过循环克隆板(或使用unmakeMove
,但你首先不需要克隆)。但除此之外,逻辑看起来是正确的。
在现实世界中,您可能希望在尝试之前以某种方式对动作进行排序。这可能会导致所有 beta 截止值的巨大加速。