Algorithm 如何从mini-max算法中获取实际移动而不是移动值

Algorithm 如何从mini-max算法中获取实际移动而不是移动值,algorithm,chess,minimax,alpha-beta-pruning,Algorithm,Chess,Minimax,Alpha Beta Pruning,我目前正在为国际象棋编写一个带有alpha-beta修剪的minimax算法 从我所看到的所有示例中,minimax算法将返回一个int值,该值表示最佳移动产生的最佳得分或板状态 我的问题是,我们如何返回与得分返回值相关联的最佳移动 例如,我的alphabeta()在下面的pseudo中 public int alphabeta(int depth, Board b, int alpha, int beta, boolean maxPlayer) { if(depth == 0)

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

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

我的问题是,我们如何返回与得分返回值相关联的最佳移动

例如,我的alphabeta()在下面的pseudo中

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;
    }
}
public int-alphabeta(int-depth,Board b,int-alpha,int-beta,boolean-maxPlayer){
如果(深度==0)
返回评估板(b);
如果(maxPlayer){
对于(max玩家的每个动作){
//在跳板上移动
int eval=alphabeta(深度-1,tempBoard,alpha,beta,false);
alpha=数学最大值(alpha,eval);

如果(betaminimax算法通过探索可能移动的树来工作,即使您没有明确使用树。因此,您的函数只需返回其值之外的最佳移动

您可以这样做:

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;
}
ScoredMove alphabeta(棋盘、弦乐演奏者、移动){
板。应用移动(移动);
if(board.gameOver())
{
分数=棋盘。球员(球员)的分数;
返回得分移动(得分、移动);
}
如果(玩家==“玩家1”){
下一个\u player=“player2”;
}否则{
下一个\u player=“player1”;
}
ScoredMove best_move=null;
用于(下一个棋盘上的移动玩家){
ScoredMove scored=alphabeta(棋盘、下一个棋手、下一个棋盘)
if(最佳移动==null | |最佳移动.score
我的实现在技术上不使用tree。例如,如果我将深度设置为2:我查看max的每个移动,在临时棋盘上播放该移动,并将该棋盘传递给alphabeta的下一次调用。然后,对alphabeta的下一次调用将根据max在已传递的棋盘上的移动查看min的每个移动。基本上是针对对alphabeta我在一个棋盘上玩这个动作,并将其向前移动。我不确定你想用ScoredMove(评估板,最后一个动作)传达什么。假设minimax产生的最佳值是:e4,e5,nf3,nc6。如何返回e4?树是游戏可以进行的不同方式。因此,假设你通过棋盘,有两个移动:e3,e4。因此,你将移动e3应用到棋盘上,并在其上调用alphabeta。alphabeta返回一个包含分数和一些后续移动的对象。因此你跟踪e3和分数,然后尝试e4。你看到e4“更好”。所以你放弃e3和分数,然后返回e4和它的分数,因为e4是最好的移动。这有意义吗?