2014-07-19 7 views
0

체스 용 미니 맥스 알고리즘을 쓰고 있습니다.알파 베타 프 루닝으로 다른 값을 반환하는 미니 맥스 알고리듬

알파 베타 제거 및 알파 베타 제거와 함께 미니 맥스에 대한 다른 최종 결과 값을 얻습니다.

내 의사 코드는 다음과 같습니다. 누구든지 나를 도울 수 있습니까?

최소 최대()

public int miniMax(int depth, Board b, boolean maxPlayer) { 
    if(depth == 0) 
     return evaluateBoard(b); 
    if(maxPlayer) { 
     int bestMoveVal = 0; 
     for(each Max player's moves) { 
      // make a move on a temp board 
      int eval = miniMax(depth - 1, tempBoard, false); 
      bestMoveVal = Math.max(bestMoveVal, eval); 
     } 
     return bestMoveVal; 
    } 
    else { 
     int bestMoveVal = 0; 
     for (each Min player's moves) { 
      // make a move on a temp board. 
      int eval = miniMax(depth - 1, tempBoard, true); 
      bestMoveVal = Math.max(bestMoveVal, eval); 
     } 
     return bestMoveVal; 
    } 
} 

alphabeta()는

public int alphabeta(int depth, Board b, int alpha, int beta, boolean maxPlayer) { 
     if(depth == 0) 
      return evaluateBoard(b); 
     if(maxPlayer) { 
      for(each max player's moves) { 
       // make a move on a temp board 
       int eval = alphabeta(depth - 1, temp, alpha, beta, false); 
       alpha = Math.max(alpha, eval); 
       if(beta <= alpha) //beta cut off; 
        break; 
      } 
      return alpha; 
     } 
     else { 
      for(each of min's moves) { 
       // make a move on a temp board 
       int eval = alphabeta(depth - 1, temp, alpha, beta, false); 
       beta = Math.min(beta, eval); 
       if(beta <= alpha) 
        break; // alpha cut off; 
      } 
      return beta; 
     } 
    } 

보드 상기 기판을 나타낸다. 모든 이동에 대해, 나는 전달 된 Board 객체의 복사본을 이동 한 다음이 임시 보드를 추가 호출에 전달합니다.

evaluateBoard (Board b)는 보드를 가져 와서 주어진 보드 시나리오를 기반으로 점수를 계산합니다.

+0

미니 플레이어는 min 기능을 호출해야합니다. – perreal

답변

1

코드에서 큰 문제는 alphabeta이 재귀 적으로 발생하지 않기 때문입니다. 전화는 miniMax입니다.

alphabeta에있는 재귀 호출은 alphabeta으로 전화해야합니다. 그렇지 않으면 근본적으로 잘못되었습니다. 즉, 최상위 수준뿐만 아니라 각 깊이 수준에서 알파 베타 제거가 적용됩니다.

minMax 함수에는 플레이어를 최소화하고 최대화하기 위해 bestMoveVal = Math.max(bestMoveVal, eval);이 있습니다.