1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mcpocket-MiniAlphago

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Игра в黑白棋 - MiniAlphago

Введение

Обзор

В 2016 году AlphaGo победил ведущего шахматиста Ли Се-Джона, а в 2017 году AlphaGo одержал победу над чемпионом мира Ким И-Су, что привлекло внимание к искусственному интеллекту в шахматах. Однако, AlphaGo, основанный на надзорном обучении, имитирует поведение ведущих шахматистов, и его суть заключается в подражании человеческому стилю игры. В то же время, новое поколение AlphaGo, основанное на усилении обучения и безнадзорном обучении, использует другой подход, начиная с нуля и не изучая исторические партии людей, а вместо этого проводя самоигры и оптимизацию. Новое поколение AlphaGo получило кодовое имя AlphaGo Zero, которое одержало победу над AlphaGo Master со счетом 100-0.

Процесс обучения AlphaGo Zero включает следующие шаги:

  1. Проведение множества самоигр, каждый ход с 1600 повторений MCTS (Монте-Карло дерева поиска).
  2. По мере развития самоигр, выбор 2048 позиций ходов из последних 500 000 игр и результатов этих игр.
  3. Использование MCTS для поиска вперед и оценки ходов, обучение нейронной сети.
  4. Повторение шагов 3 и 4 каждые 1000 раз, оценка текущей нейронной сети по сравнению с лучшей версией в прошлом; если процент побед превышает 55%, использовать новую нейронную сеть для создания игры и отбросить предыдущую версию.
  5. Повторение вышеупомянутых шагов 700 000 раз, чтобы достичь конечного результата.### Основные технологии

AlphaGo Zero использует технологии, которые в сущности имитируют поведение MCTS (Монте-Карло дерева поиска) с помощью нейронной сети. Однако, MCTS не всегда находит оптимальное решение, поэтому нейронная сеть должна имитировать MCTS 700 000 раз, чтобы найти "оптимальную нейронную сеть", которая была бы обучена MCTS, и отбросить худшие случаи, найденные MCTS, и искать оптимальные ходы.

Поскольку пространство состояний в шахматах огромно, чистый алгоритм поиска не может достичь хорошего результата без огромных затрат. Поэтому AlphaGo использует методы с меньшими затратами, такие как нейронные сети, чтобы обучаться знаниям, полученным из MCTS.

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

Введение в проект

На основе AlphaGo изучается применение алгоритмов поиска в играх. Как было упомянуто выше, пространство состояний в шахматах огромно, и поэтому требуется использование нейронных сетей для обучения знаниям, полученным из алгоритмов поиска, и имитации поведения этих алгоритмов. В играх с меньшим пространством состояний можно напрямую использовать алгоритмы поиска для обучения.В данном проекте выбрана игра黑白棋 (также известная как Reversi), которая имеет доску размером 8x8 и относительно небольшое пространство состояний, что позволяет эффективно использовать алгоритмы поиска для реализации ИИ. В проекте реализованы три алгоритма поиска для игры Reversi: Монте-Карло дерево поиска (MCTS), алгоритм Alpha-Beta среза и алгоритм жадного поиска.

Задачи

  1. Использование Pygame для создания графического интерфейса для игры с человеком.
  2. Реализация алгоритма Монте-Карло дерево поиска (MCTS).
  3. Реализация алгоритма Alpha-Beta среза.
  4. Реализация алгоритма жадного поиска.

Основная среда

  1. Anaconda + Python 3
  2. Pygame

Принципы работы

Монте-Карло дерево поиска (MCTS)

Входные данные

Входными данными для алгоритма являются текущее состояние доски (фигуры, которые уже находятся на доске).

Цикл алгоритма

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

Выбор

Выбор осуществляется с помощью функции ucb1, которая реализует поиск максимума и минимума. AI выбирает максимальное значение, а противник — минимальное.

Расширение

На основе выбранного пути, находим последний узел дерева поиска и добавляем все возможные следующие ходы в дерево поиска.##### Симуляция

