我的国际象棋算法是基于 negamax 的。相关部分是:
private double deepEvaluateBoard(Board board, int currentDepth, double alpha, double beta, Move initialMove) {
if (board.isCheckmate() || board.isDraw() || currentDepth <= 0) {
this.moveHistorys.put(initialMove, board.getMoveHistory()); // this is not working
return evaluateBoard(board); // evaluateBoard evaluates from the perspective of color whose turn it is.
} else {
double totalPositionValue = -1e40;
List<Move> allPossibleMoves = board.getAllPossibleMoves();
for (Move move : allPossibleMoves) {
board.makeMove(move);
totalPositionValue = max(-deepEvaluateBoard(board, currentDepth - 1, -beta, -alpha, initialMove), value);
board.unMakeMove(1);
alpha = max(alpha, totalPositionValue);
if (alpha >= beta) {
break;
}
}
return totalPositionValue;
}
}
如果我能够访问 negamax 算法基于其评估的移动序列(在决策树上找到评估值的位置),这将极大地帮助调试。
目前我正在尝试将棋盘的移动历史保存到作为封闭类字段的哈希图中。但是,由于某种原因,它不起作用,因为产生的移动序列不是最佳的。
由于对 negamax 的直觉并不是很容易,所以我已经把头撞到墙上已经有一段时间了。如果有人能指出我正确的方向,我将不胜感激!