我正在尝试实施negamax算法,这就是我认为应该如此:
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;
}
}
}
相应的negamax函数
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;
}
是的,我知道它不是编译,但我只是想尝试伪代码。
修改
calculateBoardFunction(Board Board)将始终评估电路板的最佳移动计算颜色。
另外,我试图让它变得通用,所以它对每一个游戏(国际象棋,逆转,去)等都是一样的......(但这不是问题的一部分)
我也使用维基百科的negamax伪代码作为例子。但是使用该代码我&gt;&gt;认为&lt;&lt;我可以用正确的启发式值很好地创建游戏树。但我在getBestMove
函数中获得代码的原因是要弄清楚哪些移动实际上是最好的。
但我不确定我是否可以这样做。
答案 0 :(得分:1)
这看起来或多或少是正确的。有一个印刷错误(-sign
而不是-colour
),你需要每次循环克隆板(或使用unmakeMove
,但是你不需要克隆第一名)。但除此之外,逻辑看起来是正确的
在现实世界中,你会想要在尝试之前以某种方式对动作进行排序。从所有beta截止值开始,这可以带来巨大的加速。