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 + discount_factor * np.max(q_table[next_state]) – q_table[state][action]
)
state = next_state # Переход к новому состоянию
total_reward += reward
if episode % 100 == 0:
print(f"Episode {episode}/{num_episodes}, Total Reward: {total_reward}")
```
Шаг 6: Тестирование обученного агента
После того как агент обучился с использованием Q-learning, мы можем протестировать его эффективность. В тестировании агент будет следовать стратегии, основанной на максимизации ценности действия, и применять её без случайных выборов.
```python
# Тестирование агента
state = discretize_state(env.reset())
done = False
total_reward = 0
while not done:
action = np.argmax(q_table[state]) # Лучшее действие по таблице Q
next_state, reward, done, _, _ = env.step(action)
state = discretize_state(next_state) # Дискретизация следующего состояния
total_reward += reward
print(f"Total Reward in test: {total_reward}")
```
Результаты
Во время обучения агент постепенно улучшает свою стратегию. Сначала он может случайным образом двигать столбик, но с течением времени, когда он получает обратную связь в виде награды, он начинает находить более эффективные действия, чтобы удерживать столбик в вертикальном положении.
После завершения обучения агент должен показывать значительно более высокие результаты, чем в начале, когда он выбирал действия случайным образом.
Этот пример демонстрирует, как с помощью обучения с подкреплением можно обучить агента действовать в динамической среде, такой как CartPole. Метод Q-learning позволяет агенту улучшать свою стратегию со временем, учась на опыте, получая награды и корректируя свои действия, чтобы максимизировать долгосрочную награду.
Q-Learning – это один из наиболее популярных и широко используемых алгоритмов в области обучения с подкреплением. Этот метод используется для поиска оптимальной стратегии или политики, позволяя агенту выбирать лучшие действия для максимизации долгосрочной награды.
Основная цель Q-learning заключается в том, чтобы для каждого состояния и действия агент находил ценность (Q-значение), которое описывает, насколько выгодно выполнить определённое действие в конкретном состоянии. Эти Q-значения обновляются в процессе обучения на основе получаемых наград, и в итоге агент формирует стратегию, которая максимизирует общую награду.