2014-07-19 8 views
2

현재 체스의 알파 베타 제거 기능을 사용하는 미니 맥스 알고리즘을 작성 중입니다.미니 맥스 알고리즘에서 값을 옮기는 것이 아니라 실제 이동을 얻는 방법

내가 본 모든 예제에서 minimax 알고리즘은 최상의 이동으로 인한 최상의 점수 또는 보드 상태를 나타내는 int 값을 반환합니다.

제 질문은 점수 반환 값과 관련된 최상의 조치를 어떻게 반환 할 수 있습니까? 최소 최대/alphabeta의 내 구현에서 아래 의사 예, 내 alphabeta()에 대한

...

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

, 나는 체스 보드를 나타내며, 조각 표현하는 데에 이동할 수있는 보드 개체가 다른 보드 텍스처/게임 상태.

내 기능 evaluateBoard(Board b)은 보드를 가져 와서 매개 변수 보드의 보드 상태에 대한 값을 계산합니다.

본질적으로 evaluateBoard()는 최상의 이동 값에 대한 alphabeta()의 최종 int 결과 값을 제공합니다. 그러나 evaluateBoard()가 최종 점수를 얻은 이동을 반환하는 방법은 표시되지 않습니다. 점수 값과 조각 정보를 가지고있는 어떤 객체를 돌려 주었다고하더라도, 최종 점수가 가장 높은 트리 상단에있는 정보를 어떻게 얻을 수 있는지 확신 할 수 없습니다.

아무도 내가 가장 좋은 점수 값을 부여하는 최선의 방법에 대한 정보를 액세스/반환 할 수 있다는 것을 알고 있습니까? 미니 맥스 알고리즘에서 핵심 요소가 누락 되었습니까? 아니면 alphabeta()를 다르게 구현해야합니까?

편집 : E4, E5, NF3, nc6 :

예를 들어, 최소 최대 다음 이동에서 최고 점수를 반환 가정 해 봅시다. 내가 가지고있는 것은 이사회 상황의 수치를 반환 할 것입니다. "e4"를 어떻게 반환 할 수 있습니까? E4는 가장 높은 가치를 창출하는 움직임입니다.

감사합니다.

답변

2

미니 맥 알고리즘은 명시 적으로 트리를 사용하지 않아도 가능한 동작 트리를 탐색하여 작동합니다. 따라서 필요한 것은 함수가 가치에 더하여 최상의 움직임을 반환하는 것입니다.

당신은 같은 것을 할 수 있습니다

ScoredMove alphabeta(Board board, String player, Move move) { 
    board.applyMove(move); 
    if (board.gameOver()) 
    { 
    score = board.scoreForPlayer(player); 
    return ScoredMove(score, move); 
    } 

    if (player == "player1") { 
    next_player = "player2"; 
    } else { 
    next_player = "player1"; 
    } 

    ScoredMove best_move = null; 
    for (next_move in board.movesForPlayer(next_player)) { 
    ScoredMove scored = alphabeta(board, next_player, next_move) 
    if (best_move == null || best_move.score < scored.score) { 
     best_move = scored; 
    } 
    } 
    board.removeMove(move); 
    return best_move; 
} 
+0

내 구현은 기술적으로 나무를 사용하지 않습니다. 예를 들어 깊이를 2로 설정 한 경우 : 나는 최대 이동 수를보고 임시 이동 판에서 그 이동을 재생 한 다음 해당 보드를 다음 알파벳 호출로 전달합니다. 다음에 alphabeta를 호출하면 통과 된 보드의 최대 이동에 따라 min의 각 이동이 표시됩니다. 본질적으로 alphabeta에 대한 모든 호출에 대해 나는 이사회에서 이사를하고 앞으로 나아갈 것입니다. ScoredMove (evaluateBoard (board), last_move)에서 전달하려고하는 것이 확실하지 않습니다. 미니 맥스에서 발생하는 최상의 값은 e4, e5, nf3, nc6입니다. e4를 반납하는 방법? – Rohan

+0

나무는 게임이 갈 수있는 다양한 방법입니다. 그래서 당신이 당신의 보드를 통과하고 2 개의 움직임이 있다고 가정 해 봅시다 : e3, e4. 따라서 이사회에 e3 이동을 적용하고 그것에 알파벳을 부릅니다. Alphabeta는 점수와 일부 후속 이동이 포함 된 개체를 반환합니다. 따라서 e3와 점수를 추적하고 e4로 시도하십시오. e4가 "더 좋다"는 것을 알 수 있습니다. 따라서 e3와 점수를 버리고 e4와 그 점수를 반환합니다. e4가 최선의 방법입니다. 말이 돼? – azani

+2

나는 내 대답을 희망 사항으로 더 유용하게 업데이트했다. – azani