这种negamax算法的实现是否正确

时间:2011-05-20 10:51:38

标签: algorithm correctness minimax

我正在尝试实施negamax算法,这就是我认为应该如此:

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

相应的negamax函数

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

是的,我知道它不是编译,但我只是想尝试伪代码。

修改

calculateBoardFunction(Board Board)将始终评估电路板的最佳移动计算颜色。

另外,我试图让它变得通用,所以它对每一个游戏(国际象棋,逆转,去)等都是一样的......(但这不是问题的一部分)

我也使用维基百科的negamax伪代码作为例子。但是使用该代码我&gt;&gt;认为&lt;&lt;我可以用正确的启发式值很好地创建游戏树。但我在getBestMove函数中获得代码的原因是要弄清楚哪些移动实际上是最好的。

但我不确定我是否可以这样做。

1 个答案:

答案 0 :(得分:1)

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