Название | Алгоритмы машинного обучения: базовый курс |
---|---|
Автор произведения | Тайлер Венс |
Жанр | |
Серия | |
Издательство | |
Год выпуска | 2025 |
isbn |
```python
# Инициализация состояния среды
state = env.reset()
# Действия агента: 0 – двигаться влево, 1 – двигаться вправо
actions = [0, 1]
# Количество шагов
num_steps = 200
# Суммарная награда
total_reward = 0
# Сеанс игры с случайным агентом
for _ in range(num_steps):
action = random.choice(actions) # случайный выбор действия
next_state, reward, done, _, _ = env.step(action) # Выполняем действие
total_reward += reward
state = next_state # Переход к следующему состоянию
# Если агент упал (закончилась игра), завершаем
if done:
break
# Выводим итоговую награду
print(f"Total Reward: {total_reward}")
```
Этот код показывает, как агент взаимодействует с средой, выбирает действия и накапливает награды. Но такой агент не обучается, он просто случайно выполняет действия, что делает его неэффективным. Нам нужно сделать так, чтобы агент обучался и максимизировал свои награды.
Шаг 4: Алгоритм Q-learning
Q-learning – это один из популярных методов обучения с подкреплением, который помогает агенту учиться на основе награды, которую он получает за выполнение определённого действия в каждом состоянии. Агент заполняет таблицу значений Q (ценности состояния-действия), которая описывает, насколько выгодно выполнить действие в конкретном состоянии.
Мы начнем с создания таблицы Q для всех состояний и действий. Сначала пространство состояний среды CartPole сильно большое и непрерывное, поэтому нам нужно будет дискретизировать его, чтобы работать с таблицей Q.
Шаг 5: Реализация алгоритма Q-learning
Пример реализации алгоритма Q-learning для задачи CartPole:
```python
# Устанавливаем параметры
learning_rate = 0.1 # Скорость обучения
discount_factor = 0.99 # Дисконтирование будущих наград
epsilon = 0.1 # Вероятность выбора случайного действия (исследование)
num_episodes = 1000 # Количество эпизодов обучения
# Инициализация Q-таблицы
# Преобразуем состояния в дискретные
def discretize_state(state):
discrete_state = [
int(state[0] // 0.1),
int(state[1] // 0.1),
int(state[2] // 0.1),
int(state[3] // 0.1)
]
return tuple(discrete_state)
# Размеры Q-таблицы (по оси состояния и действия)
q_table = np.zeros((6, 6, 6, 6, env.action_space.n)) # для CartPole (4 признака, 2 действия)
# Функция для выбора действия с учётом epsilon-greedy стратегии
def epsilon_greedy(state):
if random.uniform(0, 1) < epsilon:
return random.choice([0, 1]) # Случайный выбор
else:
return np.argmax(q_table[state]) # Лучшее действие по таблице Q
# Обучение агента
for episode in range(num_episodes):
state = discretize_state(env.reset()) # Начальное состояние, дискретизация
done = False
total_reward = 0
while not done:
action = epsilon_greedy(state) # Выбор действия
next_state, reward, done, _, _ = env.step(action) # Выполнение действия
next_state = discretize_state(next_state) # Дискретизация следующего состояния
# Обновление Q-значения по формуле Q-learning
q_table[state][action] = q_table[state][action] + learning_rate * (
reward