【发布时间】:2019-11-22 16:51:34
【问题描述】:
我对 minimax 和 alpha beta 修剪在返回“最佳价值”方面的工作方式有很好的理解。但是我不确定应该在哪里分配“最佳移动”。
我知道最好的移动需要来自传入的原始棋盘,并且由于我正在寻找最大值,因此必须在最大化玩家下分配它。但是,使用我当前的代码会导致一次又一次地重新分配最佳操作。
例如如果原来的棋盘是O--\n---\n---,那么最好的动作就变成了
OX-\n---\n---,然后重新分配给O-X\n---\n---等等。
public int minimax(Board board, int depth, boolean maximizing,int alpha,int beta) {
int bestValue;
if (board.isTerminal()) {
bestValue = board.calculateValue();
} else if (maximizing) {
bestValue = alpha;
for (Action action : board.makePossibleActions()) {
int childValue = minimax(board.makeCopy().takeAction(action),depth+1,false,bestValue,beta);
if (bestValue <= childValue) {
bestValue = childValue;
if (board.equals(originalBoard)) {
bestAction = action;
}
}
bestValue = Math.max(bestValue,childValue);
if (beta <= bestValue) {
break;
}
}
} else {
bestValue = beta;
for (Action action : board.makePossibleActions()) {
int childValue = minimax(board.makeCopy().takeAction(action),depth+1,true,alpha,bestValue);
bestValue = Math.min(bestValue,childValue);
if (bestValue <= alpha) {
break;
}
}
}
return bestValue;
}
【问题讨论】:
标签: java artificial-intelligence tic-tac-toe minimax alpha-beta-pruning