Files
AIM-PIbd-31-Anisin-R-S/lab_6/lab6.ipynb
2024-12-21 00:34:09 +04:00

3488 lines
78 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Лабораторная 6"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Задание:\n",
"- Развернуть и запустить проект по реализации обучения с подкреплением для игры \"Крестики-нолики\".\n",
"- Перевести проект на библиотеку gymnasium и современную версию Python. \n",
"- Реализовать агента для игры \"Крестики-нолики\" в виде отдельного класса (по примеру из лекции). \n",
"- Переписать основной цикл обучения для работы с отдельным классом агента (по примеру из лекции). Выполнить тестирование новой версии программы.\n",
"\n",
"Исходный проект: https://github.com/nczempin/gym-tic-tac-toe"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Перевод проекта на Gymnasium"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Gymnasium — библиотека Python для разработки, обучения и тестирования моделей обучения с подкреплением (Reinforcement Learning). Это обновлённая версия OpenAI Gym с улучшенной функциональностью и совместимостью."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Основные компоненты Gymnasium:\n",
"\n",
"1. Action Space (пространство действий):\n",
" - Определяет возможные действия, которые агент может предпринимать. Например:\n",
" - spaces.Discrete(9) — дискретные действия от 0 до 8 (например, выбор клетки на игровом поле).\n",
"\n",
"2. Observation Space (пространство наблюдений):\n",
" - Определяет, какие данные агент получает о текущем состоянии среды.\n",
" - Например, состояние игрового поля: spaces.Discrete(9 * 3 * 2).\n",
"\n",
"3. Методы среды:\n",
" - reset(): Сбрасывает среду и возвращает её начальное состояние.\n",
" - step(action): Выполняет действие агента и возвращает следующую информацию:\n",
" - Новое состояние среды.\n",
" - Награду за действие.\n",
" - Флаг завершения (True/False).\n",
" - Дополнительные данные.\n",
" - render(): Отображает состояние среды (например, визуализация игрового поля).\n",
" - close(): Закрывает среду."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"import gymnasium as gym\n",
"from gymnasium import spaces\n",
"import random\n",
"\n",
"class TicTacToeEnv(gym.Env):\n",
" metadata = {'render.modes': ['human']}\n",
" \n",
" symbols = ['O', ' ', 'X']\n",
"\n",
" def __init__(self):\n",
" super().__init__()\n",
" self.action_space = spaces.Discrete(9)\n",
" self.observation_space = spaces.Discrete(9 * 3 * 2) \n",
" self.reset()\n",
"\n",
" def step(self, action):\n",
" done = False\n",
" reward = 0\n",
"\n",
" p, square = action\n",
"\n",
" board = self.state['board']\n",
" proposed = board[square] \n",
" om = self.state['on_move'] \n",
" if proposed != 0:\n",
" print(f\"Незаконный ход: Квадрат {square} уже занят.\")\n",
" done = True\n",
" reward = -1 * om \n",
" if p != om: \n",
" print(f\"Незаконный ход: игрок {p} не находится в движении\")\n",
" done = True\n",
" reward = -1 * om\n",
" else:\n",
" board[square] = p\n",
" self.state['on_move'] = -p\n",
"\n",
" for i in range(3):\n",
" if (board[i * 3] == p and board[i * 3 + 1] == p and board[i * 3 + 2] == p) or \\\n",
" (board[i] == p and board[i + 3] == p and board[i + 6] == p):\n",
" reward = p\n",
" done = True\n",
" break\n",
"\n",
" if (board[0] == p and board[4] == p and board[8] == p) or \\\n",
" (board[2] == p and board[4] == p and board[6] == p):\n",
" reward = p\n",
" done = True\n",
" \n",
" return self.state, reward, done, {}\n",
"\n",
" def reset(self):\n",
" self.state = {}\n",
" self.state['board'] = [0, 0, 0, 0, 0, 0, 0, 0, 0] \n",
" self.state['on_move'] = 1 \n",
" return self.state, {}\n",
"\n",
" def render(self, close=False):\n",
" if close:\n",
" return\n",
" print(\"шаг: \" , self.symbols[self.state['on_move']+1])\n",
" for i in range (9):\n",
" print (self.symbols[self.state['board'][i]+1], end=\" \")\n",
" if ((i % 3) == 2):\n",
" print()\n",
"\n",
" def move_generator(self):\n",
" moves = []\n",
" for i in range(9):\n",
" if self.state['board'][i] == 0:\n",
" p = self.state['on_move']\n",
" m = [p, i]\n",
" moves.append(m)\n",
" return moves"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Агент\n",
"1. Взаимодействие со средой:\n",
" - Агент передаёт свои действия через метод step(action), где:\n",
" - action — кортеж (p, square), где:\n",
" - p: текущий игрок (1 для \"X\", -1 для \"O\").\n",
" - square: номер клетки (08).\n",
" - Среда проверяет, допустимо ли действие, обновляет состояние игры, вычисляет награду и определяет, завершилась ли игра.\n",
"\n",
"2. Решение задач агента:\n",
" - Агент должен:\n",
" - Выбирать клетку на игровом поле, соблюдая правила.\n",
" - Стремиться к победе, формируя вертикальные, горизонтальные или диагональные линии из своих символов.\n",
" - Избегать неправильных действий, которые приводят к штрафам (например, выбор занятой клетки).\n",
"\n",
"3. Система наград:\n",
" - Агент получает:\n",
" - Положительную награду за победу (соответствует значению игрока p).\n",
" - Отрицательную награду за ошибочные действия (например, попытка занять уже занятую клетку).\n",
" - Нулевую награду за допустимые, но не победные ходы."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"class Agent:\n",
" def __init__(self, symbol):\n",
" self.symbol = symbol\n",
" \n",
" def get_action(self, moves):\n",
" return random.choice(moves)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Цикл обучения"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"шаг: O\n",
" \n",
" \n",
"X \n",
"шаг: X\n",
" \n",
" \n",
"X O \n",
"шаг: O\n",
" X \n",
" \n",
"X O \n",
"шаг: X\n",
" X \n",
"O \n",
"X O \n",
"шаг: O\n",
" X X \n",
"O \n",
"X O \n",
"шаг: X\n",
" X X \n",
"O \n",
"X O O \n",
"шаг: O\n",
" X X \n",
"O X \n",
"X O O \n",
"Эпизод 1, Общая награда: 1\n",
"Средняя награда: 1.0\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
"O \n",
" \n",
" X \n",
"шаг: O\n",
"O \n",
" X \n",
" X \n",
"шаг: X\n",
"O O \n",
" X \n",
" X \n",
"шаг: O\n",
"O O \n",
" X \n",
"X X \n",
"шаг: X\n",
"O O \n",
"O X \n",
"X X \n",
"шаг: O\n",
"O O \n",
"O X X \n",
"X X \n",
"шаг: X\n",
"O O O \n",
"O X X \n",
"X X \n",
"Эпизод 2, Общая награда: -1\n",
"Средняя награда: 0.0\n",
"шаг: O\n",
" \n",
"X \n",
" \n",
"шаг: X\n",
"O \n",
"X \n",
" \n",
"шаг: O\n",
"O \n",
"X X \n",
" \n",
"шаг: X\n",
"O \n",
"X X O \n",
" \n",
"шаг: O\n",
"O \n",
"X X O \n",
" X \n",
"шаг: X\n",
"O O \n",
"X X O \n",
" X \n",
"шаг: O\n",
"O O \n",
"X X O \n",
" X X \n",
"шаг: X\n",
"O O \n",
"X X O \n",
"O X X \n",
"шаг: O\n",
"O X O \n",
"X X O \n",
"O X X \n",
"Эпизод 3, Общая награда: 1\n",
"Средняя награда: 0.3333333333333333\n",
"шаг: O\n",
"X \n",
" \n",
" \n",
"шаг: X\n",
"X \n",
"O \n",
" \n",
"шаг: O\n",
"X X \n",
"O \n",
" \n",
"шаг: X\n",
"X X \n",
"O \n",
"O \n",
"шаг: O\n",
"X X \n",
"O \n",
"O X \n",
"шаг: X\n",
"X X \n",
"O O \n",
"O X \n",
"шаг: O\n",
"X X \n",
"O O \n",
"O X X \n",
"шаг: X\n",
"X O X \n",
"O O \n",
"O X X \n",
"шаг: O\n",
"X O X \n",
"O O X \n",
"O X X \n",
"Эпизод 4, Общая награда: 1\n",
"Средняя награда: 0.5\n",
"шаг: O\n",
" \n",
" \n",
"X \n",
"шаг: X\n",
" \n",
"O \n",
"X \n",
"шаг: O\n",
" X \n",
"O \n",
"X \n",
"шаг: X\n",
"O X \n",
"O \n",
"X \n",
"шаг: O\n",
"O X \n",
"O X \n",
"X \n",
"Эпизод 5, Общая награда: 1\n",
"Средняя награда: 0.6\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
" X \n",
" \n",
" O \n",
"шаг: O\n",
" X \n",
" X \n",
" O \n",
"шаг: X\n",
" X \n",
" X \n",
" O O \n",
"шаг: O\n",
" X \n",
" X X \n",
" O O \n",
"шаг: X\n",
" X \n",
" X X \n",
"O O O \n",
"Эпизод 6, Общая награда: -1\n",
"Средняя награда: 0.3333333333333333\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
" X \n",
" O \n",
" \n",
"шаг: O\n",
" X X \n",
" O \n",
" \n",
"шаг: X\n",
"O X X \n",
" O \n",
" \n",
"шаг: O\n",
"O X X \n",
" O \n",
" X \n",
"шаг: X\n",
"O X X \n",
" O \n",
"O X \n",
"шаг: O\n",
"O X X \n",
" O \n",
"O X X \n",
"шаг: X\n",
"O X X \n",
"O O \n",
"O X X \n",
"Эпизод 7, Общая награда: -1\n",
"Средняя награда: 0.14285714285714285\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
"O \n",
" X \n",
"шаг: O\n",
" \n",
"O X \n",
" X \n",
"шаг: X\n",
"O \n",
"O X \n",
" X \n",
"шаг: O\n",
"O X \n",
"O X \n",
" X \n",
"шаг: X\n",
"O X \n",
"O O X \n",
" X \n",
"шаг: O\n",
"O X X \n",
"O O X \n",
" X \n",
"шаг: X\n",
"O X X \n",
"O O X \n",
" X O \n",
"Эпизод 8, Общая награда: -1\n",
"Средняя награда: 0.0\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" O \n",
" X \n",
" \n",
"шаг: O\n",
" O \n",
" X \n",
"X \n",
"шаг: X\n",
" O \n",
"O X \n",
"X \n",
"шаг: O\n",
" O \n",
"O X X \n",
"X \n",
"шаг: X\n",
" O \n",
"O X X \n",
"X O \n",
"шаг: O\n",
" O \n",
"O X X \n",
"X O X \n",
"шаг: X\n",
" O O \n",
"O X X \n",
"X O X \n",
"шаг: O\n",
"X O O \n",
"O X X \n",
"X O X \n",
"Эпизод 9, Общая награда: 1\n",
"Средняя награда: 0.1111111111111111\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
" O \n",
" X \n",
"шаг: O\n",
"X \n",
" O \n",
" X \n",
"шаг: X\n",
"X \n",
"O O \n",
" X \n",
"шаг: O\n",
"X X \n",
"O O \n",
" X \n",
"шаг: X\n",
"X X \n",
"O O \n",
" X O \n",
"шаг: O\n",
"X X X \n",
"O O \n",
" X O \n",
"Эпизод 10, Общая награда: 1\n",
"Средняя награда: 0.2\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" O \n",
" \n",
" X \n",
"шаг: O\n",
" O \n",
" X \n",
" X \n",
"шаг: X\n",
" O \n",
" X \n",
"O X \n",
"шаг: O\n",
" O \n",
" X \n",
"O X X \n",
"шаг: X\n",
"O O \n",
" X \n",
"O X X \n",
"шаг: O\n",
"O O \n",
"X X \n",
"O X X \n",
"шаг: X\n",
"O O O \n",
"X X \n",
"O X X \n",
"Эпизод 11, Общая награда: -1\n",
"Средняя награда: 0.09090909090909091\n",
"шаг: O\n",
" \n",
"X \n",
" \n",
"шаг: X\n",
" \n",
"X O \n",
" \n",
"шаг: O\n",
" \n",
"X O \n",
"X \n",
"шаг: X\n",
" \n",
"X O O \n",
"X \n",
"шаг: O\n",
" X \n",
"X O O \n",
"X \n",
"шаг: X\n",
" X \n",
"X O O \n",
"X O \n",
"шаг: O\n",
" X X \n",
"X O O \n",
"X O \n",
"шаг: X\n",
" X X \n",
"X O O \n",
"X O O \n",
"шаг: O\n",
"X X X \n",
"X O O \n",
"X O O \n",
"Эпизод 12, Общая награда: 1\n",
"Средняя награда: 0.16666666666666666\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" O \n",
" \n",
" X \n",
"шаг: O\n",
" O \n",
" \n",
"X X \n",
"шаг: X\n",
" O \n",
" \n",
"X O X \n",
"шаг: O\n",
" O \n",
"X \n",
"X O X \n",
"шаг: X\n",
" O \n",
"X O \n",
"X O X \n",
"шаг: O\n",
" O \n",
"X X O \n",
"X O X \n",
"шаг: X\n",
"O O \n",
"X X O \n",
"X O X \n",
"шаг: O\n",
"O X O \n",
"X X O \n",
"X O X \n",
"Эпизод 13, Общая награда: 0\n",
"Средняя награда: 0.15384615384615385\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" O \n",
" \n",
" X \n",
"шаг: O\n",
" O \n",
"X \n",
" X \n",
"шаг: X\n",
"O O \n",
"X \n",
" X \n",
"шаг: O\n",
"O O \n",
"X X \n",
" X \n",
"шаг: X\n",
"O O O \n",
"X X \n",
" X \n",
"Эпизод 14, Общая награда: -1\n",
"Средняя награда: 0.07142857142857142\n",
"шаг: O\n",
"X \n",
" \n",
" \n",
"шаг: X\n",
"X \n",
" O \n",
" \n",
"шаг: O\n",
"X \n",
"X O \n",
" \n",
"шаг: X\n",
"X \n",
"X O \n",
" O \n",
"шаг: O\n",
"X \n",
"X O \n",
" O X \n",
"шаг: X\n",
"X O \n",
"X O \n",
" O X \n",
"шаг: O\n",
"X O X \n",
"X O \n",
" O X \n",
"шаг: X\n",
"X O X \n",
"X O \n",
"O O X \n",
"шаг: O\n",
"X O X \n",
"X X O \n",
"O O X \n",
"Эпизод 15, Общая награда: 1\n",
"Средняя награда: 0.13333333333333333\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" O \n",
" \n",
" X \n",
"шаг: O\n",
" O \n",
" \n",
"X X \n",
"шаг: X\n",
" O O \n",
" \n",
"X X \n",
"шаг: O\n",
" O O \n",
" X \n",
"X X \n",
"шаг: X\n",
"O O O \n",
" X \n",
"X X \n",
"Эпизод 16, Общая награда: -1\n",
"Средняя награда: 0.0625\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
" \n",
"O X \n",
"шаг: O\n",
" X \n",
" \n",
"O X \n",
"шаг: X\n",
" X \n",
"O \n",
"O X \n",
"шаг: O\n",
"X X \n",
"O \n",
"O X \n",
"шаг: X\n",
"X X \n",
"O O \n",
"O X \n",
"шаг: O\n",
"X X X \n",
"O O \n",
"O X \n",
"Эпизод 17, Общая награда: 1\n",
"Средняя награда: 0.11764705882352941\n",
"шаг: O\n",
" \n",
" \n",
"X \n",
"шаг: X\n",
" O \n",
" \n",
"X \n",
"шаг: O\n",
" O \n",
" \n",
"X X \n",
"шаг: X\n",
" O \n",
" O \n",
"X X \n",
"шаг: O\n",
" O \n",
"X O \n",
"X X \n",
"шаг: X\n",
" O O \n",
"X O \n",
"X X \n",
"шаг: O\n",
" O O \n",
"X O X \n",
"X X \n",
"шаг: X\n",
"O O O \n",
"X O X \n",
"X X \n",
"Эпизод 18, Общая награда: -1\n",
"Средняя награда: 0.05555555555555555\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
"O \n",
" X \n",
"шаг: O\n",
" \n",
"O X \n",
" X \n",
"шаг: X\n",
" \n",
"O X \n",
"O X \n",
"шаг: O\n",
" \n",
"O X X \n",
"O X \n",
"шаг: X\n",
" O \n",
"O X X \n",
"O X \n",
"шаг: O\n",
"X O \n",
"O X X \n",
"O X \n",
"шаг: X\n",
"X O O \n",
"O X X \n",
"O X \n",
"шаг: O\n",
"X O O \n",
"O X X \n",
"O X X \n",
"Эпизод 19, Общая награда: 1\n",
"Средняя награда: 0.10526315789473684\n",
"шаг: O\n",
"X \n",
" \n",
" \n",
"шаг: X\n",
"X \n",
" \n",
" O \n",
"шаг: O\n",
"X \n",
"X \n",
" O \n",
"шаг: X\n",
"X \n",
"X O \n",
" O \n",
"шаг: O\n",
"X \n",
"X X O \n",
" O \n",
"шаг: X\n",
"X \n",
"X X O \n",
"O O \n",
"шаг: O\n",
"X X \n",
"X X O \n",
"O O \n",
"шаг: X\n",
"X X \n",
"X X O \n",
"O O O \n",
"Эпизод 20, Общая награда: -1\n",
"Средняя награда: 0.05\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" \n",
" X \n",
"O \n",
"шаг: O\n",
" \n",
" X \n",
"O X \n",
"шаг: X\n",
" \n",
" X O \n",
"O X \n",
"шаг: O\n",
" X \n",
" X O \n",
"O X \n",
"шаг: X\n",
" O X \n",
" X O \n",
"O X \n",
"шаг: O\n",
"X O X \n",
" X O \n",
"O X \n",
"Эпизод 21, Общая награда: 1\n",
"Средняя награда: 0.09523809523809523\n",
"шаг: O\n",
"X \n",
" \n",
" \n",
"шаг: X\n",
"X \n",
" \n",
"O \n",
"шаг: O\n",
"X \n",
"X \n",
"O \n",
"шаг: X\n",
"X O \n",
"X \n",
"O \n",
"шаг: O\n",
"X O \n",
"X \n",
"O X \n",
"шаг: X\n",
"X O \n",
"X O \n",
"O X \n",
"шаг: O\n",
"X O X \n",
"X O \n",
"O X \n",
"шаг: X\n",
"X O X \n",
"X O \n",
"O X O \n",
"шаг: O\n",
"X O X \n",
"X X O \n",
"O X O \n",
"Эпизод 22, Общая награда: 0\n",
"Средняя награда: 0.09090909090909091\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" \n",
" X \n",
"O \n",
"шаг: O\n",
"X \n",
" X \n",
"O \n",
"шаг: X\n",
"X \n",
"O X \n",
"O \n",
"шаг: O\n",
"X X \n",
"O X \n",
"O \n",
"шаг: X\n",
"X X \n",
"O X \n",
"O O \n",
"шаг: O\n",
"X X \n",
"O X X \n",
"O O \n",
"шаг: X\n",
"X O X \n",
"O X X \n",
"O O \n",
"шаг: O\n",
"X O X \n",
"O X X \n",
"O X O \n",
"Эпизод 23, Общая награда: 0\n",
"Средняя награда: 0.08695652173913043\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
" X \n",
" \n",
" O \n",
"шаг: O\n",
"X X \n",
" \n",
" O \n",
"шаг: X\n",
"X O X \n",
" \n",
" O \n",
"шаг: O\n",
"X O X \n",
"X \n",
" O \n",
"шаг: X\n",
"X O X \n",
"X O \n",
" O \n",
"шаг: O\n",
"X O X \n",
"X O \n",
"X O \n",
"Эпизод 24, Общая награда: 1\n",
"Средняя награда: 0.125\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
" O \n",
" X \n",
"шаг: O\n",
" \n",
"X O \n",
" X \n",
"шаг: X\n",
" \n",
"X O \n",
"O X \n",
"шаг: O\n",
"X \n",
"X O \n",
"O X \n",
"шаг: X\n",
"X O \n",
"X O \n",
"O X \n",
"Эпизод 25, Общая награда: -1\n",
"Средняя награда: 0.08\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
" \n",
"O X \n",
"шаг: O\n",
" \n",
"X \n",
"O X \n",
"шаг: X\n",
" O \n",
"X \n",
"O X \n",
"шаг: O\n",
" X O \n",
"X \n",
"O X \n",
"шаг: X\n",
" X O \n",
"X O \n",
"O X \n",
"шаг: O\n",
"X X O \n",
"X O \n",
"O X \n",
"шаг: X\n",
"X X O \n",
"X O O \n",
"O X \n",
"Эпизод 26, Общая награда: -1\n",
"Средняя награда: 0.038461538461538464\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" \n",
" X O \n",
" \n",
"шаг: O\n",
" \n",
" X O \n",
" X \n",
"шаг: X\n",
"O \n",
" X O \n",
" X \n",
"шаг: O\n",
"O X \n",
" X O \n",
" X \n",
"шаг: X\n",
"O X \n",
" X O \n",
" O X \n",
"шаг: O\n",
"O X \n",
" X O \n",
"X O X \n",
"шаг: X\n",
"O X O \n",
" X O \n",
"X O X \n",
"шаг: O\n",
"O X O \n",
"X X O \n",
"X O X \n",
"Эпизод 27, Общая награда: 0\n",
"Средняя награда: 0.037037037037037035\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" \n",
"O X \n",
" \n",
"шаг: O\n",
" X \n",
"O X \n",
" \n",
"шаг: X\n",
"O X \n",
"O X \n",
" \n",
"шаг: O\n",
"O X \n",
"O X \n",
" X \n",
"шаг: X\n",
"O X \n",
"O X O \n",
" X \n",
"шаг: O\n",
"O X X \n",
"O X O \n",
" X \n",
"Эпизод 28, Общая награда: 1\n",
"Средняя награда: 0.07142857142857142\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
"O \n",
" X \n",
"шаг: O\n",
" \n",
"O X \n",
" X \n",
"шаг: X\n",
" O \n",
"O X \n",
" X \n",
"шаг: O\n",
"X O \n",
"O X \n",
" X \n",
"шаг: X\n",
"X O \n",
"O X O \n",
" X \n",
"шаг: O\n",
"X O \n",
"O X O \n",
" X X \n",
"Эпизод 29, Общая награда: 1\n",
"Средняя награда: 0.10344827586206896\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
" O \n",
" X \n",
"шаг: O\n",
" X \n",
" O \n",
" X \n",
"шаг: X\n",
"O X \n",
" O \n",
" X \n",
"шаг: O\n",
"O X \n",
"X O \n",
" X \n",
"шаг: X\n",
"O O X \n",
"X O \n",
" X \n",
"шаг: O\n",
"O O X \n",
"X O \n",
"X X \n",
"шаг: X\n",
"O O X \n",
"X O O \n",
"X X \n",
"шаг: O\n",
"O O X \n",
"X O O \n",
"X X X \n",
"Эпизод 30, Общая награда: 1\n",
"Средняя награда: 0.13333333333333333\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
" X \n",
" \n",
"O \n",
"шаг: O\n",
" X X \n",
" \n",
"O \n",
"шаг: X\n",
" X X \n",
" \n",
"O O \n",
"шаг: O\n",
"X X X \n",
" \n",
"O O \n",
"Эпизод 31, Общая награда: 1\n",
"Средняя награда: 0.16129032258064516\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
" X \n",
"O \n",
" \n",
"шаг: O\n",
" X \n",
"O X \n",
" \n",
"шаг: X\n",
" X \n",
"O X \n",
"O \n",
"шаг: O\n",
" X \n",
"O X \n",
"O X \n",
"Эпизод 32, Общая награда: 1\n",
"Средняя награда: 0.1875\n",
"шаг: O\n",
" \n",
" \n",
"X \n",
"шаг: X\n",
" O \n",
" \n",
"X \n",
"шаг: O\n",
" X O \n",
" \n",
"X \n",
"шаг: X\n",
" X O \n",
" \n",
"X O \n",
"шаг: O\n",
" X O \n",
" X \n",
"X O \n",
"шаг: X\n",
" X O \n",
" X O \n",
"X O \n",
"шаг: O\n",
"X X O \n",
" X O \n",
"X O \n",
"шаг: X\n",
"X X O \n",
"O X O \n",
"X O \n",
"шаг: O\n",
"X X O \n",
"O X O \n",
"X O X \n",
"Эпизод 33, Общая награда: 1\n",
"Средняя награда: 0.21212121212121213\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" \n",
" X \n",
"O \n",
"шаг: O\n",
"X \n",
" X \n",
"O \n",
"шаг: X\n",
"X \n",
" X \n",
"O O \n",
"шаг: O\n",
"X X \n",
" X \n",
"O O \n",
"шаг: X\n",
"X X \n",
"O X \n",
"O O \n",
"шаг: O\n",
"X X \n",
"O X X \n",
"O O \n",
"шаг: X\n",
"X X \n",
"O X X \n",
"O O O \n",
"Эпизод 34, Общая награда: -1\n",
"Средняя награда: 0.17647058823529413\n",
"шаг: O\n",
"X \n",
" \n",
" \n",
"шаг: X\n",
"X \n",
" O \n",
" \n",
"шаг: O\n",
"X \n",
"X O \n",
" \n",
"шаг: X\n",
"X \n",
"X O \n",
" O \n",
"шаг: O\n",
"X X \n",
"X O \n",
" O \n",
"шаг: X\n",
"X X O \n",
"X O \n",
" O \n",
"шаг: O\n",
"X X O \n",
"X O \n",
" O X \n",
"шаг: X\n",
"X X O \n",
"X O O \n",
" O X \n",
"шаг: O\n",
"X X O \n",
"X O O \n",
"X O X \n",
"Эпизод 35, Общая награда: 1\n",
"Средняя награда: 0.2\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
"O \n",
" X \n",
" \n",
"шаг: O\n",
"O \n",
" X \n",
" X \n",
"шаг: X\n",
"O \n",
" X \n",
"O X \n",
"шаг: O\n",
"O \n",
"X X \n",
"O X \n",
"шаг: X\n",
"O \n",
"X X \n",
"O X O \n",
"шаг: O\n",
"O X \n",
"X X \n",
"O X O \n",
"шаг: X\n",
"O X \n",
"X X O \n",
"O X O \n",
"шаг: O\n",
"O X X \n",
"X X O \n",
"O X O \n",
"Эпизод 36, Общая награда: 1\n",
"Средняя награда: 0.2222222222222222\n",
"шаг: O\n",
" \n",
" \n",
"X \n",
"шаг: X\n",
" \n",
" O \n",
"X \n",
"шаг: O\n",
" \n",
"X O \n",
"X \n",
"шаг: X\n",
" O \n",
"X O \n",
"X \n",
"шаг: O\n",
" O \n",
"X O \n",
"X X \n",
"шаг: X\n",
" O \n",
"X O \n",
"X X O \n",
"Эпизод 37, Общая награда: -1\n",
"Средняя награда: 0.1891891891891892\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
" O \n",
" X \n",
"шаг: O\n",
" \n",
"X O \n",
" X \n",
"шаг: X\n",
" \n",
"X O \n",
"O X \n",
"шаг: O\n",
" \n",
"X O X \n",
"O X \n",
"шаг: X\n",
"O \n",
"X O X \n",
"O X \n",
"шаг: O\n",
"O X \n",
"X O X \n",
"O X \n",
"шаг: X\n",
"O X O \n",
"X O X \n",
"O X \n",
"Эпизод 38, Общая награда: -1\n",
"Средняя награда: 0.15789473684210525\n",
"шаг: O\n",
" \n",
"X \n",
" \n",
"шаг: X\n",
" O \n",
"X \n",
" \n",
"шаг: O\n",
" O \n",
"X \n",
" X \n",
"шаг: X\n",
" O \n",
"X O \n",
" X \n",
"шаг: O\n",
" O \n",
"X O \n",
" X X \n",
"шаг: X\n",
"O O \n",
"X O \n",
" X X \n",
"шаг: O\n",
"O O \n",
"X O X \n",
" X X \n",
"шаг: X\n",
"O O O \n",
"X O X \n",
" X X \n",
"Эпизод 39, Общая награда: -1\n",
"Средняя награда: 0.1282051282051282\n",
"шаг: O\n",
"X \n",
" \n",
" \n",
"шаг: X\n",
"X \n",
" \n",
" O \n",
"шаг: O\n",
"X X \n",
" \n",
" O \n",
"шаг: X\n",
"X O X \n",
" \n",
" O \n",
"шаг: O\n",
"X O X \n",
" \n",
"X O \n",
"шаг: X\n",
"X O X \n",
" O \n",
"X O \n",
"шаг: O\n",
"X O X \n",
"X O \n",
"X O \n",
"Эпизод 40, Общая награда: 1\n",
"Средняя награда: 0.15\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
" X \n",
" \n",
" O \n",
"шаг: O\n",
" X \n",
" X \n",
" O \n",
"шаг: X\n",
" X \n",
" O X \n",
" O \n",
"шаг: O\n",
" X \n",
" O X \n",
" O X \n",
"Эпизод 41, Общая награда: 1\n",
"Средняя награда: 0.17073170731707318\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
" X \n",
" O \n",
" \n",
"шаг: O\n",
" X \n",
" O \n",
" X \n",
"шаг: X\n",
" X \n",
"O O \n",
" X \n",
"шаг: O\n",
" X X \n",
"O O \n",
" X \n",
"шаг: X\n",
" X X \n",
"O O \n",
" X O \n",
"шаг: O\n",
" X X \n",
"O X O \n",
" X O \n",
"Эпизод 42, Общая награда: 1\n",
"Средняя награда: 0.19047619047619047\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
"O X \n",
" \n",
" \n",
"шаг: O\n",
"O X \n",
" \n",
" X \n",
"шаг: X\n",
"O X \n",
" \n",
" X O \n",
"шаг: O\n",
"O X \n",
"X \n",
" X O \n",
"шаг: X\n",
"O X \n",
"X O \n",
" X O \n",
"шаг: O\n",
"O X \n",
"X X O \n",
" X O \n",
"шаг: X\n",
"O O X \n",
"X X O \n",
" X O \n",
"шаг: O\n",
"O O X \n",
"X X O \n",
"X X O \n",
"Эпизод 43, Общая награда: 1\n",
"Средняя награда: 0.20930232558139536\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
" O X \n",
" \n",
" \n",
"шаг: O\n",
" O X \n",
" X \n",
" \n",
"шаг: X\n",
"O O X \n",
" X \n",
" \n",
"шаг: O\n",
"O O X \n",
"X X \n",
" \n",
"шаг: X\n",
"O O X \n",
"X X \n",
" O \n",
"шаг: O\n",
"O O X \n",
"X X \n",
" X O \n",
"шаг: X\n",
"O O X \n",
"X X \n",
"O X O \n",
"шаг: O\n",
"O O X \n",
"X X X \n",
"O X O \n",
"Эпизод 44, Общая награда: 1\n",
"Средняя награда: 0.22727272727272727\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" O \n",
" \n",
" X \n",
"шаг: O\n",
" O \n",
" X \n",
" X \n",
"шаг: X\n",
" O \n",
" X \n",
" X O \n",
"шаг: O\n",
" O \n",
" X \n",
"X X O \n",
"шаг: X\n",
" O \n",
"O X \n",
"X X O \n",
"шаг: O\n",
"X O \n",
"O X \n",
"X X O \n",
"шаг: X\n",
"X O O \n",
"O X \n",
"X X O \n",
"шаг: O\n",
"X O O \n",
"O X X \n",
"X X O \n",
"Эпизод 45, Общая награда: 0\n",
"Средняя награда: 0.2222222222222222\n",
"шаг: O\n",
"X \n",
" \n",
" \n",
"шаг: X\n",
"X \n",
" \n",
" O \n",
"шаг: O\n",
"X X \n",
" \n",
" O \n",
"шаг: X\n",
"X X \n",
" O \n",
" O \n",
"шаг: O\n",
"X X \n",
" O \n",
"X O \n",
"шаг: X\n",
"X X \n",
" O \n",
"X O O \n",
"шаг: O\n",
"X X \n",
" O X \n",
"X O O \n",
"шаг: X\n",
"X X \n",
"O O X \n",
"X O O \n",
"шаг: O\n",
"X X X \n",
"O O X \n",
"X O O \n",
"Эпизод 46, Общая награда: 1\n",
"Средняя награда: 0.2391304347826087\n",
"шаг: O\n",
" \n",
"X \n",
" \n",
"шаг: X\n",
" \n",
"X O \n",
" \n",
"шаг: O\n",
" X \n",
"X O \n",
" \n",
"шаг: X\n",
" X \n",
"X O \n",
" O \n",
"шаг: O\n",
" X \n",
"X O \n",
"X O \n",
"шаг: X\n",
" X \n",
"X O O \n",
"X O \n",
"шаг: O\n",
" X \n",
"X O O \n",
"X O X \n",
"шаг: X\n",
" O X \n",
"X O O \n",
"X O X \n",
"Эпизод 47, Общая награда: -1\n",
"Средняя награда: 0.2127659574468085\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" \n",
" X \n",
" O \n",
"шаг: O\n",
" \n",
" X \n",
" O X \n",
"шаг: X\n",
" \n",
" O X \n",
" O X \n",
"шаг: O\n",
" X \n",
" O X \n",
" O X \n",
"шаг: X\n",
"O X \n",
" O X \n",
" O X \n",
"шаг: O\n",
"O X \n",
" O X \n",
"X O X \n",
"шаг: X\n",
"O X \n",
"O O X \n",
"X O X \n",
"шаг: O\n",
"O X X \n",
"O O X \n",
"X O X \n",
"Эпизод 48, Общая награда: 1\n",
"Средняя награда: 0.22916666666666666\n",
"шаг: O\n",
" \n",
"X \n",
" \n",
"шаг: X\n",
"O \n",
"X \n",
" \n",
"шаг: O\n",
"O \n",
"X \n",
"X \n",
"шаг: X\n",
"O O \n",
"X \n",
"X \n",
"шаг: O\n",
"O O \n",
"X X \n",
"X \n",
"шаг: X\n",
"O O \n",
"X X \n",
"X O \n",
"шаг: O\n",
"O O \n",
"X X X \n",
"X O \n",
"Эпизод 49, Общая награда: 1\n",
"Средняя награда: 0.24489795918367346\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
"O \n",
" \n",
" X \n",
"шаг: O\n",
"O X \n",
" \n",
" X \n",
"шаг: X\n",
"O X \n",
"O \n",
" X \n",
"шаг: O\n",
"O X X \n",
"O \n",
" X \n",
"шаг: X\n",
"O X X \n",
"O O \n",
" X \n",
"шаг: O\n",
"O X X \n",
"O O \n",
"X X \n",
"шаг: X\n",
"O X X \n",
"O O \n",
"X O X \n",
"шаг: O\n",
"O X X \n",
"O X O \n",
"X O X \n",
"Эпизод 50, Общая награда: 1\n",
"Средняя награда: 0.26\n",
"шаг: O\n",
" \n",
" \n",
"X \n",
"шаг: X\n",
" O \n",
" \n",
"X \n",
"шаг: O\n",
" X O \n",
" \n",
"X \n",
"шаг: X\n",
" X O \n",
" \n",
"X O \n",
"шаг: O\n",
" X O \n",
" X \n",
"X O \n",
"шаг: X\n",
"O X O \n",
" X \n",
"X O \n",
"шаг: O\n",
"O X O \n",
" X \n",
"X X O \n",
"Эпизод 51, Общая награда: 1\n",
"Средняя награда: 0.27450980392156865\n",
"шаг: O\n",
" \n",
" \n",
"X \n",
"шаг: X\n",
" O \n",
" \n",
"X \n",
"шаг: O\n",
" O \n",
" \n",
"X X \n",
"шаг: X\n",
" O \n",
" O \n",
"X X \n",
"шаг: O\n",
" O X \n",
" O \n",
"X X \n",
"шаг: X\n",
" O X \n",
" O \n",
"X O X \n",
"Эпизод 52, Общая награда: -1\n",
"Средняя награда: 0.25\n",
"шаг: O\n",
" \n",
" \n",
"X \n",
"шаг: X\n",
"O \n",
" \n",
"X \n",
"шаг: O\n",
"O X \n",
" \n",
"X \n",
"шаг: X\n",
"O X \n",
" O \n",
"X \n",
"шаг: O\n",
"O X \n",
" O \n",
"X X \n",
"шаг: X\n",
"O X \n",
"O O \n",
"X X \n",
"шаг: O\n",
"O X \n",
"O O \n",
"X X X \n",
"Эпизод 53, Общая награда: 1\n",
"Средняя награда: 0.2641509433962264\n",
"шаг: O\n",
" \n",
"X \n",
" \n",
"шаг: X\n",
" \n",
"X \n",
" O \n",
"шаг: O\n",
" X \n",
"X \n",
" O \n",
"шаг: X\n",
" X \n",
"X \n",
" O O \n",
"шаг: O\n",
" X \n",
"X X \n",
" O O \n",
"шаг: X\n",
" O X \n",
"X X \n",
" O O \n",
"шаг: O\n",
" O X \n",
"X X \n",
"X O O \n",
"Эпизод 54, Общая награда: 1\n",
"Средняя награда: 0.2777777777777778\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
" X \n",
" \n",
" O \n",
"шаг: O\n",
"X X \n",
" \n",
" O \n",
"шаг: X\n",
"X X \n",
" O \n",
" O \n",
"шаг: O\n",
"X X \n",
" O X \n",
" O \n",
"шаг: X\n",
"X X \n",
" O X \n",
"O O \n",
"шаг: O\n",
"X X X \n",
" O X \n",
"O O \n",
"Эпизод 55, Общая награда: 1\n",
"Средняя награда: 0.2909090909090909\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
" X O \n",
" \n",
" \n",
"шаг: O\n",
" X O \n",
" \n",
" X \n",
"шаг: X\n",
" X O \n",
" O \n",
" X \n",
"шаг: O\n",
" X O \n",
" O \n",
"X X \n",
"шаг: X\n",
" X O \n",
" O \n",
"X O X \n",
"шаг: O\n",
" X O \n",
" O X \n",
"X O X \n",
"шаг: X\n",
"O X O \n",
" O X \n",
"X O X \n",
"шаг: O\n",
"O X O \n",
"X O X \n",
"X O X \n",
"Эпизод 56, Общая награда: 0\n",
"Средняя награда: 0.2857142857142857\n",
"шаг: O\n",
"X \n",
" \n",
" \n",
"шаг: X\n",
"X \n",
"O \n",
" \n",
"шаг: O\n",
"X \n",
"O \n",
" X \n",
"шаг: X\n",
"X O \n",
"O \n",
" X \n",
"шаг: O\n",
"X O \n",
"O X \n",
" X \n",
"шаг: X\n",
"X O \n",
"O O X \n",
" X \n",
"шаг: O\n",
"X O \n",
"O O X \n",
"X X \n",
"шаг: X\n",
"X O \n",
"O O X \n",
"X X O \n",
"шаг: O\n",
"X X O \n",
"O O X \n",
"X X O \n",
"Эпизод 57, Общая награда: 0\n",
"Средняя награда: 0.2807017543859649\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" O \n",
" \n",
" X \n",
"шаг: O\n",
"X O \n",
" \n",
" X \n",
"шаг: X\n",
"X O O \n",
" \n",
" X \n",
"шаг: O\n",
"X O O \n",
"X \n",
" X \n",
"шаг: X\n",
"X O O \n",
"X O \n",
" X \n",
"шаг: O\n",
"X O O \n",
"X O \n",
"X X \n",
"Эпизод 58, Общая награда: 1\n",
"Средняя награда: 0.29310344827586204\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
"O \n",
" X \n",
" \n",
"шаг: O\n",
"O \n",
" X \n",
" X \n",
"шаг: X\n",
"O O \n",
" X \n",
" X \n",
"шаг: O\n",
"O O \n",
"X X \n",
" X \n",
"шаг: X\n",
"O O \n",
"X X \n",
"O X \n",
"шаг: O\n",
"O O \n",
"X X X \n",
"O X \n",
"Эпизод 59, Общая награда: 1\n",
"Средняя награда: 0.3050847457627119\n",
"шаг: O\n",
" \n",
"X \n",
" \n",
"шаг: X\n",
"O \n",
"X \n",
" \n",
"шаг: O\n",
"O X \n",
"X \n",
" \n",
"шаг: X\n",
"O X \n",
"X \n",
" O \n",
"шаг: O\n",
"O X \n",
"X \n",
"X O \n",
"шаг: X\n",
"O X \n",
"X O \n",
"X O \n",
"шаг: O\n",
"O X \n",
"X X O \n",
"X O \n",
"Эпизод 60, Общая награда: 1\n",
"Средняя награда: 0.31666666666666665\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" \n",
"O X \n",
" \n",
"шаг: O\n",
" X \n",
"O X \n",
" \n",
"шаг: X\n",
" X \n",
"O O X \n",
" \n",
"шаг: O\n",
" X \n",
"O O X \n",
"X \n",
"шаг: X\n",
"O X \n",
"O O X \n",
"X \n",
"шаг: O\n",
"O X \n",
"O O X \n",
"X X \n",
"Эпизод 61, Общая награда: 1\n",
"Средняя награда: 0.32786885245901637\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
" X \n",
" \n",
" O \n",
"шаг: O\n",
" X \n",
"X \n",
" O \n",
"шаг: X\n",
" X \n",
"X \n",
" O O \n",
"шаг: O\n",
"X X \n",
"X \n",
" O O \n",
"шаг: X\n",
"X X \n",
"X O \n",
" O O \n",
"шаг: O\n",
"X X X \n",
"X O \n",
" O O \n",
"Эпизод 62, Общая награда: 1\n",
"Средняя награда: 0.3387096774193548\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
" O \n",
" X \n",
"шаг: O\n",
" X \n",
" O \n",
" X \n",
"шаг: X\n",
" X O \n",
" O \n",
" X \n",
"шаг: O\n",
"X X O \n",
" O \n",
" X \n",
"шаг: X\n",
"X X O \n",
" O O \n",
" X \n",
"шаг: O\n",
"X X O \n",
"X O O \n",
" X \n",
"шаг: X\n",
"X X O \n",
"X O O \n",
"O X \n",
"Эпизод 63, Общая награда: -1\n",
"Средняя награда: 0.31746031746031744\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" O \n",
" X \n",
" \n",
"шаг: O\n",
" O \n",
" X \n",
"X \n",
"шаг: X\n",
" O \n",
" X \n",
"X O \n",
"шаг: O\n",
" O \n",
" X X \n",
"X O \n",
"шаг: X\n",
" O O \n",
" X X \n",
"X O \n",
"шаг: O\n",
" O O \n",
" X X \n",
"X X O \n",
"шаг: X\n",
"O O O \n",
" X X \n",
"X X O \n",
"Эпизод 64, Общая награда: -1\n",
"Средняя награда: 0.296875\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" \n",
" X \n",
" O \n",
"шаг: O\n",
" X \n",
" X \n",
" O \n",
"шаг: X\n",
" X O \n",
" X \n",
" O \n",
"шаг: O\n",
" X O \n",
"X X \n",
" O \n",
"шаг: X\n",
" X O \n",
"X X \n",
" O O \n",
"шаг: O\n",
"X X O \n",
"X X \n",
" O O \n",
"шаг: X\n",
"X X O \n",
"X X \n",
"O O O \n",
"Эпизод 65, Общая награда: -1\n",
"Средняя награда: 0.27692307692307694\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" \n",
" X \n",
" O \n",
"шаг: O\n",
" X \n",
" X \n",
" O \n",
"шаг: X\n",
" X \n",
"O X \n",
" O \n",
"шаг: O\n",
" X \n",
"O X X \n",
" O \n",
"шаг: X\n",
"O X \n",
"O X X \n",
" O \n",
"шаг: O\n",
"O X \n",
"O X X \n",
"X O \n",
"Эпизод 66, Общая награда: 1\n",
"Средняя награда: 0.2878787878787879\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
" \n",
" O X \n",
"шаг: O\n",
"X \n",
" \n",
" O X \n",
"шаг: X\n",
"X \n",
" O \n",
" O X \n",
"шаг: O\n",
"X \n",
" X O \n",
" O X \n",
"Эпизод 67, Общая награда: 1\n",
"Средняя награда: 0.29850746268656714\n",
"шаг: O\n",
"X \n",
" \n",
" \n",
"шаг: X\n",
"X \n",
" O \n",
" \n",
"шаг: O\n",
"X \n",
" O \n",
" X \n",
"шаг: X\n",
"X O \n",
" O \n",
" X \n",
"шаг: O\n",
"X O \n",
" O \n",
" X X \n",
"шаг: X\n",
"X O \n",
"O O \n",
" X X \n",
"шаг: O\n",
"X O \n",
"O O X \n",
" X X \n",
"шаг: X\n",
"X O O \n",
"O O X \n",
" X X \n",
"шаг: O\n",
"X O O \n",
"O O X \n",
"X X X \n",
"Эпизод 68, Общая награда: 1\n",
"Средняя награда: 0.3088235294117647\n",
"шаг: O\n",
" \n",
" \n",
"X \n",
"шаг: X\n",
" \n",
" O \n",
"X \n",
"шаг: O\n",
" \n",
" O X \n",
"X \n",
"шаг: X\n",
"O \n",
" O X \n",
"X \n",
"шаг: O\n",
"O \n",
" O X \n",
"X X \n",
"шаг: X\n",
"O O \n",
" O X \n",
"X X \n",
"шаг: O\n",
"O O \n",
" O X \n",
"X X X \n",
"Эпизод 69, Общая награда: 1\n",
"Средняя награда: 0.3188405797101449\n",
"шаг: O\n",
" \n",
"X \n",
" \n",
"шаг: X\n",
" \n",
"X O \n",
" \n",
"шаг: O\n",
" X \n",
"X O \n",
" \n",
"шаг: X\n",
" X \n",
"X O \n",
"O \n",
"шаг: O\n",
"X X \n",
"X O \n",
"O \n",
"шаг: X\n",
"X O X \n",
"X O \n",
"O \n",
"шаг: O\n",
"X O X \n",
"X X O \n",
"O \n",
"шаг: X\n",
"X O X \n",
"X X O \n",
"O O \n",
"шаг: O\n",
"X O X \n",
"X X O \n",
"O O X \n",
"Эпизод 70, Общая награда: 1\n",
"Средняя награда: 0.32857142857142857\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
" O \n",
" X \n",
"шаг: O\n",
" \n",
" O \n",
" X X \n",
"шаг: X\n",
" \n",
"O O \n",
" X X \n",
"шаг: O\n",
" X \n",
"O O \n",
" X X \n",
"шаг: X\n",
" X O \n",
"O O \n",
" X X \n",
"шаг: O\n",
" X O \n",
"O O X \n",
" X X \n",
"шаг: X\n",
" X O \n",
"O O X \n",
"O X X \n",
"Эпизод 71, Общая награда: -1\n",
"Средняя награда: 0.30985915492957744\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
"O X \n",
" \n",
" \n",
"шаг: O\n",
"O X \n",
" X \n",
" \n",
"шаг: X\n",
"O X \n",
" X \n",
"O \n",
"шаг: O\n",
"O X \n",
" X X \n",
"O \n",
"шаг: X\n",
"O X \n",
"O X X \n",
"O \n",
"Эпизод 72, Общая награда: -1\n",
"Средняя награда: 0.2916666666666667\n",
"шаг: O\n",
"X \n",
" \n",
" \n",
"шаг: X\n",
"X O \n",
" \n",
" \n",
"шаг: O\n",
"X O \n",
" \n",
"X \n",
"шаг: X\n",
"X O \n",
"O \n",
"X \n",
"шаг: O\n",
"X O \n",
"O X \n",
"X \n",
"шаг: X\n",
"X O O \n",
"O X \n",
"X \n",
"шаг: O\n",
"X O O \n",
"O X \n",
"X X \n",
"шаг: X\n",
"X O O \n",
"O X \n",
"X X O \n",
"шаг: O\n",
"X O O \n",
"O X X \n",
"X X O \n",
"Эпизод 73, Общая награда: 0\n",
"Средняя награда: 0.2876712328767123\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" O \n",
" X \n",
" \n",
"шаг: O\n",
" O \n",
"X X \n",
" \n",
"шаг: X\n",
" O \n",
"X X \n",
" O \n",
"шаг: O\n",
" O \n",
"X X X \n",
" O \n",
"Эпизод 74, Общая награда: 1\n",
"Средняя награда: 0.2972972972972973\n",
"шаг: O\n",
" \n",
" \n",
"X \n",
"шаг: X\n",
" O \n",
" \n",
"X \n",
"шаг: O\n",
"X O \n",
" \n",
"X \n",
"шаг: X\n",
"X O \n",
"O \n",
"X \n",
"шаг: O\n",
"X O \n",
"O \n",
"X X \n",
"шаг: X\n",
"X O \n",
"O O \n",
"X X \n",
"шаг: O\n",
"X O \n",
"O O \n",
"X X X \n",
"Эпизод 75, Общая награда: 1\n",
"Средняя награда: 0.30666666666666664\n",
"шаг: O\n",
" \n",
"X \n",
" \n",
"шаг: X\n",
" \n",
"X \n",
"O \n",
"шаг: O\n",
" X \n",
"X \n",
"O \n",
"шаг: X\n",
" X \n",
"X O \n",
"O \n",
"шаг: O\n",
" X X \n",
"X O \n",
"O \n",
"шаг: X\n",
" X X \n",
"X O \n",
"O O \n",
"шаг: O\n",
" X X \n",
"X O \n",
"O O X \n",
"шаг: X\n",
" X X \n",
"X O O \n",
"O O X \n",
"шаг: O\n",
"X X X \n",
"X O O \n",
"O O X \n",
"Эпизод 76, Общая награда: 1\n",
"Средняя награда: 0.3157894736842105\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
" \n",
"O X \n",
"шаг: O\n",
"X \n",
" \n",
"O X \n",
"шаг: X\n",
"X O \n",
" \n",
"O X \n",
"шаг: O\n",
"X O \n",
" \n",
"O X X \n",
"шаг: X\n",
"X O \n",
" O \n",
"O X X \n",
"шаг: O\n",
"X O X \n",
" O \n",
"O X X \n",
"шаг: X\n",
"X O X \n",
"O O \n",
"O X X \n",
"шаг: O\n",
"X O X \n",
"O O X \n",
"O X X \n",
"Эпизод 77, Общая награда: 1\n",
"Средняя награда: 0.3246753246753247\n",
"шаг: O\n",
"X \n",
" \n",
" \n",
"шаг: X\n",
"X \n",
" \n",
" O \n",
"шаг: O\n",
"X X \n",
" \n",
" O \n",
"шаг: X\n",
"X X \n",
"O \n",
" O \n",
"шаг: O\n",
"X X \n",
"O X \n",
" O \n",
"шаг: X\n",
"X X \n",
"O X \n",
"O O \n",
"шаг: O\n",
"X X \n",
"O X \n",
"O X O \n",
"Эпизод 78, Общая награда: 1\n",
"Средняя награда: 0.3333333333333333\n",
"шаг: O\n",
" \n",
"X \n",
" \n",
"шаг: X\n",
" \n",
"X \n",
"O \n",
"шаг: O\n",
" X \n",
"X \n",
"O \n",
"шаг: X\n",
" O X \n",
"X \n",
"O \n",
"шаг: O\n",
" O X \n",
"X \n",
"O X \n",
"шаг: X\n",
"O O X \n",
"X \n",
"O X \n",
"шаг: O\n",
"O O X \n",
"X X \n",
"O X \n",
"шаг: X\n",
"O O X \n",
"X X O \n",
"O X \n",
"шаг: O\n",
"O O X \n",
"X X O \n",
"O X X \n",
"Эпизод 79, Общая награда: 0\n",
"Средняя награда: 0.3291139240506329\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" \n",
" X \n",
" O \n",
"шаг: O\n",
"X \n",
" X \n",
" O \n",
"шаг: X\n",
"X O \n",
" X \n",
" O \n",
"шаг: O\n",
"X O \n",
"X X \n",
" O \n",
"шаг: X\n",
"X O O \n",
"X X \n",
" O \n",
"шаг: O\n",
"X O O \n",
"X X \n",
" X O \n",
"шаг: X\n",
"X O O \n",
"X X \n",
"O X O \n",
"шаг: O\n",
"X O O \n",
"X X X \n",
"O X O \n",
"Эпизод 80, Общая награда: 1\n",
"Средняя награда: 0.3375\n",
"шаг: O\n",
"X \n",
" \n",
" \n",
"шаг: X\n",
"X \n",
" \n",
" O \n",
"шаг: O\n",
"X \n",
" \n",
"X O \n",
"шаг: X\n",
"X O \n",
" \n",
"X O \n",
"шаг: O\n",
"X O \n",
" X \n",
"X O \n",
"шаг: X\n",
"X O \n",
" X \n",
"X O O \n",
"шаг: O\n",
"X O \n",
"X X \n",
"X O O \n",
"Эпизод 81, Общая награда: 1\n",
"Средняя награда: 0.345679012345679\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
" \n",
"O X \n",
"шаг: O\n",
"X \n",
" \n",
"O X \n",
"шаг: X\n",
"X \n",
" O \n",
"O X \n",
"шаг: O\n",
"X X \n",
" O \n",
"O X \n",
"шаг: X\n",
"X O X \n",
" O \n",
"O X \n",
"шаг: O\n",
"X O X \n",
"X O \n",
"O X \n",
"шаг: X\n",
"X O X \n",
"X O \n",
"O O X \n",
"шаг: O\n",
"X O X \n",
"X X O \n",
"O O X \n",
"Эпизод 82, Общая награда: 1\n",
"Средняя награда: 0.35365853658536583\n",
"шаг: O\n",
" \n",
"X \n",
" \n",
"шаг: X\n",
" \n",
"X O \n",
" \n",
"шаг: O\n",
" \n",
"X O X \n",
" \n",
"шаг: X\n",
"O \n",
"X O X \n",
" \n",
"шаг: O\n",
"O \n",
"X O X \n",
" X \n",
"шаг: X\n",
"O O \n",
"X O X \n",
" X \n",
"шаг: O\n",
"O O X \n",
"X O X \n",
" X \n",
"Эпизод 83, Общая награда: 1\n",
"Средняя награда: 0.3614457831325301\n",
"шаг: O\n",
" \n",
" \n",
"X \n",
"шаг: X\n",
" \n",
" \n",
"X O \n",
"шаг: O\n",
" \n",
"X \n",
"X O \n",
"шаг: X\n",
" \n",
"X O \n",
"X O \n",
"шаг: O\n",
" X \n",
"X O \n",
"X O \n",
"шаг: X\n",
" X \n",
"X O \n",
"X O O \n",
"шаг: O\n",
"X X \n",
"X O \n",
"X O O \n",
"Эпизод 84, Общая награда: 1\n",
"Средняя награда: 0.36904761904761907\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" O \n",
" \n",
" X \n",
"шаг: O\n",
" O X \n",
" \n",
" X \n",
"шаг: X\n",
" O X \n",
" \n",
"O X \n",
"шаг: O\n",
" O X \n",
"X \n",
"O X \n",
"шаг: X\n",
"O O X \n",
"X \n",
"O X \n",
"шаг: O\n",
"O O X \n",
"X \n",
"O X X \n",
"шаг: X\n",
"O O X \n",
"X O \n",
"O X X \n",
"шаг: O\n",
"O O X \n",
"X O X \n",
"O X X \n",
"Эпизод 85, Общая награда: 1\n",
"Средняя награда: 0.3764705882352941\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" O \n",
" \n",
" X \n",
"шаг: O\n",
" O \n",
"X \n",
" X \n",
"шаг: X\n",
"O O \n",
"X \n",
" X \n",
"шаг: O\n",
"O O \n",
"X \n",
"X X \n",
"шаг: X\n",
"O O O \n",
"X \n",
"X X \n",
"Эпизод 86, Общая награда: -1\n",
"Средняя награда: 0.36046511627906974\n",
"шаг: O\n",
" \n",
"X \n",
" \n",
"шаг: X\n",
"O \n",
"X \n",
" \n",
"шаг: O\n",
"O \n",
"X \n",
"X \n",
"шаг: X\n",
"O \n",
"X O \n",
"X \n",
"шаг: O\n",
"O \n",
"X O \n",
"X X \n",
"шаг: X\n",
"O \n",
"X O O \n",
"X X \n",
"шаг: O\n",
"O X \n",
"X O O \n",
"X X \n",
"шаг: X\n",
"O X \n",
"X O O \n",
"X X O \n",
"Эпизод 87, Общая награда: -1\n",
"Средняя награда: 0.3448275862068966\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" \n",
" X \n",
"O \n",
"шаг: O\n",
" \n",
" X \n",
"O X \n",
"шаг: X\n",
" O \n",
" X \n",
"O X \n",
"шаг: O\n",
" O \n",
" X X \n",
"O X \n",
"шаг: X\n",
" O \n",
"O X X \n",
"O X \n",
"шаг: O\n",
"X O \n",
"O X X \n",
"O X \n",
"Эпизод 88, Общая награда: 1\n",
"Средняя награда: 0.3522727272727273\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
" O \n",
" X \n",
"шаг: O\n",
" \n",
"X O \n",
" X \n",
"шаг: X\n",
"O \n",
"X O \n",
" X \n",
"шаг: O\n",
"O X \n",
"X O \n",
" X \n",
"шаг: X\n",
"O X \n",
"X O \n",
" X O \n",
"шаг: O\n",
"O X \n",
"X X O \n",
" X O \n",
"Эпизод 89, Общая награда: 1\n",
"Средняя награда: 0.3595505617977528\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" \n",
" X \n",
"O \n",
"шаг: O\n",
" \n",
" X \n",
"O X \n",
"шаг: X\n",
" \n",
" X O \n",
"O X \n",
"шаг: O\n",
"X \n",
" X O \n",
"O X \n",
"Эпизод 90, Общая награда: 1\n",
"Средняя награда: 0.36666666666666664\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" O \n",
" X \n",
" \n",
"шаг: O\n",
" O \n",
" X \n",
" X \n",
"шаг: X\n",
"O O \n",
" X \n",
" X \n",
"шаг: O\n",
"O O \n",
"X X \n",
" X \n",
"шаг: X\n",
"O O O \n",
"X X \n",
" X \n",
"Эпизод 91, Общая награда: -1\n",
"Средняя награда: 0.3516483516483517\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" O \n",
" X \n",
" \n",
"шаг: O\n",
" O \n",
" X \n",
" X \n",
"шаг: X\n",
" O O \n",
" X \n",
" X \n",
"шаг: O\n",
" O O \n",
" X \n",
" X X \n",
"шаг: X\n",
" O O \n",
" X \n",
"O X X \n",
"шаг: O\n",
" O O \n",
"X X \n",
"O X X \n",
"шаг: X\n",
"O O O \n",
"X X \n",
"O X X \n",
"Эпизод 92, Общая награда: -1\n",
"Средняя награда: 0.33695652173913043\n",
"шаг: O\n",
" \n",
" X \n",
" \n",
"шаг: X\n",
" \n",
"O X \n",
" \n",
"шаг: O\n",
" X \n",
"O X \n",
" \n",
"шаг: X\n",
" X \n",
"O X O \n",
" \n",
"шаг: O\n",
" X \n",
"O X O \n",
"X \n",
"Эпизод 93, Общая награда: 1\n",
"Средняя награда: 0.34408602150537637\n",
"шаг: O\n",
"X \n",
" \n",
" \n",
"шаг: X\n",
"X \n",
" \n",
" O \n",
"шаг: O\n",
"X \n",
" X \n",
" O \n",
"шаг: X\n",
"X \n",
" X \n",
"O O \n",
"шаг: O\n",
"X \n",
" X \n",
"O O X \n",
"Эпизод 94, Общая награда: 1\n",
"Средняя награда: 0.35106382978723405\n",
"шаг: O\n",
" \n",
"X \n",
" \n",
"шаг: X\n",
" \n",
"X \n",
"O \n",
"шаг: O\n",
" \n",
"X X \n",
"O \n",
"шаг: X\n",
" O \n",
"X X \n",
"O \n",
"шаг: O\n",
" O X \n",
"X X \n",
"O \n",
"шаг: X\n",
" O X \n",
"X O X \n",
"O \n",
"шаг: O\n",
" O X \n",
"X O X \n",
"O X \n",
"Эпизод 95, Общая награда: 1\n",
"Средняя награда: 0.35789473684210527\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
" \n",
" O \n",
" X \n",
"шаг: O\n",
"X \n",
" O \n",
" X \n",
"шаг: X\n",
"X \n",
" O \n",
" O X \n",
"шаг: O\n",
"X \n",
" O X \n",
" O X \n",
"шаг: X\n",
"X \n",
" O X \n",
"O O X \n",
"шаг: O\n",
"X X \n",
" O X \n",
"O O X \n",
"шаг: X\n",
"X X O \n",
" O X \n",
"O O X \n",
"Эпизод 96, Общая награда: -1\n",
"Средняя награда: 0.34375\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
" X \n",
" O \n",
" \n",
"шаг: O\n",
"X X \n",
" O \n",
" \n",
"шаг: X\n",
"X X \n",
" O \n",
"O \n",
"шаг: O\n",
"X X \n",
" O \n",
"O X \n",
"шаг: X\n",
"X X \n",
" O O \n",
"O X \n",
"шаг: O\n",
"X X \n",
" O O \n",
"O X X \n",
"шаг: X\n",
"X X \n",
"O O O \n",
"O X X \n",
"Эпизод 97, Общая награда: -1\n",
"Средняя награда: 0.32989690721649484\n",
"шаг: O\n",
" X \n",
" \n",
" \n",
"шаг: X\n",
" X \n",
" O \n",
" \n",
"шаг: O\n",
" X \n",
" O \n",
" X \n",
"шаг: X\n",
"O X \n",
" O \n",
" X \n",
"шаг: O\n",
"O X \n",
" X O \n",
" X \n",
"шаг: X\n",
"O X \n",
" X O \n",
" O X \n",
"шаг: O\n",
"O X \n",
" X O \n",
"X O X \n",
"Эпизод 98, Общая награда: 1\n",
"Средняя награда: 0.336734693877551\n",
"шаг: O\n",
" \n",
" \n",
"X \n",
"шаг: X\n",
" \n",
"O \n",
"X \n",
"шаг: O\n",
" \n",
"O \n",
"X X \n",
"шаг: X\n",
" O \n",
"O \n",
"X X \n",
"шаг: O\n",
" O \n",
"O \n",
"X X X \n",
"Эпизод 99, Общая награда: 1\n",
"Средняя награда: 0.3434343434343434\n",
"шаг: O\n",
" \n",
" \n",
" X \n",
"шаг: X\n",
"O \n",
" \n",
" X \n",
"шаг: O\n",
"O X \n",
" \n",
" X \n",
"шаг: X\n",
"O X \n",
" O \n",
" X \n",
"шаг: O\n",
"O X X \n",
" O \n",
" X \n",
"шаг: X\n",
"O X X \n",
" O \n",
" O X \n",
"шаг: O\n",
"O X X \n",
" O \n",
"X O X \n",
"шаг: X\n",
"O X X \n",
"O O \n",
"X O X \n",
"шаг: O\n",
"O X X \n",
"O O X \n",
"X O X \n",
"Эпизод 100, Общая награда: 1\n",
"Средняя награда: 0.35\n"
]
}
],
"source": [
"environment = TicTacToeEnv()\n",
"\n",
"agent = Agent(symbol=1)\n",
"\n",
"num_episodes = 100 \n",
"collected_rewards = [] \n",
"\n",
"oom = 1\n",
"\n",
"for i in range(num_episodes):\n",
" state, _ = environment.reset() \n",
"\n",
" total_reward = 0\n",
"\n",
" done = False\n",
" om = oom \n",
"\n",
" for j in range(9): \n",
" moves = environment.move_generator() \n",
"\n",
" if not moves:\n",
" break\n",
"\n",
" \n",
" if len(moves) == 1:\n",
" move = moves[0]\n",
" else:\n",
" move = agent.get_action(moves)\n",
"\n",
" next_state, reward, done, info = environment.step(move)\n",
" total_reward += reward\n",
" state = next_state\n",
"\n",
" environment.render()\n",
"\n",
" if done:\n",
" break\n",
"\n",
" om = -om\n",
"\n",
" collected_rewards.append(total_reward)\n",
"\n",
" print(f\"Эпизод {i+1}, Общая награда: {total_reward}\")\n",
" average_reward = sum(collected_rewards) / len(collected_rewards)\n",
" print(f\"Средняя награда: {average_reward}\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "aimvenv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}