如何获得实际移动而不是从mini max算法移动值

时间:2014-07-19 03:40:01

标签: algorithm chess minimax alpha-beta-pruning

我目前正在为国际象棋编写一个带有alpha beta修剪的minimax算法。

从我看到的所有示例中,minimax算法将返回一个int值,该值表示最佳得分或最佳移动所导致的棋盘状态。

我的问题是我们如何才能返回与分数回报值相关的最佳动作?

例如,我的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;
    }
}

在我的minimax / alphabeta的实现中,我有一个Board对象代表棋盘,棋子可以移动它来代表不同的棋盘纹理/游戏状态。

我的函数evaluateBoard(Board b)接收一个Board并计算参数Board的电路板状态值。

本质上,evaluateBoard()为我提供了最佳移动值的alphabeta()的最终int结果值。但是我没有看到evaluateBoard()返回导致最终得分的移动的方法。即使我要返回一些持有分数值和片段信息的Object,我也不确定如何获得树顶部的片段信息,这给了我最终的最佳分数。

有谁知道如何获取/返回最佳得分值的最佳动作信息? 我是否错过了mini max算法中的关键元素和/或我是否必须以不同方式实现alphabeta()?

编辑:

例如,让我们说minimax从以下动作返回最佳分数: e4,e5,nf3,nc6。我所拥有的将返回董事会情况的数值。我怎样才能返回&#34; e4&#34; ? E4是导致最高价值的举动。

感谢。

1 个答案:

答案 0 :(得分:2)

minimax算法通过探索可能的移动树来工作,即使您没有明确使用树。所以所需要的只是让你的函数除了它的值之外还返回最佳移动。

您可以这样做:

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;
}