负最大值算法的这种实现是否正确



我正在尝试实现负最大值算法,这就是我认为它应该是这样的:

public Move getBestMove(Board board){
 List<Move> possibleMoves = board.getPossibleMoves();
 Move optimalMove;
 int maxScore;
 foreach(Move move in possibleMoves){
  Board newBoard = board.clone();
  newBoard.makeMove(move);
  int score = negamax(newBoard, DEPTH, Integer.MAX, Integer.MIN, 1);
  if (score > maxScore){
    optimalMove = move;
    maxScore = score;
  }
 }
}

以及相应的负最大值函数

public int negamax(Board board, int depth, int alpha, int beta, int sign){
 if(depth == null || board.getPossibleMovesNumber(colour) == 0){
  return calculateBoardFunction(board);
 }
 else{
  List<Move> possibleMoves = board.getPossibleMoves();
  foreach(Move move in possibleMoves){
   Board newBoard = board.clone();
   newBoard.makeMove(move);
   alpha = Math.max(alpha, -negamax(newBoard, depth-1, -beta, -alpha, -sign);
   if(alpha >= beta){
     break;
   }
  }
 return alpha;
}

是的,我知道它不是在编译,但我只是想对它进行一些伪编码。

编辑

计算板功能(板板)将始终评估板以计算最佳移动的颜色。

此外,我试图使它通用,因此它对每场比赛(国际象棋、逆转、围棋)等都是一样的......(但这不是问题的一部分)

我也用维基百科的negamax伪代码作为例子。但是使用该代码我>>认为<<我可以很好地创建游戏树,具有正确的启发式值。但我在getBestMove函数中有代码的原因是弄清楚什么动作实际上是最好的。

但我不确定我是否可以做到这一点。

这看起来或多或少是正确的。有一个印刷错误(-sign而不是-colour),你需要每次通过循环克隆板(或使用unmakeMove,但你首先不需要克隆)。但除此之外,逻辑看起来是正确的。
在现实世界中,您可能希望在尝试之前以某种方式对动作进行排序。这可能会导致所有 beta 截止值的巨大加速。

相关内容

  • 没有找到相关文章

最新更新