AI и виртуальный противник случайным образом делают ходы, играя друг против друга, до окончания игры.

Обратное распространение

На основе результата симуляции обновляются значения награды для каждого узла выбранного пути дерева поиска. Если AI выигрывает, награда увеличивается на 1, в противном случае уменьшается на 1.

Выходные данные

После нескольких циклов алгоритм выбирает ход с максимальной наградой и выводит координаты этого хода.

Алгоритм Alpha-Beta среза

Поиск максимума и минимума

Алгоритм Alpha-Beta среза также использует поиск максимума и минимума. AI выбирает максимальное значение награды для своих узлов, а виртуальный противник — минимальное значение для своих узлов.

Значение Alpha и Beta

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

Срез Alpha

Для узлов Max, если Beta значение для подузлов меньше текущего Alpha значения узла, расширение этих подузлов не требуется.

Оптимизация с помощью обрезки BetaМинимальные узлы, у которых значения Alpha их дочерних узлов не вносят вклад в улучшение обратного отсчёта, не требуют расширения других дочерних узлов. Поэтому расширение узлов с Alpha значением, превышающим текущее значение Beta узла, не требуется.#### Рекурсивная реализация

Узлы Max имеют значения Alpha, а узлы Min имеют значения Beta, которые фактически получены от их дочерних узлов. Значения дочерних узлов наследуются от внучатых узлов, а истинные значения награды (Reward) получены из конечных состояний игры, достигших максимальной глубины поиска или из конечных результатов игры. Таким образом, поиск в дереве игры представляет собой метод проб и ошибок, который идеально подходит для реализации с помощью рекурсивного алгоритма.

Методы оценки положения в игре

В игре переворачивающейся шашки, постановка фишек на различных позициях доски может привести к различным наградам. Например, постановка фишек в четырех углах доски явно приносит большую награду. Поскольку поиск всех возможных положений игры занимает слишком много времени, мы можем выполнять поиск только до определенной глубины. Если игра не завершена, награда должна быть определена на основе текущего положения игры.

На основе опыта игры в переворачивающуюся шашку, наградные веса для каждого возможного хода определены вручную:

weight = [
    [70, -20, 20, 20, 20, 20, -15, 70], 
    [-20, -30, 5, 5, 5, 5, -30, -15], 
    [20, 5, 1, 1, 1, 1, 5, 20],
    [20, 5, 1, 1, 1, 1, 5, 20],
    [20, 5, 1, 1, 1, 1, 5, 20],
    [20, 5, 1, 1, 1, 1, 5, 20],
    [-20, -30, 5, 5, 5, 5, -30, -15],
    [70, -15, 20, 20, 20, 20, -15, 70]
]

Алгоритм жадного поискаАлгоритм жадного поиска довольно прост: на каждом шаге выбирается ход, который позволяет перевернуть наибольшее количество фишек противника. Если углы доски доступны для хода, то они предпочтительны (опыт игры в переворачивающуюся шашку показывает, что контроль углов доски дает значительное преимущество).## Описание архитектуры кода

Доска и интерфейс игры

В соответствии с правилами переворачивающейся шашки, доска и интерфейс игры реализованы с использованием библиотеки pygame. Файл main.py содержит основной код. Для запуска игры достаточно запустить main.py.

Правила игры, методы завершения игры и определения ходов реализованы в файле util.py.

Поиск дерева Монте-Карло

Методы поиска дерева Монте-Карло реализованы в классе MCTS_Player, определенном в файле MCTS.py:

class MCTS_Player():

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

В классе определены максимальное время обработки и максимальное количество циклов (количество симуляций), которые могут быть настроены через командную строку при запуске игры. Если достигнуто максимальное количество циклов или максимальное время обработки, AI прекращает обработку.

Альфа-Бета обрезка поиска

В файле AlphaBeta.py определен класс для реализации алгоритма Альфа-Бета обрезки:

class Alphabeta_Player():

