Алгоритмы машинного обучения: базовый курс - страница 33



1. Инициализация: Агент начинает с инициализированной Q-таблицей, где значения всех состояний и действий равны нулю.

2. Выбор действия: В процессе обучения агент выбирает действие, используя стратегию ε-реже (ε-greedy). Это означает, что с вероятностью ε агент будет выбирать случайное действие (исследование), а с вероятностью 1-ε – наилучшее действие на основе текущих значений в Q-таблице (эксплуатация).

3. Получение награды: После выполнения действия агент получает награду (например, +1 за движение в пустую клетку и -1 за столкновение со стеной).

4. Обновление Q-таблицы: Агент обновляет значения в Q-таблице с использованием формулы Q-learning, учитывая полученную награду и наилучшую стратегию для следующего состояния.

5. Повторение: Агент повторяет процесс, взаимодействуя с окружающей средой, обновляя Q-таблицу, пока не достигнет цели или не выполнит достаточное количество шагов.

В результате обучения, когда агент выполнит достаточно шагов, его стратегия будет ориентирована на выбор оптимальных действий для достижения цели, избегая столкновений со стенами.

Пример кода Q-Learning для задачи CartPole

Давайте возьмём другую задачу для применения алгоритма Q-learning. Рассмотрим задачу Maze Navigation (навигация по лабиринту), где агент должен найти выход из лабиринта, начиная с одной клетки. Лабиринт состоит из клеток, и агент может двигаться вверх, вниз, влево или вправо. Задача будет заключаться в том, чтобы агент научился искать оптимальный путь к выходу, используя награды за правильные действия и штрафы за неправильные.

Описание задачи:

– Агент начинает в случайной точке лабиринта.

– Он должен найти путь к выходу, избегая стен.

– Если агент сталкивается со стеной, он получает отрицательную награду.

– Если агент достиг цели (выхода), он получает положительную награду.

Мы будем использовать Q-learning для обучения агента, где Q-значения будут обновляться в процессе взаимодействия агента с лабиринтом.

Пример кода для задачи навигации по лабиринту с использованием Q-Learning:

```python

import numpy as np

import random

# Параметры лабиринта

maze = [

[0, 0, 0, 0, 0],

[0, 1, 1, 0, 0],

[0, 0, 0, 1, 0],

[0, 1, 0, 0, 0],

[0, 0, 0, 1, 2]

]

# 0 – свободная клетка

# 1 – стена

# 2 – выход

# Размеры лабиринта

n_rows = len(maze)

n_cols = len(maze[0])

# Гиперпараметры Q-learning

learning_rate = 0.1 # Скорость обучения

discount_factor = 0.9 # Дисконтирование

epsilon = 0.2 # Эпсилон для epsilon-greedy

num_episodes = 1000 # Количество эпизодов обучения

# Инициализация Q-таблицы

q_table = np.zeros((n_rows, n_cols, 4)) # 4 действия: вверх, вниз, влево, вправо

actions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # Действия: (изменение по строкам, изменение по столбцам)

# Функция выбора действия с использованием epsilon-greedy

def epsilon_greedy(state):

if random.uniform(0, 1) < epsilon:

return random.choice([0, 1, 2, 3]) # Случайное действие

else:

return np.argmax(q_table[state[0], state[1]]) # Лучшее действие по Q-таблице

# Функция проверки, находится ли клетка внутри лабиринта и является ли она свободной

def is_valid_move(state, action):

new_row = state[0] + actions[action][0]

new_col = state[1] + actions[action][1]

if 0 <= new_row < n_rows and 0 <= new_col < n_cols and maze[new_row][new_col] != 1:

return True

return False

# Обучение

for episode in range(num_episodes):

state = (0, 0) # Начальное состояние (агент стартует в верхнем левом углу)