golang

Русские шашки: реализация минимакса с альфа-бета отсечением в Golang

  • четверг, 18 мая 2023 г. в 00:00:18
https://habr.com/ru/articles/735776/

Серия статей про создание AI для игры в русские шашки:

  1. Русские шашки: эффективная генерация ходов в Golang

  2. Русские шашки: представление доски с помощью двух uint64

  3. Русские шашки: реализация минимакса с альфа-бета отсечением в Golang

В предыдущих записях блога мы обсудили, как эффективно генерировать ходы и представлять шашечную доску в Golang. Теперь мы углубимся в сердце нашей игры в шашки: ИИ, который принимает решения. ИИ будет использовать алгоритм Minimax с Alpha-Beta отсечением, популярный метод принятия решений в настольных играх.

Алгоритм Минимакс

Алгоритм Minimax - это рекурсивный алгоритм принятия решений, используемый в играх для двух игроков с совершенной информацией. Он предполагает, что оба игрока играют оптимально, и пытается минимизировать максимальные потери, с которыми может столкнуться игрок. Алгоритм исследует все возможные состояния игры до определенной глубины и присваивает каждому состоянию оценку. Затем он выбирает ход, который приводит к наилучшему возможному исходу для игрока, учитывая, что противник также играет оптимально.

Альфа-бета отсечение

Альфа-бета отсечение - это метод оптимизации, который значительно сокращает количество узлов, оцениваемых алгоритмом Минимакс. Это происходит за счет пропуска ветвей в дереве игры, которые не будут способствовать принятию окончательного решения. Такое отсечение позволяет алгоритму глубже исследовать дерево игры, улучшая способность ИИ принимать решения без увеличения времени поиска.

Структура Minimax

Структура Minimax - это ядро нашего ИИ, которое включает в себя не только логику игры, но и некоторую статистику и кэширование для оптимизации производительности. Ключевыми полями в этой структуре являются:

  • MaxDepth: Предел глубины для алгоритма Minimax. Он определяет, на сколько ходов вперед будет рассчитывать ИИ.

  • Net: Нейронная сеть, используемая для оценки состояния доски.

  • Cache: Кэш, в котором хранятся ранее оцененные состояния, чтобы избежать лишних вычислений.

  • DB: База данных эндшпиля, которая содержит предварительно вычисленные оптимальные ходы для всех возможных эндшпильных позиций.

Дополнительные поля для статистики и внутреннего использования

Структура Minimax также содержит дополнительные поля для внутреннего использования и отслеживания статистики:

  • nodes: массив float64, используемый для оценки нейронной сети.

  • Evaluated: Количество позиций доски, оцененных нейронной сетью.

  • CutOffs: Количество ветвей, обрезанных с помощью альфа-бета отсечения.

  • CacheHits: Количество обращений к кэшу во время поиска.

  • DBHits: Количество обращений к базе данных эндшпиля во время поиска.

Эти поля помогают анализировать производительность алгоритма Minimax и его оптимизаций.

Реализация алгоритма Minimax

Функция Minimax воплощает ядро алгоритма, принимая в качестве входных данных состояние доски, глубину поиска и значения альфа-бета. Она проверяет наличие конечных состояний игры (выигрыш, проигрыш, ничья) и базовых случаев рекурсии (глубина достигает 0 или больше нет ходов захвата). Затем он итеративно перебирает все возможные ходы, обновляя значение альфа или бета соответственно, и обрезает ветви, если альфа больше или равна бета.

Лучшие ходы

Функции BestMove и BestRandomMove - это то место, где ИИ делает свой ход. Обе функции генерируют все возможные ходы, проверяют, закончилась ли игра, а затем используют функцию Minimax для поиска лучшего хода.

Разница между этими двумя функциями заключается в выборе следующего хода:

  • BestMove выбирает ход с наибольшим (для белых) или наименьшим (для черных) счетом в качестве лучшего хода.

  • В BestRandomMove используется взвешенный случайный выбор, где веса рассчитываются на основе оценки функции Minimax. Это может быть использовано для добавления некоторой непредсказуемости в игру ИИ.

Кэширование и статистика

Кэширование является важной оптимизацией производительности алгоритма Minimax. Сохраняя счет ранее оцененных позиций доски в поле Cache, мы можем избежать лишних вычислений и значительно ускорить поиск.

Представление баллов и байтов

Для представления оценки используется структура Score. Она содержит Rate, которая является оценкой доски, и Steps, указывающую количество ходов, необходимых для достижения оцененной позиции.

Со структурой Score связан интересный метод Byte. Этот метод преобразует оценку и шаги в один байт. Старший бит байта представляет оценку (1 для победы, 0 для поражения, и оба для ничьей), а остальные биты представляют шаги. Это компактное представление удобно для хранения и поиска.

База данных эндшпилей (БД)

В шашках эндшпиль может быть очень сложным, с множеством возможных исходов. Поэтому мы используем базу данных эндшпиля (DB), которая содержит предварительно вычисленные оптимальные ходы для всех возможных позиций эндшпиля. Найдя текущее состояние доски в этой базе данных, мы можем быстро определить лучший ход без необходимости искать его в дереве игры. Это значительно ускоряет процесс принятия решений ИИ.

Функция Minimax использует DB, если она не равна nil и текущее состояние доски находится в базе данных. Количество успешных поисков отслеживается в поле DBHits структуры Minimax.

Очистка статистики

Метод ClearStats используется для сброса всех статистических полей в структуре Minimax. Его можно использовать перед началом нового поиска, чтобы убедиться, что статистика точно отражает производительность алгоритма для текущего состояния игры.

Выводы

Реализация алгоритма Minimax с Alpha-Beta отсечением в Golang, как показано в этой статье блога, закладывает прочный фундамент для интеллектуального ИИ для русских шашек. Используя эффективную генерацию ходов, компактное представление доски, кэширование очков и базу данных эндшпилей, мы можем оптимизировать работу ИИ и гарантировать, что он играет в игру оптимально.

В следующих статьях блога мы более подробно рассмотрим роль нейронной сети в оценке состояния доски и то, как обучить эту сеть с помощью обучения с подкреплением. Оставайтесь с нами!