Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Minimax过程中,我们在哪里分配最佳移动?_Java_Artificial Intelligence_Tic Tac Toe_Minimax_Alpha Beta Pruning - Fatal编程技术网

Java 在Minimax过程中,我们在哪里分配最佳移动?

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

我对minimax和alpha-beta剪枝在返回“最佳值”方面的工作有相当的了解。但是,我不确定“最佳行动”应该分配到哪里

我知道,最好的移动需要来自最初传入的棋盘,因为我在寻找一个最大值,它必须分配给最大化的玩家。但是,使用我的当前代码会导致反复重新分配最佳操作。
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) 迭代深化搜索实际上是需要的,因为玩家可能喜欢使用强制移动或改变游戏级别

    因此,在评估了最佳移动之后,我更愿意将结果传递给主调用线程