2024-12-07 05:30:11 +04:00

750 lines
83 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": [
"## Игра «Крестики-нолики».\n",
"\n",
"---\n",
"\n",
"## Исходный проект: [GitHub](https://github.com/nczempin/gym-tic-tac-toe).\n",
"\n",
"### Описание проекта:\n",
"\n",
"Проект представляет собой реализацию среды для игры в крестики-нолики с использованием библиотеки Gymnasium. Среда моделирует игровую логику с соблюдением правил, таких как легальность ходов, определение победителя и смена хода между игроками. Основные методы среды включают step(action) для выполнения хода, reset() для сброса игрового поля и render() для отображения текущего состояния игры. Также реализован генератор возможных ходов.\n",
"\n",
"Для тестирования и демонстрации работы используется случайный выбор хода, который осуществляется с помощью функции random_move(). Игровой процесс симулируется в серии эпизодов (300 партий), где игроки делают ходы до окончания игры. После каждого эпизода вычисляются награды и отображаются результаты.\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Реализация среды:\n",
"\n",
"**Среда (environment)** среда, в которой объект выполняет действия для решения задачи."
]
},
{
"cell_type": "code",
"execution_count": 131,
"metadata": {},
"outputs": [],
"source": [
"import gymnasium as gym\n",
"from gymnasium import spaces\n",
"\n",
"\n",
"class TicTacToeEnv(gym.Env):\n",
" metadata = {'render.modes': ['human']}\n",
" \n",
" symbols = ['O', ' ', 'X'];\n",
"\n",
" def __init__(self) -> None:\n",
" super().__init__()\n",
" self.action_space = spaces.Discrete(9)\n",
" self.observation_space = spaces.Discrete(9*3*2) # flattened\n",
" self.reset()\n",
" \n",
" def step(self, action):\n",
" done = False\n",
" reward = 0\n",
"\n",
" p, square = action\n",
" \n",
" # check move legality\n",
" board = self.state['board']\n",
" proposed = board[square]\n",
" om = self.state['on_move']\n",
" \n",
" if proposed != 0: # wrong player, not empty\n",
" print(\"illegal move \", action, \". (square occupied): \", square)\n",
" done = True\n",
" reward = -1 * om # player who did NOT make the illegal mov\n",
" if p != om: # wrong player, not empty\n",
" print(\"illegal move \", action, \" not on move: \", p)\n",
" done = True\n",
" reward = -1 * om # player who did NOT make the illegal move\n",
" else:\n",
" board[square] = p\n",
" self.state['on_move'] = -p\n",
"\n",
" # check game over\n",
" for i in range(3):\n",
" # horizontals and verticals\n",
" if ((board[i * 3] == p and board[i * 3 + 1] == p and board[i * 3 + 2] == p)\n",
" or (board[i + 0] == p and board[i + 3] == p and board[i + 6] == p)):\n",
" reward = p\n",
" done = True\n",
" break\n",
" # diagonals\n",
" if ((board[0] == p and board[4] == p and board[8] == p)\n",
" or (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(\"on move: \" , 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",
" 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": [
"### Реализация основного цикла обучения:"
]
},
{
"cell_type": "code",
"execution_count": 132,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"on move: O\n",
" \n",
" \n",
"X \n",
"\n",
"on move: X\n",
" \n",
"O \n",
"X \n",
"\n",
"on move: O\n",
" X \n",
"O \n",
"X \n",
"\n",
"on move: X\n",
"O X \n",
"O \n",
"X \n",
"\n",
"on move: O\n",
"O X \n",
"O \n",
"X X \n",
"\n",
"on move: X\n",
"O X O \n",
"O \n",
"X X \n",
"\n",
"on move: O\n",
"O X O \n",
"O X \n",
"X X \n",
"\n",
"on move: X\n",
"O X O \n",
"O X O \n",
"X X \n",
"\n",
"on move: O\n",
"O X O \n",
"O X O \n",
"X X X \n",
"\n",
"Episode 50, Total Reward: 1\n",
"Average Reward: 0.34\n",
"\n",
"on move: O\n",
" X \n",
" \n",
" \n",
"\n",
"on move: X\n",
" X \n",
" \n",
"O \n",
"\n",
"on move: O\n",
" X \n",
"X \n",
"O \n",
"\n",
"on move: X\n",
"O X \n",
"X \n",
"O \n",
"\n",
"on move: O\n",
"O X X \n",
"X \n",
"O \n",
"\n",
"on move: X\n",
"O X X \n",
"X O \n",
"O \n",
"\n",
"on move: O\n",
"O X X \n",
"X X O \n",
"O \n",
"\n",
"on move: X\n",
"O X X \n",
"X X O \n",
"O O \n",
"\n",
"on move: O\n",
"O X X \n",
"X X O \n",
"O X O \n",
"\n",
"Episode 100, Total Reward: 1\n",
"Average Reward: 0.36\n",
"\n",
"on move: O\n",
"X \n",
" \n",
" \n",
"\n",
"on move: X\n",
"X \n",
" \n",
"O \n",
"\n",
"on move: O\n",
"X \n",
"X \n",
"O \n",
"\n",
"on move: X\n",
"X \n",
"X \n",
"O O \n",
"\n",
"on move: O\n",
"X X \n",
"X \n",
"O O \n",
"\n",
"on move: X\n",
"X X \n",
"X \n",
"O O O \n",
"\n",
"Episode 150, Total Reward: -1\n",
"Average Reward: 0.35333333333333333\n",
"\n",
"on move: O\n",
" \n",
" \n",
" X \n",
"\n",
"on move: X\n",
" \n",
" O \n",
" X \n",
"\n",
"on move: O\n",
" X \n",
" O \n",
" X \n",
"\n",
"on move: X\n",
"O X \n",
" O \n",
" X \n",
"\n",
"on move: O\n",
"O X X \n",
" O \n",
" X \n",
"\n",
"on move: X\n",
"O X X \n",
"O O \n",
" X \n",
"\n",
"on move: O\n",
"O X X \n",
"O O \n",
"X X \n",
"\n",
"on move: X\n",
"O X X \n",
"O O \n",
"X X O \n",
"\n",
"on move: O\n",
"O X X \n",
"O X O \n",
"X X O \n",
"\n",
"Episode 200, Total Reward: 1\n",
"Average Reward: 0.355\n",
"\n",
"on move: O\n",
" X \n",
" \n",
" \n",
"\n",
"on move: X\n",
" X \n",
" \n",
"O \n",
"\n",
"on move: O\n",
" X \n",
" \n",
"O X \n",
"\n",
"on move: X\n",
"O X \n",
" \n",
"O X \n",
"\n",
"on move: O\n",
"O X \n",
" \n",
"O X X \n",
"\n",
"on move: X\n",
"O X O \n",
" \n",
"O X X \n",
"\n",
"on move: O\n",
"O X O \n",
"X \n",
"O X X \n",
"\n",
"on move: X\n",
"O X O \n",
"X O \n",
"O X X \n",
"\n",
"Episode 250, Total Reward: -1\n",
"Average Reward: 0.384\n",
"\n",
"on move: O\n",
"X \n",
" \n",
" \n",
"\n",
"on move: X\n",
"X \n",
" O \n",
" \n",
"\n",
"on move: O\n",
"X \n",
" O \n",
" X \n",
"\n",
"on move: X\n",
"X \n",
" O O \n",
" X \n",
"\n",
"on move: O\n",
"X \n",
"X O O \n",
" X \n",
"\n",
"on move: X\n",
"X O \n",
"X O O \n",
" X \n",
"\n",
"on move: O\n",
"X O \n",
"X O O \n",
" X X \n",
"\n",
"on move: X\n",
"X O O \n",
"X O O \n",
" X X \n",
"\n",
"on move: O\n",
"X O O \n",
"X O O \n",
"X X X \n",
"\n",
"Episode 300, Total Reward: 1\n",
"Average Reward: 0.36333333333333334\n",
"\n"
]
}
],
"source": [
"import random\n",
"\n",
"\n",
"def random_move(moves):\n",
" m = random.choice(moves)\n",
" return m\n",
"\n",
"\n",
"env = TicTacToeEnv()\n",
"\n",
"alpha = 0.01\n",
"beta = 0.01\n",
"\n",
"num_episodes = 300\n",
"\n",
"collected_rewards = []\n",
"oom = 1\n",
"\n",
"for i in range(num_episodes):\n",
" state = env.reset()\n",
" \n",
" total_reward = 0\n",
" \n",
" done = False\n",
" om = oom;\n",
"\n",
" for j in range(9):\n",
" moves = env.move_generator()\n",
" if not moves:\n",
" break\n",
" \n",
" if len(moves) == 1:\n",
" # only a single possible move\n",
" move = moves[0]\n",
" else:\n",
" move = random_move(moves)\n",
" \n",
" next_state, reward, done, info = env.step(move)\n",
" total_reward += reward\n",
" state = next_state\n",
" \n",
" if (i + 1) % 50 == 0: \n",
" env.render()\n",
" \n",
" if done:\n",
" break\n",
" \n",
" om = -om\n",
"\n",
" collected_rewards.append(total_reward)\n",
" \n",
" if (i + 1) % 50 == 0: \n",
" print(f\"Episode {i+1}, Total Reward: {total_reward}\")\n",
" average_reward = sum(collected_rewards) / len(collected_rewards)\n",
" print(f\"Average Reward: {average_reward}\\n\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Обновлённая реализация проекта.\n",
"\n",
"### Описание проекта:\n",
"\n",
"\n",
"\n",
"### Основные изменения:\n",
"\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Реализация среды:\n",
"\n",
"**Среда (environment)** среда, в которой объект выполняет действия для решения задачи."
]
},
{
"cell_type": "code",
"execution_count": 133,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"\n",
"class TicTacToeEnv(gym.Env):\n",
" metadata: dict[str, list[str]] = {\"render_modes\": [\"ansi\"]}\n",
" \n",
" def __init__(self) -> None:\n",
" self.action_space = spaces.Discrete(9) # 9 клеток\n",
" self.observation_space = spaces.Box(low=-1, high=1, shape=(9,), dtype=int)\n",
" self.symbols: dict[int, str] = {1: \"X\", -1: \"O\", 0: \" \"}\n",
"\n",
" self.reset()\n",
"\n",
" def reset(self, seed=None):\n",
" super().reset(seed=seed)\n",
" self.board = np.zeros(9, dtype=int) # Пустое поле\n",
" self.current_player = 1 # Ход первого игрока\n",
" return self.board\n",
"\n",
" def step(self, action):\n",
" if self.board[action] != 0:\n",
" # Нелегальный ход (клетка уже занята)\n",
" reward = -self.current_player # Штраф за нелегальный ход: награду получает тот, кто НЕ совершил ошибку\n",
" self.current_player *= -1 # Смена хода к следующему игроку\n",
" return self.board, reward, False, False, {}\n",
"\n",
" # Совершение хода\n",
" self.board[action] = self.current_player\n",
"\n",
" # Проверка на победу\n",
" if self.check_winner(self.current_player):\n",
" reward = self.current_player\n",
" terminated = True\n",
" elif np.all(self.board != 0):\n",
" # Ничья\n",
" reward = 0\n",
" terminated = True\n",
" else:\n",
" # Продолжение игры\n",
" reward = 0\n",
" terminated = False\n",
" self.current_player *= -1 # Смена хода\n",
"\n",
" return self.board, reward, terminated, False, {}\n",
"\n",
" def check_winner(self, player):\n",
" winning_positions: list[tuple[int, int, int]] = [\n",
" (0, 1, 2), (3, 4, 5), (6, 7, 8), # Горизонтали\n",
" (0, 3, 6), (1, 4, 7), (2, 5, 8), # Вертикали\n",
" (0, 4, 8), (2, 4, 6), # Диагонали\n",
" ]\n",
" for positions in winning_positions:\n",
" if all(self.board[pos] == player for pos in positions):\n",
" return True\n",
" return False\n",
"\n",
" def render(self):\n",
" board = self.board.reshape(3, 3)\n",
" print(\"\\n\".join(\" | \".join(self.symbols[cell] for cell in row) for row in board))\n",
" print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Реализация агента:\n",
"\n",
"**Агент (agent)** объект обучения, который выполняет действия в некоторой среде для получения вознаграждения, принимая решения на основе своих целей и информации, которую он получает."
]
},
{
"cell_type": "code",
"execution_count": 134,
"metadata": {},
"outputs": [],
"source": [
"class TicTacToeAgent:\n",
" def __init__(self, learning_rate=0.1, discount_factor=0.9, epsilon=0.1):\n",
" self.q_table = {} # Q-таблица\n",
" self.learning_rate = learning_rate\n",
" self.discount_factor = discount_factor\n",
" self.epsilon = epsilon\n",
"\n",
" def get_state_key(self, state):\n",
" return tuple(state)\n",
"\n",
" def select_action(self, state, possible_actions):\n",
" state_key = self.get_state_key(state)\n",
" if np.random.rand() < self.epsilon or state_key not in self.q_table:\n",
" # Исследование: случайный ход\n",
" return np.random.choice(possible_actions)\n",
" # Эксплуатация: выбор действия с максимальным Q-значением\n",
" return max(possible_actions, key=lambda a: self.q_table.get((state_key, a), 0))\n",
"\n",
" def update(self, state, action, reward, next_state, possible_actions, terminated):\n",
" state_key = self.get_state_key(state)\n",
" next_state_key = self.get_state_key(next_state)\n",
"\n",
" if (state_key, action) not in self.q_table:\n",
" self.q_table[(state_key, action)] = 0\n",
"\n",
" if terminated:\n",
" future_reward = 0\n",
" else:\n",
" future_reward = max(self.q_table.get((next_state_key, a), 0) for a in possible_actions)\n",
"\n",
" # Формула Q-learning\n",
" td_target = reward + self.discount_factor * future_reward\n",
" td_error = td_target - self.q_table[(state_key, action)]\n",
" self.q_table[(state_key, action)] += self.learning_rate * td_error"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Реализация основного цикла обучения:"
]
},
{
"cell_type": "code",
"execution_count": 135,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Average Reward (last 50 episodes): 0.26\n",
"Average Reward (last 50 episodes): 0.26\n",
"Average Reward (last 50 episodes): 0.42\n",
"Average Reward (last 50 episodes): 0.38\n",
"Average Reward (last 50 episodes): 0.38\n",
"Average Reward (last 50 episodes): 0.26\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC1n0lEQVR4nOzdd3gU1dvG8XvTCSGE0EIJvSpFinQIVYo0pfcOFlS6oiBFRBRpooIFARGk+KNYKKIEUUAUAbFRDU2atIT0TTLvH/MmEpJAApvsbvL9XNde7Jk5M/Ps5pDy7DnPWAzDMAQAAAAAAABkIRd7BwAAAAAAAICch6QUAAAAAAAAshxJKQAAAAAAAGQ5klIAAAAAAADIciSlAAAAAAAAkOVISgEAAAAAACDLkZQCAAAAAABAliMpBQAAAAAAgCxHUgoAAAAAAABZjqQUAAA5wMCBA1WqVCmbnnPZsmWyWCw6deqUTc/raGbPnq0yZcrI1dVVDz30kL3DQTYwdepUWSyWLL3mqVOnZLFYtGzZsiy9LgAAd0JSCgCAdDp58qRGjBihMmXKyMvLS76+vmrYsKEWLFigqKgoe4eXaWbOnKmNGzfaO4wkicmwxIeXl5cqVKigkSNH6tKlSza91tdff60JEyaoYcOGWrp0qWbOnGnT8+dUX375pdq0aaP8+fMnff3GjRunq1ev2ju0FG4fb7c/fvzxR3uHCACA03KzdwAAADiDr776St26dZOnp6f69++vKlWqKDY2Vj/88IPGjx+vP/74Q++//769w8wUM2fOVNeuXdW5c+dk2/v166eePXvK09PTLnFNnz5dpUuXVnR0tH744QctWrRImzdv1u+//y5vb2+bXGPHjh1ycXHRkiVL5OHhYZNz5nTjxo3TnDlzVL16dT3//PPy9/fXgQMH9Pbbb2v16tX69ttvVbFiRXuHmULieLtduXLlMnyuSZMm6YUXXrBFWAAAODWSUgAA3EVISIh69uypkiVLaseOHSpSpEjSvqefflonTpzQV199ZccI7cPV1VWurq52u37btm1Vu3ZtSdLQoUOVP39+zZ07V5s2bVKvXr3u69yRkZHy9vbW5cuXlStXLpslpAzDUHR0tHLlymWT8zmbTz/9VHPmzFGPHj20cuXKZONn4MCBatasmbp166YDBw7IzS3rfk2NiIhQ7ty579jn1vF2v9zc3LL09QEA4KhYvgcAwF288cYbCg8P15IlS5IlpBKVK1dOzz33nKQ7122xWCyaOnVqUjuxrsyxY8fUt29f5c2bVwULFtTkyZNlGIbOnj2rTp06ydfXVwEBAZozZ06y86VV02nnzp2yWCzauXPnHV/Xm2++qQYNGih//vzKlSuXatWqpc8++yxFzBEREVq+fHnScqWBAwemev327durTJkyqV6rfv36Kf6g/+STT1SrVi3lypVL/v7+6tmzp86ePXvHmO+kefPmkswkYkau0bRpU1WpUkW//PKLmjRpIm9vb7344ouyWCxaunSpIiIikl574tc1Li5Or7zyisqWLStPT0+VKlVKL774omJiYpKdu1SpUmrfvr22bdum2rVrK1euXHrvvfeSvkZr167VtGnTVKxYMeXJk0ddu3ZVaGioYmJiNGrUKBUqVEg+Pj4aNGhQinMvXbpUzZs3V6FCheTp6akHHnhAixYtSvG+JMbwww8/qE6dOvLy8lKZMmX08ccfp+h748YNjR49WqVKlZKnp6eKFy+u/v3768qVK0l9YmJiNGXKFJUrV06enp4KDAzUhAkTUsSXmmnTpilfvnx6//33UyQ069Spo+eff16//fZb0jgcOXKkfHx8FBkZmeJcvXr1UkBAgOLj45O2bdmyRY0bN1bu3LmVJ08ePfroo/rjjz+SHTdw4ED5+Pjo5MmTateunfLkyaM+ffrcNfa7Sfy//+abb2revHkqWbKkcuXKpaCgIP3+++/J+qZWU2r79u1q1KiR/Pz85OPjo4oVK+rFF19M1ufy5csaMmSIChcuLC8vL1WvXl3Lly9PEcuNGzc0cOBA5c2bV35+fhowYIBu3LiRatxHjhxR165d5e/vLy8vL9WuXVuff/55sj5Wq1XTpk1T+fLl5eXlpfz586tRo0bavn37PbxTAAD8h6QUAAB38cUXX6hMmTJq0KBBppy/R48eSkhI0KxZs1S3bl3NmDFD8+fPV6tWrVSsWDG9/vrrKleunMaNG6ddu3bZ7LoLFixQjRo1NH36dM2cOVNubm7q1q1bsllfK1askKenpxo3bqwVK1ZoxYoVGjFiRJqvIyQkRD///HOy7adPn9aPP/6onj17Jm179dVX1b9/f5UvX15z587VqFGj9O2336pJkyZp/vF8NydPnpQk5c+fP8PXuHr1qtq2bauHHnpI8+fPV7NmzbRixQo1btxYnp6eSa+9SZMmksyZWS+//LJq1qypefPmKSgoSK+99lqy15jo6NGj6tWrl1q1aqUFCxYkK5b+2muvadu2bXrhhRc0ePBgrV+/Xk888YQGDx6sY8eOaerUqXr88ce1bNkyvf7668nOu2jRIpUsWVIvvvii5syZo8DAQD311FN65513UsRw4sQJde3aVa1atdKcOXOUL18+DRw4MFnCJjw8XI0bN9bChQv1yCOPaMGCBXriiSd05MgRnTt3TpKUkJCgjh076s0331SHDh20cOFCde7cWfPmzVOPHj3u+PU5fvy4jh49mpRoTU3//v0lmTWnJHNMRUREpJiJGBkZqS+++EJdu3ZNSm6tWLFCjz76qHx8fPT6669r8uTJ+vPPP9WoUaMUidu4uDi1bt1ahQoV0ptvvqkuXbrcMXZJCg0N1ZUrV5I9UquB9fHHH+utt97S008/rYkTJ+r3339X8+bN71jv7I8//lD79u0VExOj6dOna86cOerYsaN2796d1CcqKkpNmzbVihUr1KdPH82ePVt58+bVwIEDtWDBgqR+hmGoU6dOWrFihfr27asZM2bo3LlzGjBgQKrXrVevnv766y+98MILmjNnjnLnzq3OnTtrw4YNSf2mTp2qadOmqVmzZnr77bf10ksvqUSJEjpw4MBd3zcAAO7IAAAAaQoNDTUkGZ06dUpX/5CQEEOSsXTp0hT7JBlTpkxJak+ZMsWQZAwfPjxpW1xcnFG8eHHDYrEYs2bNStp+/fp1I1euXMaAAQOSti1dutSQZISEhCS7TnBwsCHJCA4OTto2YMAAo2TJksn6RUZGJmvHxsYaVapUMZo3b55se+7cuZNdN63rh4aGGp6ensbYsWOT9XvjjTcMi8VinD592jAMwzh16pTh6upqvPrqq8n6/fbbb4abm1uK7Wld95tvvjH+/fdf4+zZs8bq1auN/PnzG7ly5TLOnTuXoWsEBQUZkozFixenuNaAAQOM3LlzJ9t26NAhQ5IxdOjQZNvHjRtnSDJ27NiRtK1kyZKGJGPr1q3J+iZ+japUqWLExsYmbe/Vq5dhsViMtm3bJutfv379u379DMMwWrdubZQpUybZtsQYdu3albTt8uXLKb5WL7/8siHJWL9+fYrzJiQkGIZhGCtWrDBcXFyM77//Ptn+xYsXG5KM3bt3pzg20caNGw1Jxrx589LsYxiG4evra9SsWTPpusWKFTO6dOmSrM/atWuTvaabN28afn5+xrBhw5L1u3jxopE3b95k2wcMGGBIMl544YU7xpEocbyl9vD09Ezql/h/P3EMJtq3b58hyRg9enTStsT/+4nmzZtnSDL+/fffNOOYP3++Icn45JNPkrbFxsYa9evXN3x8fIywsDDDMP57n994442kfnFxcUbjxo1TfG9q0aKFUbVqVSM6OjppW0JCgtGgQQOjfPnySduqV69uPProo+l6vwAAyAhmSgEAcAdhYWGSpDx58mTaNYYOHZr03NXVVbVr15ZhGBoyZEjSdj8/P1WsWFF///23za57a12j69evKzQ0VI0bN77n2Q++vr5q27at1q5dK8MwkravWbNG9erVU4kSJSRJ69evV0JCgrp3755s1klAQIDKly+v4ODgdF2vZcuWKliwoAIDA9WzZ0/5+Phow4YNKlasWIav4enpqUGDBqXrups3b5YkjRkzJtn2sWPHSlKKWT2lS5dW69atUz1X//795e7untSuW7euDMPQ4MGDk/WrW7euzp49q7i4uKRtt379EmfxBAUF6e+//1ZoaGiy4x944AE1btw4qV2wYMEU4+l///ufqlevrsceeyxFnIlLzdatW6fKlSurUqVKyd7XxKWTd/ra3bx5U9Ld/y/lyZMn6f+dxWJRt27dtHnzZoWHhyf1WbNmjYoVK6ZGjRpJMpe+3bhxQ7169UoWl6urq+rWrZtqXE8++eQd47jdO++8o+3btyd7bNmyJUW/zp07q1ixYkntOnXqqG7duknjJjV+fn6SpE2bNikhISHVPps3b1ZAQECyemnu7u569tlnFR4eru+++y6pn5ubW7LX5+rqqmeeeSbZ+a5du6YdO3aoe/fuunnzZrLZX61bt9bx48f1zz//JMX3xx9/6Pjx43d5lwAAyBgqLAIAcAeJy4wS/6DODInJmkR58+aVl5eXChQokGJ7asuF7tWXX36pGTNm6NChQ8nqAd1e6yYjevTooY0bN2rv3r1q0KCBTp48qV9++UXz589P6nP8+HEZhqHy5cuneo5bkzR38s4776hChQpyc3NT4cKFVbFiRbm4uNzTNYoVK5buYuanT5+Wi4tLiruuBQQEyM/PT6dPn062PbU7tiVK7WsvSYGBgSm2JyQkKDQ0NGl54u7duzVlyhTt3bs3Rc2l0NDQpHOldh1Jypcvn65fv57UPnny5F2XsR0/flx//fWXChYsmOr+y5cvp3lsYjLqbv+Xbt68qUKFCiW1e/Toofnz5+vzzz9X7969FR4ers2bN2vEiBFJYzUxWZKYHLvd7csF3dzcVLx48TvGcbs6deqkq9B5amOuQoUKWrt2bZrH9OjRQx9++KGGDh2qF154QS1atNDjjz+url27Jo3p06dPq3z58kntRJUrV07an/hvkSJF5OPjk6zf7Xc0PHHihAzD0OTJkzV58uRU47p8+bKKFSum6dOnq1OnTqpQoYKqVKmiNm3aqF+/fqpWrdpd3g0AAO6MpBQAAHfg6+urokWLpihUnJa0Ejq3FmO+XWp3sEvrrna3zkC6l2sl+v7779WxY0c1adJE7777rooUKSJ3d3ctXbpUq1atuuvxaenQoYO8vb21du1aNWjQQGvXrpWLi4u6deuW1CchIUEWi0VbtmxJ9XXe/sd0Wu6UJMjoNe7lbnjpTd7d6dxpfZ3v9vU/efKkWrRooUqVKmnu3LkKDAyUh4eHNm/erHnz5qWYbZOe8ZQeCQkJqlq1qubOnZvq/tuTabdKTJ4cPnw4zT6nT59WWFiYHnjggaRt9erVU6lSpbR27Vr17t1bX3zxhaKiopLVsEp8vStWrFBAQECK895+pztPT88UyR17ypUrl3bt2qXg4GB99dVX2rp1q9asWaPmzZvr66+/zpS7XCa+Z+PGjUtzJl9i4rVJkyY6efKkNm3apK+//loffvih5s2bp8WLFyeb6QkAQEaRlAIA4C7at2+v999/X3v37lX9+vXv2DdfvnySlKKQ9u2zZ2zhfq71v//9T15eXtq2bZs8PT2Tti9dujRF34zMnMqdO7fat2+vdevWae7cuVqzZo0aN26sokWLJvUpW7asDMNQ6dKlVaFChXSfOyMy8xolS5ZUQkKCjh8/npRokaRLly7pxo0bKlmypE2vl5ovvvhCMTEx+vzzz5PNgkrv0sfUlC1b9q7J17Jly+rXX39VixYtMjyjrkKFCqpQoYI2btyoBQsWpLqML/GOgO3bt0+2vXv37lqwYIHCwsK0Zs0alSpVSvXq1UsWlyQVKlRILVu2zFBctpbaErdjx46pVKlSdzzOxcVFLVq0UIsWLTR37lzNnDlTL730koKDg9WyZUuVLFlShw8fVkJCQrKE2pEjRyQpadyVLFlS3377rcLDw5MlX48ePZrseol3ynR3d0/Xe+bv769BgwZp0KBBCg8PV5MmTTR16lSSUgCA++I4HxEBAOCgJkyYoNy5c2vo0KGp3kHr5MmTSXe/8vX1VYECBVLcJe/dd9+1eVyJf4jfeq34+Hi9//77dz3W1dVVFosl2ayqU6dOaePGjSn65s6dO0N3xOvRo4fOnz+vDz/8UL/++muKu7I9/vjjcnV11bRp01LM1DEMwyZLFDPzGu3atZOkZEsSJSXNHnr00Ufv+dzplThz5tbXFhoammpSMb26dOmiX3/9Ndld1xIlXqd79+76559/9MEHH6ToExUVpYiIiDte4+WXX9b169f1xBNPpJjR98svv+j1119XlSpVUiwj7NGjh2JiYrR8+XJt3bpV3bt3T7a/devW8vX11cyZM2W1WlNc999//71jXLa0cePGpFpMkvTTTz9p3759atu2bZrHXLt2LcW2xLs0Ji6tbdeunS5evKg1a9Yk9YmLi9PChQvl4+OjoKCgpH5xcXFatGhRUr/4+HgtXLgw2fkLFSqkpk2b6r333tOFCxdSXP/W9+z2/y8+Pj4qV65csmW/AADcC2ZKAQBwF2XLltWqVavUo0cPVa5cWf3791eVKlUUGxurPXv2aN26dRo4cGBS/6FDh2rWrFkaOnSoateurV27dunYsWM2j+vBBx9UvXr1NHHiRF27dk3+/v5avXp1smLYaXn00Uc1d+5ctWnTRr1799bly5f1zjvvqFy5cimWV9WqVUvffPON5s6dq6JFi6p06dKqW7dumudu166d8uTJo3HjxsnV1TVFgqFs2bKaMWOGJk6cqFOnTqlz587KkyePQkJCtGHDBg0fPlzjxo27tzclC65RvXp1DRgwQO+//75u3LihoKAg/fTTT1q+fLk6d+6sZs2a3Vfs6fHII4/Iw8NDHTp00IgRIxQeHq4PPvhAhQoVSjXBkB7jx4/XZ599pm7dumnw4MGqVauWrl27ps8//1yLFy9W9erV1a9fP61du1ZPPPGEgoOD1bBhQ8XHx+vIkSNau3attm3bdse6S3369NHPP/+sBQsW6M8//1SfPn2UL18+HThwQB999JHy58+vzz77LEXNr5o1a6pcuXJ66aWXFBMTkyLR6evrq0WLFqlfv36qWbOmevbsqYIFC+rMmTP66quv1LBh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t99+q7p16+qZZ55R3759tWTJEp05c0ajR4/OjBgBAADsJz7enA316qtmkfJb5colLVokcXdiAACADMtwUmrWrFlJz3v06KESJUpo7969Kl++vDp06GDT4AAAAOzqwgWzXtTOnWb7ySel/v3/21+unFSggF1CAwAAcHYZTkrdrn79+qpfv74tYgEAAHActxYw9/GRPvhA6tnT3lEBAABkG+lKSn3++efpPmHHjh3vORgAAAC7i4+XZs78r4B51arSunVmIXMAAADYTLqSUp07d07XySwWi+Lj4+8nHgAAAPu5fFnq21favt1sDxkivfUWBcwBAIBN7NsnvfaadPNmyn2G4aorVxrIYrEop8z3SVdSKiEhIbPjAAAAsK/vvzeX550/TwFzAABgU4YhzZ8vTZggxcWl1ctFUkFduJBmh2znvmtKAQAAOLWEBGn2bOmll8yle5Urm8v1HnzQ3pEBAAA7i4uTjhwxf124V/Hx0iuvSBs2mO1u3aTHH0/tWnE6dOiQgoKq3/vFnEyGk1LTp0+/4/6XX375noMBAADIUlevmnfT27zZbPfta86Q8vGxb1wAAMDufv/dTCAdOWKb83l4SPPmmTfztVhS7rdaDeXJ84/KliUplaYNiam9/2e1WhUSEiI3NzeVLVuWpBQAAHAOP/4ode8unT0reXpKb79t1pBK7bdEAACQoyxbJj31lBQVZZaWzJPn/s5XooT07rtS7do2CS/byHBS6uDBgym2hYWFaeDAgXrsscdsEhQAAIBNXb4szZkj/fuv2Y6JkdauNefklytnLtd76CG7hggAAO5PTIy0YMH9z2y6cEHautV8/sgj0ooVUqFC9x8fUrJJTSlfX19NmzZNHTp0UL9+/WxxSgAAANvYtUvq1cssYH67bt2kDz+UfH2zPi4AAGAzISHmBOj9+21zPhcXaepU6cUXJVdX25wTKdms0HloaKhCQ0NtdToAAID7k1oB8/79/1ueV7Gi1KkTy/UAAHBQERHmj/C7+fZbafBg6cYNyd9feu45c2X+/WjeXHr44fs7B+4uw0mpt956K1nbMAxduHBBK1asUNu2bW0WGAAAwD27vYB5v35mAfPcue0bFwAAuKvQUGnECGnNmowdV6+eeUyJEpkTF2wvw0mpefPmJWu7uLioYMGCGjBggCZOnGizwAAAAO7JrQXMvbykhQspYA4A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aN7Vrn5925wPAJAxJKUAADme5bvv1HT0aLlcv26u3XjvPalvX3uHBQDZntUqnTlz936GIc2ZIy1ebLabNpX69bu/a3t6Su3aSfny3d95AAD3jqQUACDnSkiQZs2S6+TJcktIkPHAA7J89plZ7AMAkKn27jXvJ5GepFQii0WaNEmaMkVydc282AAAWYOkFAAgZ7pyxfyYfetWWSSdadZMRdavl7ufn70jA4BszTCkefOk55+X4uLMGUseHnc/LiBAWrhQat0682MEAGQNklIAgOwvPl768EOzqq1k/kW0aZN07pzk5aW4hQt1sGBBFeGOegBgc3v3mne4i4sz23/9JX37rfm8Z0/p/felPHnsFx8AwH5ISgEAsrdLl6Q+ff77C+hWFSpI69bJqFxZ2rw562MDgGwsIUF6/XVzuV1CQvJ9Hh7SggXSiBHc8Q4AcjKSUgAA52YYKf/aSfT991KvXtLFi2YB86ee+u9uev7+0pAh5sfzVmvWxQsA2VRCgjkxNT5eunFDGjBA2rLF3Pf449KDD5rPXV3NdtWqdgsVAOAgSEoBAJzXxo3Sk0+aSac7efBBad06CpgDQCaIj5dmzJBef91NUVGdku3z8pLeflsaPJgZUQCAlEhKAQCcT2ys9MILZqXcO7FYpIEDzcq41IsCAJtLvkI6edapcmVp9WqpWjW7hAYAcAIkpQAAzuXMGalHD+nHH832mDHSxImSi0vKvh4eko9P1sYHANlUXJy0Zo104cJ/7bfeMtve3tLChXHy8PharVq1kru7u/LlY3YUAODOSEoBAJzHV19J/ftL165Jfn7SsmVSp053OwoAcJ/OnzdL9O3alXLfAw+YK6TLlze0ebNV/v6Su3vWxwgAcD6pfKzsOKZOnSqLxZLsUalSpaT90dHRevrpp5U/f375+PioS5cuunTpkh0jBgBkirg4czZU+/ZmQqp2benAARJSAJAFvvlGeughMyHl42Mu1+vXz3y8/LL0009mYgoAgIxy+JlSDz74oL755puktpvbfyGPHj1aX331ldatW6e8efNq5MiRevzxx7V79257hAoAsJWNG817iN+4Ybajo6WrV83nzzwjzZ4teXraKzoAcGqRkdK4cdIXX5g3ML2b8+fNftWqmTOiKlTI/BgBADmDwyel3NzcFBAQkGJ7aGiolixZolWrVql58+aSpKVLl6py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GVJnz9LAHA6xeLH06KNFz4gaOlR64w0WYgQAT7X3zF71WthLW45tccr4bWu01dzucxVbjv9VAIDLQVEKQOmSlWVWCKZNM7c7dDAf3aOBOa5Qbq707LPS5MnmtsVyfjZUpUrmbKkePdwWHgCgGIm/JKr/f/srPTddkhzaJDzYL1jDbx6ucW3HFdmcHABwadw5AXgvwzCnr2zadP69pUulHTvMqsH48dLo0XSKRiHbtknz50t5eea2zeaj33+vr+++8ymULt98I/3wg/n6qaekCRMkf3/XxgsAKJlfT/+qWdtmKScvR5J0OO2w5u6YK0lqXa215nWfp2vCrnFniACAv6AoBcA7ZWRIAweaHaEvFBMjzZkj3Xmn6+OCRzMMacoUafhwcwbUeb6S6lz0vIgIacYMs98TAMAzzd42W49/+bgyrZmF9j1767P6553/ZDYTAHgY7soAvM+FDcz79pXCw819YWHSY49JcXFuDRGeJz1dGjDAnCElmU923nij+dput+n33/erVq2a8vEpOFUqJETq31+qUcO18QIASiY7L1vDlg3TRz9+JEm6teqtanlNS0mSxWJRlzpddGdN/qMKADwRRSkA7mezmSvjvfWW2Zi8OFarOeWlcmWzwtC6tfNjhFOlpJh96T//XLLbnXMNm8388vMzV8wbPvx8byir1a6lS39Rly7V5e/P454Ayg7DMDR181SNWztOqTmpVz2e3W6Xz3bXrnJrs9tkM2yyyKIX2rygcbePk68P93IA8AYUpQC414kTUny8tGrV5Z3XubP06adSdLRz4oLLbN4sPfCAtH+/869Vvbo0d67UqpXzrwUAni49J10Dvhig+b/Md+zANscOVxIxoTH69L5P1fHajq6/OADgilGUAuBcR46o+ooV8jl8uHDD8Zwc6fXXpWPHzGek3n9fat+++DH9/c2+UfBIVqs54+nUqeKPPXbMnLWUmyvVrCnNnGn+6iyxseZMKQBlm2EYWr53uQ6kHHB3KG5jN+x65/t39OvpX+Xn46eJ7SaqZ4OeVzWm1WrVmjVrdOedd8rfxStCVAqtpADfAJdeEwBw9finOQDn+e9/5ZeQoMYpKZc+7vrrpYULpfr1XRIWnOePP6SePaX//e/yzuvWTZo+3WwoDgDOlJqdqke/eFQLdy50dygeoUpYFS24f4FaVb36KaRWq1VRAVGqElbF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",
"text/plain": [
"<Figure size 1200x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"\n",
"# Параметры обучения\n",
"learning_rate = 0.1\n",
"discount_factor = 0.9\n",
"epsilon = 0.1\n",
"episodes = 300\n",
"\n",
"# Инициализация среды и агента\n",
"env = TicTacToeEnv()\n",
"agent = TicTacToeAgent(learning_rate, discount_factor, epsilon)\n",
"\n",
"# Инициализация метрик\n",
"statistics = {\n",
" \"Episode\": [],\n",
" \"Total Reward\": [],\n",
" \"Wins_X\": [],\n",
" \"Wins_O\": [],\n",
" \"Draws\": [],\n",
"}\n",
"\n",
"for episode in range(episodes):\n",
" state = env.reset()\n",
" done = False\n",
" total_reward = 0\n",
" wins_X = 0\n",
" wins_O = 0\n",
" draws = 0\n",
"\n",
" while not done:\n",
" possible_actions = [i for i in range(9) if state[i] == 0]\n",
" action = agent.select_action(state, possible_actions)\n",
" next_state, reward, terminated, truncated, _ = env.step(action)\n",
"\n",
" # Обновление Q-таблицы\n",
" agent.update(state, action, reward, next_state, possible_actions, terminated)\n",
"\n",
" # Статистика\n",
" total_reward += reward\n",
" if reward == 1:\n",
" wins_X += 1\n",
" if reward == -1:\n",
" wins_O += 1\n",
" elif reward == 0 and terminated: # Ничья\n",
" draws += 1\n",
"\n",
" state = next_state\n",
" done = terminated\n",
"\n",
" # Сохраняем данные по эпизоду\n",
" statistics[\"Episode\"].append(episode + 1)\n",
" statistics[\"Total Reward\"].append(total_reward)\n",
" statistics[\"Wins_X\"].append(wins_X)\n",
" statistics[\"Wins_O\"].append(wins_O)\n",
" statistics[\"Draws\"].append(draws)\n",
"\n",
" # Отображение прогресса каждые 50 эпизодов\n",
" if (episode + 1) % 50 == 0:\n",
" average_reward = sum(statistics[\"Total Reward\"][-50:]) / 50\n",
" print(f\"Average Reward (last 50 episodes): {average_reward}\")\n",
"\n",
"\n",
"# Построение кумулятивного графика\n",
"plt.figure(figsize=(12, 6))\n",
"\n",
"episodes_range = statistics[\"Episode\"]\n",
"wins_X = np.cumsum(statistics[\"Wins_X\"])\n",
"wins_O = np.cumsum(statistics[\"Wins_O\"])\n",
"draws = np.cumsum(statistics[\"Draws\"])\n",
"\n",
"plt.plot(episodes_range, wins_X, label=\"Wins X\", color=\"red\")\n",
"plt.plot(episodes_range, wins_O, label=\"Wins O\", color=\"blue\")\n",
"plt.plot(episodes_range, draws, label=\"Draws\", color=\"green\")\n",
"\n",
"plt.xlabel(\"Episodes\")\n",
"plt.ylabel(\"Cumulative Count\")\n",
"plt.title(\"Cumulative Performance Over Episodes\")\n",
"plt.legend()\n",
"plt.grid()\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "aimenv",
"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
}