【发布时间】:2020-03-18 05:09:15
【问题描述】:
从我看到的所有示例中,minimax 算法将返回一个 int 值,该值表示最佳得分或最佳棋局将产生的棋盘状态。如何返回与此分数相关的最佳移动?谢谢
private Integer minimax(Board board, Integer depth, Color current, Boolean maximizingPlayer, Integer maxPlayerBestVal, Integer minPlayerBestVal) {
Integer bestValue;
if (0 == depth)
return ((current == selfColor) ? 1 : -1) * this.evaluateBoard(board, current);
Integer val;
if (maximizingPlayer) {
bestValue = -INF;
for (Move m : board.getPossibleMoves(current)) {
board.apply(m);
val = minimax(board, depth - 1, Boolean.FALSE,
minPlayerBestVal, maxPlayerBestVal); // swap here
bestValue = Math.max(bestValue, val);
board.revert(m);
if (bestValue >= minPlayerBestVal) // too good for the minPlayer
return bestValue; // so cut here (pruning)
}
return bestValue;
} else {
[...] min player
}
}
the evaluate function
private Integer evaluateBoard(Board board, Color player) {
return board.pawns(player) - board.pawns(player.other());
}
【问题讨论】:
-
该方法被递归调用,返回值需要是(或至少包括)此移动的得分(在此实现中)。最简单的方法是将最佳移动保存到全局变量中,并在方法返回分数后检查哪个是最佳移动。
-
所以每次我通过循环我都会改变这个全局移动的值?
-
每次你发现一个比当前最佳移动更好的移动时,你都会更新它。所以最后你有最好的移动存储在全局变量中。
-
如何检查移动是否比上一个更好?感谢您的帮助
-
您可以通过计算返回的分数来查看。如果分数高于当前最好的分数,则移动更好。但是您只需要检查最大化玩家部分。否则你也会针对对手玩家进行优化。