Реализует игру в переворачивающуюся шашку с использованием алгоритма Альфа-Бета обрезки, выводит время обработки.

В классе задана максимальная глубина поиска, которую можно установить с помощью командной строки при начале игры.### Жадный алгоритм

В файле greedy.py определен класс для реализации жадного алгоритма:

class greedy_player():

Реализует игру в黑白棋 с использованием жадного алгоритма, выводит время обработки.

Общие входные и выходные данные

Классы всех трех алгоритмов имеют унифицированный интерфейс для ввода текущего состояния доски и вывода выбранного хода. В каждом классе определена функция с одинаковым названием и параметрами:

def NextPosition(self, board):

В файле main.py при выборе различных алгоритмов создается соответствующий объект AI, который затем вызывает эту функцию.

ai_pos = ai.NextPosition(board)

Заключение

Если упорядочить силу трех AI, то, по моему мнению, это будет выглядеть так:

MCTS (время обработки 2 секунды) > Альфа-Бета обрезка поиска (глубина поиска 6) > Жадный алгоритм

После тестирования несколькими людьми, MCTS и Альфа-Бета обрезка поиска показали хорошие результаты. То есть, вероятность победы AI над человеком (конечно, новичками) обычно превышает 50%. При этом, если время обработки MCTS составляет 5 секунд, то его сила значительно возрастает, и только в редких случаях человек может выиграть.

Жадный алгоритм

В файле greedy.py определен класс для реализации жадного алгоритма:

class greedy_player():

Реализует игру в黑白棋 с использованием жадного алгоритма, выводит время обработки.

Общие входные и выходные данные

Классы всех трех алгоритмов имеют унифицированный интерфейс для ввода текущего состояния доски и вывода выбранного хода. В каждом классе определена функция с одинаковым названием и параметрами:

def NextPosition(self, board):

В файле main.py при выборе различных алгоритмов создается соответствующий объект AI, который затем вызывает эту функцию.

ai_pos = ai.NextPosition(board)

Заключение

Если упорядочить силу трех AI, то, по моему мнению, это будет выглядеть так:

MCTS (время обработки 2 секунды) > Альфа-Бета обрезка поиска (глубина поиска 6) > Жадный алгоритм

После тестирования несколькими людьми, MCTS и Альфа-Бета обрезка поиска показали хорошие результаты. То есть, вероятность победы AI над человеком (конечно, новичками) обычно превышает 50%. При этом, если время обработки MCTS составляет 5 секунд, то его сила значительно возрастает, и только в редких случаях человек может выиграть.

Жадный алгоритм

В файле greedy.py определен класс для реализации жадного алгоритма:

class greedy_player():

Реализует игру в黑白棋 с использованием жадного алгоритма, выводит время обработки.

Общие входные и выходные данные

Классы всех трех алгоритмов имеют унифицированный интерфейс для ввода текущего состояния доски и вывода выбранного хода. В каждом классе определена функция с одинаковым названием и параметрами:

def NextPosition(self, board):

В файле main.py при выборе различных алгоритмов создается соответствующий объект AI, который затем вызывает эту функцию.

ai_pos = ai.NextPosition(board)

Заключение

Если упорядочить силу трех AI, то, по моему мнению, это будет выглядеть так:

MCTS (время обработки 2 секунды) > Альфа-Бета обрезка поиска (глубина поиска 6) > Жадный алгоритм

После тестирования несколькими людьми, MCTS и Альфа-Бета обрезка поиска показали хорошие результаты. То есть, вероятность победы AI над человеком (конечно, новичками) обычно превышает 50%. При этом, если время обработки MCTS составляет 5 секунд, то его сила значительно возрастает, и только в редких случаях человек может выиграть.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Черно-белая шахматная игра - MiniAlphaGo Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Язык

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mcpocket-MiniAlphago.git
git@api.gitlife.ru:oschina-mirror/mcpocket-MiniAlphago.git
oschina-mirror
mcpocket-MiniAlphago
mcpocket-MiniAlphago
master