Является ли эта реализация алгоритма Negamax правильной

Я пытаюсь реализовать алгоритм 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 из Википедии. Но используя этот код, я думаю, что<< я мог бы очень хорошо создать дерево игры с правильными значениями эвристики. но причина у меня есть код в getBestMove функция, чтобы выяснить, какой ход на самом деле лучше.

Но я не уверен, смогу ли я это сделать.

1 ответ

Решение

Это выглядит более или менее правильно. Есть опечатка (-sign вместо -colour), и вам нужно каждый раз клонировать доску через цикл (или использовать unmakeMove, но тогда вам не нужен клон в первую очередь). Но кроме этого логика выглядит правильно.
В реальном мире вы бы хотели как-то отсортировать ходы, прежде чем испытывать их. Это может привести к огромному ускорению от всех бета-отсечек.

Другие вопросы по тегам