2017-05-10 9 views
0

私はMinimaxを実装しようとしています(アルファベットのプルーニングを使用しています)。 「currentBoardは」makeMoveとremoveFigureの両方が新しいボードを返すにもかかわらず。Minimax:バックトラックのためのボードのコピーを保存する

それでは、どのように私は正しいバックトラッキングのために古いボードを「保存」することができ、最初のボードが、評価された葉からのものではありません?

Psの:ボードが単純なハッシュマップなので、移動を元に戻す代わりにコピーを使用したいので、このように簡単にできると思います。

ここに

public int alphaBeta(Board currentBoard, int depth, int alpha, int beta, boolean maximisingPlayer) { 
    int score; 
    if (depth == 0) { 
     return Evaluator.evaluateLeaf(whichColorAmI, currentBoard); 
    } 
    else if (maximisingPlayer) { 
     ArrayList<Move> possibleMoves= new ArrayList<Move>(); 
     possibleMoves=getPossibleMoves(whichColorAmI, currentBoard); 
     for (Move iterMoveForMe : possibleMoves) { 
      if(currentBoard.figureAt(iterMoveForMe.to)!=null){ 
       currentBoard = currentBoard.removeFigure(iterMoveForMe.to); 
      } 
      currentBoard= currentBoard.moveFigure(iterMoveForMe.from, iterMoveForMe.to); 
      score = alphaBeta(currentBoard, depth-1, alpha, beta, false); 
      if(score>=alpha){ 
       alpha=score; 
       if(depth==initialDepth){ 
        moveToMake=iterMoveForMe; 
       } 
      } 
      if (alpha>=beta) { 
       break; 
      } 
     } 
     return alpha; 
    } 
    else {[Minimizer...] 

}

+0

チェスのためのAIを書くときに私は同じ問題を抱えていました。私の解決策が正しいかどうかはわかりませんが、私はボードの要素の守備的なコピーを作成しました。 –

答えて

0

私はこれを行う方法を見つけたと思う:私は今のところ持っているコードです。少なくともそれはうまくいくようです。これらのキーは、forループの直後にコピーを作成し、このコピーをcurrentBoardではなく後で使用して、ループのcurrentBoardが決して変更されないようにすることです。

public int alphaBeta(Board currentBoard, int depth, int alpha, int beta, boolean maximisingPlayer) { 
    Display dis = new ConsoleDisplay(); 

    int score; 
    if (depth == 0) { 
     int evaluatedScore = Evaluator.evaluateLeaf(whichColorAmI, currentBoard); 
     return evaluatedScore; 
    } 
    else if (maximisingPlayer) { 
     ArrayList<Move> possibleMoves= new ArrayList<Move>(); 
     possibleMoves=getPossibleMoves(whichColorAmI, currentBoard); 
     for (Move iterMoveForMe : possibleMoves) { 
      Board copy = new Board(currentBoard.height, currentBoard.width,currentBoard.figures()); 
      if(copy.figureAt(iterMoveForMe.to)!=null){ 
       copy = currentBoard.removeFigure(iterMoveForMe.to); 
      } 
       copy= copy.moveFigure(iterMoveForMe.from, iterMoveForMe.to); 
      score = alphaBeta(copy, depth-1, alpha, beta, false); 

      if(score>=alpha){ 
       alpha=score; 
       if(depth==maxDepth){ 
        moveToMake=iterMoveForMe; 
       } 
      } 
      if (alpha>=beta) { 
        break; 
      } 
     } 
     return alpha; 
    } 
    else { 
関連する問題