В настоящее время я пишу минимаксный алгоритм с альфа-бета-обрезкой для шахмат.
Из всех примеров, которые я видел, минимаксный алгоритм вернет значение int, которое представляет лучший результат или состояние доски, полученное в результате наилучшего хода.
Мой вопрос: как мы можем вернуть лучший ход, связанный с возвращаемым значением счета?
Например, моя alpha() в псевдониме ниже...
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;
}
}
В моей реализации минимакса/алфавита у меня есть объект Board, который представляет шахматную доску, и фигуры могут перемещаться по ней, чтобы представлять различные текстуры доски/состояния игры.
Моя функция evaluateBoard(Board b)
принимает плату и вычисляет значение параметра Board для состояния платы.
По сути, оценкаBoard() дает мне окончательное значение int-результата alpha() для значения лучшего хода. Однако я не вижу способа для оценкиBoard() вернуть ход, который привел к окончательному счету. Даже если бы я вернул некоторый объект, содержащий значение очков и информацию о фигурах, я не знаю, как я мог бы получить информацию о фигуре на вершине дерева, которая дала мне окончательный лучший результат.
Кто-нибудь знает, как я могу получить доступ/вернуть информацию о лучшем ходе, который дает наилучшее значение очков? Мне не хватает ключевого элемента в алгоритме мини-макс и/или мне нужно реализовать alpha() по-другому?
ИЗМЕНИТЬ:
Например, предположим, что минимакс возвращает лучший результат для следующих ходов: e4, e5, nf3, nc6. То, что у меня есть, вернет числовое значение ситуации на доске. Как я могу вернуть "e4"? E4 — это ход, который приводит к наибольшему значению.
Спасибо.