"Проект представляет собой реализацию среды для игры в крестики-нолики с использованием библиотеки Gymnasium и модель обучения, в которой два случайно действующих игрока соревнуются в течение множества эпизодов.\n",
"\n",
"**Проект состоит из следующих компонентов:**\n",
"1. **Среда TicTacToeEnv:**<br>\n",
" Реализует правила игры в крестики-нолики, управление ходами, проверку победных условий и завершения игры. Обеспечивает визуализацию доски (render) и генерацию доступных ходов.\n",
"2. **Игроки:**<br>\n",
" Два случайных игрока, каждый из которых выбирает ход из доступных с помощью функции random_move.\n",
"3. **Цикл обучения:**<br>\n",
" Выполняется симуляция игр (эпизодов) между игроками. Учитываются награды, проверяются завершения игр и ведётся статистика (например, средняя награда).\n",
"4. **Параметры обучения:**<br>\n",
" Задаются переменные (alpha, beta) для возможной адаптации стратегий, хотя в текущей версии они не используются.\n",
"5. **Сбор данных:**<br>\n",
" Коллекционируются награды и результаты эпизодов для анализа и оценки эффективности случайных стратегий. \n",
"\n",
"---\n",
"\n",
"### Бизнес-цель:\n",
"Разработка платформы для исследования и оптимизации стратегий игры, которая может быть использована в обучении, автоматизации решений, создании игровых приложений или демонстрации алгоритмов искусственного интеллекта.\n",
"1. Разработать гибкую и расширяемую среду для симуляции игры в крестики-нолики, которая будет легко интегрироваться с различными алгоритмами искусственного интеллекта (AI), включая классические методы обучения с подкреплением, такие как Q-learning.\n",
"2. Реализовать и оптимизировать алгоритмы обучения с подкреплением для создания агентов, которые могут адаптироваться и улучшать свои стратегии с течением времени. Это включает внедрение таких методов, как Q-learning, для оптимизации принятия решений агентами.\n",
"3. Оценить эффективность различных стратегий, путем обучения агентов с различными параметрами, такими как коэффициенты обучения и коэффициенты дисконтирования, и выявить наилучшие подходы для разных игровых ситуаций.\n",
"4. Разработать механизмы автоматизированного тестирования и оптимизации стратегий игры. Это включает реализацию автоматической генерации и оценки множества стратегий с использованием методов оптимизации и обучения с подкреплением.\n",
"5. Встроить функционал для сравнения различных стратегий по меткам, таким как количество побед, ничьих и полученные награды, что будет полезно для исследований и разработки более эффективных игровых стратегий.\n",
"6. Реализовать возможность визуализации и подробной статистики для отслеживания эффективности выбранных стратегий и анализа поведения алгоритмов.\n",
"**Среда (environment)** – среда, в которой объект выполняет действия для решения задачи.\n",
"\n",
"Класс TicTacToeEnv реализует среду для игры в крестики-нолики с использованием библиотеки gymnasium. Он предоставляет интерфейс для двух игроков, которые по очереди делают ходы, стремясь выстроить три символа в ряд (по горизонтали, вертикали или диагонали).\n",
"\n",
"Среда определяет пространство действий (action_space), состоящее из 9 дискретных значений, соответствующих номерам клеток на доске, и пространство наблюдений (observation_space), описывающее текущее состояние игры. Начальное состояние доски задаётся с помощью метода reset, где доска очищается, а первым ходит игрок 1 (крестики).\n",
"\n",
"Основной метод step обрабатывает действия игроков, проверяет их легальность (например, нельзя занять уже занятую клетку или сделать ход не в свою очередь), обновляет состояние доски и проверяет условия завершения игры: победу одного из игроков или ничью. Если ход незаконный, игра завершается, а противнику начисляется награда. Легальный ход обновляет состояние доски, переключает текущего игрока и проверяет наличие трёх одинаковых символов в одной линии.\n",
"\n",
"Метод render визуализирует состояние игры, показывая текущего игрока и доску в текстовом формате. Также реализован метод move_generator, который возвращает список возможных ходов для текущего игрока, исключая уже занятые клетки."
"Основной цикл обучения выполняет симуляцию игры в крестики-нолики между двумя случайно действующими игроками в течение заданного числа эпизодов (num_episodes). Каждая игра моделируется как последовательность ходов, пока один из игроков не победит, не будет сделан незаконный ход или не наступит ничья.\n",
"\n",
"**Описание логики цикла:**\n",
"1. **Инициализация:**<br>\n",
" Перед началом эпизодов задаются параметры обучения: коэффициенты alpha и beta, общее количество эпизодов (num_episodes), список для накопления наград (collected_rewards), и переменная oom для указания начального игрока.\n",
"2. **Начало эпизода:**\n",
" - Сбрасывается среда с помощью env.reset(), что очищает доску и задаёт начального игрока.\n",
" - Счётчик наград total_reward обнуляется, а флаги (done) и очередность хода (om) обновляются.\n",
"3. **Цикл ходов в одном эпизоде:**\n",
" - Генерируется список доступных ходов с помощью move_generator. Если нет доступных ходов, игра заканчивается.\n",
" - Если доступен только один возможный ход, он выполняется. В противном случае выбирается случайный ход с помощью функции random_move.\n",
" - Выполняется выбранный ход методом step, который возвращает новое состояние среды, награду, индикатор завершения игры и дополнительные данные.\n",
" - Суммируется полученная награда, обновляется текущее состояние, а очередь хода передаётся другому игроку (om = -om).\n",
" - Если игра завершена (done = True), цикл прерывается.\n",
"4. **Сбор статистики:**\n",
" - Награда за эпизод сохраняется в список collected_rewards.\n",
" - Каждые 50 эпизодов выводится информация о прогрессе: рендерится текущая доска, печатается общий выигрыш за эпизод и средняя награда за все предыдущие эпизоды.\n",
"5. **Повторение:**<br>\n",
" Цикл продолжается до завершения заданного количества эпизодов. После каждого эпизода накапливаются данные для анализа и настройки параметров, если необходимо."
"Проект представляет собой обновленную реализацию среды для игры в крестики-нолики с использованием библиотеки Gymnasium и модели обучения с подкреплением, где агент обучается с помощью метода Q-learning.\n",
"\n",
"**Проект состоит из следующих компонентов:**\n",
"1. **Среда TicTacToeEnv:**<br>\n",
" Реализует правила игры, управление ходами, проверку победных условий и завершения игры, а также визуализацию доски и генерацию доступных ходов.\n",
"2. **Агент TicTacToeAgent:**<br>\n",
" Использует метод Q-learning для обучения, обновляя свою Q-таблицу на основе полученных наград. Агент выбирает ход с помощью epsilon-greedy стратегии, балансируя между исследованием и эксплуатацией.\n",
"3. **Цикл обучения:**<br>\n",
" Выполняется симуляция игр (эпизодов), где агент играет против себя, обучаясь на основе своих действий. Ведется сбор статистики по победам, ничьим и общей награде для анализа эффективности обучения.\n",
"4. **Параметры обучения:**<br>\n",
" Задаются параметры Q-learning (learning_rate, discount_factor, epsilon), которые регулируют процесс обучения агента.\n",
"5. **Сбор данных:**<br>\n",
" Сохраняется статистика по каждому эпизоду, включая награды, победы и ничьи, для анализа прогресса обучения и улучшения стратегии агента.\n",
"1. **Использование Q-learning для обучения агента:**<br>\n",
" В отличие от предыдущей реализации, где игроки действовали случайным образом, теперь используется агент, обучающийся методом Q-learning. Агент обновляет свою Q-таблицу на основе наград и выбирает действия с использованием стратегии epsilon-greedy.\n",
"2. **Добавление класса TicTacToeAgent:**<br>\n",
" В проект добавлен новый класс TicTacToeAgent, который реализует логику выбора действий на основе обучения с подкреплением. Агент выбирает ход с учетом предыдущего опыта и обновляет свою стратегию по мере игры.\n",
"3. **Цикл обучения с накоплением статистики:** \n",
" В новом цикле обучения агент обучается, играя против себя, с отслеживанием статистики по победам, ничьим и наградам за каждый эпизод. Это позволяет оценивать прогресс обучения и эффективность стратегии.\n",
"4. **Параметры обучения:** \n",
" Введены параметры обучения для настройки метода Q-learning (скорость обучения, коэффициент дисконтирования и вероятность случайного выбора действия), что позволяет гибко управлять процессом обучения агента.\n",
"5. **Рендеринг и вывод прогресса:** \n",
" Добавлена визуализация результатов симуляции всех эпизодов (победы игрока X, победы игрока O, ничьи) в виде графика.\n",
"**Среда (environment)** – среда, в которой объект выполняет действия для решения задачи.\n",
"\n",
"Класс TicTacToeEnv представляет собой обновлённую реализацию среды для игры в крестики-нолики с использованием библиотеки Gymnasium. Среда предоставляет интерфейс для двух игроков, которые поочерёдно совершают ходы, стремясь выстроить три символа в ряд (по горизонтали, вертикали или диагонали). В новой версии упрощена структура представления состояния, улучшена обработка правил игры и повышена совместимость с алгоритмами обучения с подкреплением.\n",
"\n",
"Пространство действий (action_space) остаётся неизменным и представляет собой 9 дискретных значений, соответствующих клеткам игрового поля. Пространство наблюдений (observation_space) обновлено: теперь оно представлено одномерным массивом из 9 значений (np.ndarray), где 1 соответствует символу X, -1 – символу O, а 0 обозначает пустую клетку. Эта структура делает состояние более понятным и удобным для обработки.\n",
"\n",
"Игра начинается с вызова метода reset, который очищает доску (заполняет её нулями) и назначает первым ход игроку X (1). Метод step обрабатывает действия игроков, проверяя их легальность: попытка занять уже занятую клетку приводит к штрафу для текущего игрока, но игра продолжается. При успешном ходе состояние доски обновляется, проверяется наличие победной комбинации или ничьей. Победитель получает награду 1 (или -1), ничья приносит награду 0 для обоих игроков, после чего игра завершается.\n",
"\n",
"Метод check_winner проверяет наличие трёх одинаковых символов на одной из выигрышных линий (горизонталей, вертикалей или диагоналей). Если игрок выигрывает, возвращается соответствующий результат. Для визуализации состояния игры используется метод render, который выводит доску в текстовом формате как сетку из символов X, O и пробелов.\n",
"\n",
"**Основные изменения в новой реализации:**\n",
"- Упрощённое представление состояния доски через массив, что делает её более совместимой с алгоритмами обучения с подкреплением.\n",
"- Обновлённая логика обработки нелегальных ходов: вместо завершения игры игрок получает штраф, а игра продолжается.\n",
"- Вынесение проверки победы в отдельный метод check_winner, что улучшает читаемость и модульность кода.\n",
"- Удалён метод move_generator, так как доступные ходы обрабатываются напрямую внутри step.\n",
"\n",
"Эти изменения делают среду более универсальной, удобной для использования в проектах с обучением агентов и более гибкой в плане настроек игрового процесса."
"**Агент (agent)** – объект обучения, который выполняет действия в некоторой среде для получения вознаграждения, принимая решения на основе своих целей и информации, которую он получает.\n",
"\n",
"Класс TicTacToeAgent представляет собой агента для игры в крестики-нолики, использующего метод Q-learning для обучения и улучшения своей стратегии. Агент накапливает знания в процессе взаимодействия со средой, обновляя Q-таблицу, которая хранит оценки для каждой пары \"состояние-действие\". Он выбирает действия с использованием стратегии epsilon-greedy, что позволяет балансировать между исследованием новых возможностей и эксплуатацией уже известных действий с высокой наградой.\n",
"\n",
"**Основные компоненты агента:**\n",
"1. **Q-таблица** (q_table): Хранит значения для пар \"состояние-действие\", которые оценивают, насколько выгодно выполнить определённое действие в конкретном состоянии.\n",
"2. **Параметры обучения**:\n",
" - learning_rate (α): Скорость обновления Q-значений.\n",
" - epsilon: Вероятность случайного выбора действия, обеспечивающая баланс между исследованием и эксплуатацией.\n",
" \n",
"**Методы агента:**\n",
"- get_state_key: Преобразует текущее состояние доски в ключ для Q-таблицы.\n",
"- select_action: Реализует стратегию epsilon-greedy для выбора действия, либо случайного, либо с максимальным Q-значением.\n",
"- update: Обновляет Q-значения на основе полученной награды, используя формулу Q-learning.\n",
"\n",
"В отличие от предыдущей реализации, где игроки выбирали ходы случайным образом без обучения, новая версия с агентом использует Q-learning для улучшения своей стратегии. Агент адаптируется к среде, минимизируя ошибки и максимизируя долгосрочные награды. Он также сохраняет информацию о прошлых действиях через Q-таблицу и использует её для более эффективных решений в будущем. В то время как предыдущая версия игры не включала механизма обучения и все ходы были случайными, обновлённая реализация позволяет агенту развивать стратегию и достигать лучших результатов за счет обучения на основе полученного опыта."
"Основной цикл обучения выполняет симуляцию игры в крестики-нолики между агентом, использующим метод Q-learning, и средой в течение заданного числа эпизодов (episodes). В процессе обучения агент учится выбирать действия, ориентируясь на полученные награды и обновления своей Q-таблицы. Целью является улучшение стратегии игры на основе предыдущего опыта.\n",
"\n",
"**Описание логики цикла:**\n",
"1. **Инициализация:**<br>\n",
" Перед началом эпизодов задаются параметры обучения: скорость обучения (learning_rate), коэффициент дисконтирования (discount_factor), вероятность случайного выбора действия (epsilon), и общее количество эпизодов (episodes). Также создаются объекты среды (env) и агента (agent), которые будут взаимодействовать друг с другом. Для отслеживания результатов создаются метрики статистики (например, количество побед и ничьих).\n",
"2. **Начало эпизода:**\n",
" - Каждый эпизод начинается с вызова метода env.reset(), который сбрасывает игровое поле и устанавливает начальное состояние.\n",
" - Для каждого эпизода инициализируются переменные для подсчета общей награды (total_reward), количества побед и ничьих. Флаг завершенности игры (done) устанавливается в False.\n",
"3. **Цикл ходов в одном эпизоде:**\n",
" - Для каждого хода агент выбирает действие, используя стратегию epsilon-greedy, что означает баланс между случайным выбором действия (для исследования) и выбором действия, которое на данный момент кажется оптимальным (эксплуатация).\n",
" - После выбора действия вызывается метод env.step(), который обновляет состояние игры, возвращает новую награду и флаг завершения игры (terminated).\n",
" - Агент обновляет свою Q-таблицу с помощью метода agent.update(), используя полученные награду и новое состояние.\n",
" - Если игра завершена (флаг terminated установлен в True), цикл завершения игры прерывается, и сохраняются данные для статистики.\n",
"4. **Сбор статистики:**\n",
" - В конце каждого эпизода сохраняются данные о общей награде, количестве побед и ничьих для игроков X и O в соответствующие списки статистики.\n",
" - Каждые 50 эпизодов выводится информация о текущем прогрессе, включая отображение доски через метод env.render(), а также выводится средняя награда за все эпизоды на текущий момент.\n",
"5. **Повторение:**<br>\n",
" Цикл продолжается до завершения заданного количества эпизодов. По мере прохождения эпизодов агент постепенно улучшает свою стратегию игры, накапливая опыт и корректируя свои действия в соответствии с полученными результатами.\n",
"\n",
"**Основные изменения в новой реализации:**\n",
"1. **Использование Q-learning:** В новой версии агент обучается с помощью Q-learning, обновляя свою Q-таблицу на основе полученных наград, что позволяет улучшать стратегию игры.\n",
"2. **Стратегия выбора хода:** Агент использует **epsilon-greedy** стратегию для выбора ходов, что позволяет балансировать между исследованием новых ходов и эксплуатацией оптимальных действий.\n",
"3. **Обновление Q-таблицы:** Каждый ход агента сопровождается обновлением Q-значений на основе полученной награды и информации о будущем состоянии, улучшая стратегию игры.\n",
"4. **Отслеживание статистики:** Ведется подробная статистика по каждому эпизоду (победы, ничьи, общая награда), что позволяет отслеживать прогресс обучения."
"График демонстрирует кумулятивный подсчет побед для игроков X и O, а также количество ничьих по мере прохождения обучающих эпизодов игры в крестики-нолики. Каждая линия на графике отражает количество побед или ничьих, накопленное за всё время обучения, что позволяет отслеживать прогресс и эффективность стратегии каждого игрока.\n",
"\n",
"- **Красная линия (Победы X):** Показывает кумулятивное количество побед игрока X (крестики) за каждый эпизод. Это отражает, как стратегия игрока X улучшалась или стабилизировалась по мере обучения.\n",
"- **Синяя линия (Победы O):** Показывает кумулятивное количество побед игрока O (нолики), отображая успешность его стратегии.\n",
"- **Зеленая линия (Ничьи):** Показывает количество ничьих, что помогает оценить, как часто игры заканчивались без победителя.\n",
"\n",
"График позволяет визуально оценить:\n",
"1. **Эффективность обучения:** Как меняется количество побед для каждого игрока с каждым эпизодом. Это может показать, насколько хорошо агент учится и насколько улучшилась его стратегия.\n",
"2. **Равновесие игры:** Наличие линий, которые растут с похожей скоростью, может указывать на сбалансированность игры между игроками X и O. Преобладание одной из линий может свидетельствовать о доминировании одной из стратегий.\n",
"3. **Показатели ничьих:** Анализ линии ничьих помогает оценить, насколько часто игра заканчивается без победителя, что может быть результатом сбалансированных стратегий обоих игроков.\n",
"1. **Разработка и обучение агентов:** Создан агент, использующий метод Q-learning для игры в крестики-нолики, который обучается на основе взаимодействия с игровой средой. Агенты оптимизируют свои стратегии для достижения победы или ничьей. \n",
"2. **Реализация среды для игры:** Разработана среда для игры в крестики-нолики с использованием библиотеки Gymnasium. Среда включает в себя управление состоянием игры, проверку победных условий и обработку действий игроков.\n",
"3. **Анализ эффективности стратегий:** Для каждого эпизода отслеживается количество побед и ничьих, что помогает в анализе прогресса обучения и эффективности стратегий обоих игроков.\n",
"4. **Визуализация прогресса обучения:** Построен кумулятивный график, который демонстрирует, как с каждым эпизодом увеличивается количество побед для игроков и ничьих. График позволяет увидеть, насколько эффективно развивается стратегия агентов и их производительность в процессе обучения.\n",
"5. **Использование обучения с подкреплением:** В проекте применен алгоритм Q-learning, который позволил агентам развивать свои стратегии через опыт, обновляя свою Q-таблицу на основе получаемых наград."