[0, 0, 0, -1], # Препятствие (-1)
[0, -1, 0, 1] # Целевая ячейка (1)
])
```
Теперь создадим простое правило для агента: если агент находится в ячейке, он может выбирать случайное действие: двигаться вверх, вниз, влево или вправо. Если агент попадает в препятствие, он не двигается и остается на месте. Если агент достигает целевой ячейки, он получает награду +10 и игра завершается.
```python
import random
# Функция для выполнения действия в игре
def take_action(state):
row, col = state
if grid_world[row, col] == -1: # Если попали в препятствие, остаемся на месте
return state
action = random.choice(['up', 'down', 'left', 'right']) # Случайное действие
if action == 'up':
row = max(0, row – 1)
elif action == 'down':
row = min(grid_world.shape[0] – 1, row + 1)
elif action == 'left':
col = max(0, col – 1)
elif action == 'right':
col = min(grid_world.shape[1] – 1, col + 1)
return (row, col)
# Функция для проверки завершения игры и получения награды
def get_reward(state):
row, col = state
if grid_world[row, col] == 1: # Если достигли целевой ячейки
return 10, True
return 0, False # Игра продолжается
# Функция для запуска игры
def play_game():
state = (0, 0) # Начальное состояние агента
total_reward = 0
done = False
while not done:
state = take_action(state)
reward, done = get_reward(state)
total_reward += reward
return total_reward
# Запуск игры
total_reward = play_game()
print("Total reward:", total_reward)
```
Это простой пример задачи обучения с подкреплением, где агент играет в игру "Сетка мира", перемещаясь по полю и получая награду за достижение целевой ячейки.
Пример 2
Рассмотрим пример задачи с использованием обучения с подкреплением. Давайте представим симуляцию игры в кости, где агент должен научиться выбирать наилучшие действия (выбор числа от 1 до 6) для максимизации своего выигрыша.
```python
import numpy as np
class DiceGame:
def __init__(self):
self.state = 0 # текущее состояние – результат броска кости
self.done = False # флаг окончания игры
self.reward = 0 # награда за текущий шаг
def step(self, action):
# Выполняем действие – бросаем кость
self.state = np.random.randint(1, 7)
# Вычисляем награду
if action == self.state:
self.reward = 10 # выигрыш, если действие совпало с результатом броска
else:
self.reward = 0 # нет выигрыша
# Устанавливаем флаг окончания игры (игра заканчивается после одного хода)
self.done = True
return self.state, self.reward, self.done
def reset(self):
# Сбрасываем состояние игры для нового эпизода
self.state = 0
self.done = False
self.reward = 0
return self.state
# Пример простой стратегии выбора действий – всегда выбираем число 3
def simple_strategy(state):
return 3
# Основной код обучения с подкреплением
env = DiceGame()
total_episodes = 1000
learning_rate = 0.1
discount_rate = 0.99
q_table = np.zeros((6, 6)) # Q-таблица для хранения оценок ценности действий
for episode in range(total_episodes):
state = env.reset()
done = False
while not done:
action = simple_strategy(state)
next_state, reward, done = env.step(action)
# Обновление Q-таблицы по формуле Q(s,a) = Q(s,a) + α * (reward + γ * max(Q(s',a')) – Q(s,a))
q_table[state – 1, action – 1] += learning_rate * (reward + discount_rate * np.max(q_table[next_state – 1, :]) – q_table[state – 1, action – 1])
state = next_state
print("Q-таблица после обучения:")
print(q_table)
```
Этот код реализует простую симуляцию игры в кости и обновляет Q-таблицу на основе наград, полученных в процессе игры. Мы используем простую стратегию, всегда выбирая число 3. Однако, в реальных приложениях, агент мог бы изучать и выбирать действия на основе обучения Q-таблице, которая представляет собой оценку ценности различных действий в каждом состоянии.