Java 在Minimax过程中,我们在哪里分配最佳移动?
我对minimax和alpha-beta剪枝在返回“最佳值”方面的工作有相当的了解。但是,我不确定“最佳行动”应该分配到哪里 我知道,最好的移动需要来自最初传入的棋盘,因为我在寻找一个最大值,它必须分配给最大化的玩家。但是,使用我的当前代码会导致反复重新分配最佳操作。Java 在Minimax过程中,我们在哪里分配最佳移动?,java,artificial-intelligence,tic-tac-toe,minimax,alpha-beta-pruning,Java,Artificial Intelligence,Tic Tac Toe,Minimax,Alpha Beta Pruning,我对minimax和alpha-beta剪枝在返回“最佳值”方面的工作有相当的了解。但是,我不确定“最佳行动”应该分配到哪里 我知道,最好的移动需要来自最初传入的棋盘,因为我在寻找一个最大值,它必须分配给最大化的玩家。但是,使用我的当前代码会导致反复重新分配最佳操作。 e、 g.如果原始板为O--\n--\n--,则最佳操作变为 OX-\n-\n-,然后重新分配给O-X\n-\n-,依此类推 public int minimax(Board board, int depth, boolean m
e、 g.如果原始板为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;
}
public int minimax(电路板、int深度、布尔最大化、int alpha、int beta){
整数最佳值;
if(board.isTerminal()){
最佳值=board.calculateValue();
}else if(最大化){
最佳值=α;
for(操作:board.makePossibleActions()){
int childValue=minimax(board.makeCopy().takeAction(action),depth+1,false,bestValue,beta);
如果(最佳值)
你知道根是一个最大的球员
您还知道深度(0或1,取决于初始调用的方式)
因此,如果max player要播放,则您位于树的根,并且更新max move的值,然后还将该移动存储在类变量中以返回(而不是使用max,测试该值是否更大,然后一起更新max和最佳移动)
你知道根是一个最大的球员
您还知道深度(0或1,取决于初始调用的方式)
因此,如果max player要播放,则您位于树的根,并且更新max move的值,然后还将该移动存储在类变量中以返回(而不是使用max,测试该值是否更大,然后一起更新max和最佳移动)一个实用的minimax算法实现需要一些这些功能,具体取决于游戏的复杂性
1) 董事会的低级别实施,允许快速分析职位并生成有效的移动
2) 一个哈希表,用于输入每个哈希键的评估分数和移动,这在强制移动期间也会有所帮助
3) 一个移动表,用于输入所有以前的移动以及相应的哈希键,以帮助避免重复移动,并帮助撤消和重做移动
4) 由于需要响应GUI用户界面,因此可以在后台实现minimax算法,最好在另一个线程上实现
5) 迭代深化搜索实际上是需要的,因为玩家可能喜欢使用强制移动或改变游戏级别
因此,在评估了最佳移动之后,我更愿意将结果传递给主调用线程。一个实用的minimax算法实现需要一些这些功能,这取决于游戏的复杂性
1) 董事会的低级别实施,允许快速分析职位并生成有效的移动
2) 一个哈希表,用于输入每个哈希键的评估分数和移动,这在强制移动期间也会有所帮助
3) 一个移动表,用于输入所有以前的移动以及相应的哈希键,以帮助避免重复移动,并帮助撤消和重做移动
4) 由于需要响应GUI用户界面,因此可以在后台实现minimax算法,最好在另一个线程上实现
5) 迭代深化搜索实际上是需要的,因为玩家可能喜欢使用强制移动或改变游戏级别
因此,在评估了最佳移动之后,我更愿意将结果传递给主调用线程