API: Агенты
agents
Агенты для GridWorld.
Содержит: - A2CConfig, A2CAgent, evaluate_policy_success из a2c_agent; - DRQNLightning из drqn_agent.
A2CAgent
Батчевый A2C (Actor-Critic) с LSTM.
-
При vector env:
- один rollout даёт batch_size = n_envs эпизодов;
- в обучении считаем returns/advantages размерности (T, n_envs);
- считаем один шаг градиента по всему батчу.
-
Лучшая модель и ранняя остановка основаны на avg_episode_return:
- avg_episode_return = среднее по последним avg_window эпизодам;
- лучшие веса — при максимальном avg_episode_return;
- ранняя остановка по отсутствию улучшения avg_episode_return patience батчей подряд (после min_episodes_before_early_stop эпизодов).
act_greedy
Жадное действие по текущей политике.
obs
- shape (obs_dim,) → одиночная среда;
- shape (n_envs, obs_dim) → векторная среда с n_envs копиями.
Возвращает
actions: - shape (,) если был одиночный obs (скалярный int), - shape (n_envs,) если батч; new_hidden: (h, c) с batch_size, соответствующим obs.
DRQNLightning
Bases: LightningModule
DRQNLightning
Lightning‑обёртка над DRQN‑агентом.
Особенности
- Корректно работает и с одиночной GridWorldEnv, и с векторной (SyncVectorEnv / GymVectorGridWorldEnv, VectorGridWorldEnv), но обучается логически только по ОДНОЙ под‑среде (первой), чтобы не ломать архитектуру эпизодного replay‑буфера.
- Вход сети упрощён: только наблюдение obs (без a_{t-1}, r_{t-1}).
- Лучшая модель и ранняя остановка основаны на avg_episode_return: avg_episode_return = среднее по последним avg_window эпизодам. Если avg_episode_return не улучшается early_stop_patience эпизодов подряд (после early_stop_min_episodes) — тренировка останавливается.
- best_state_dict хранит лучшие веса по avg_episode_return, и после окончания обучения мы ими инициализируем сеть.
get_action
Выбор действия по epsilon-greedy стратегии. Использует только текущее наблюдение obs как вход.
evaluate_policy_success
Прогоняет один эпизод жадно по текущей политике и проверяет, достиг ли агент цели (terminated=True хотя бы раз).
Работает как с одиночной средой, так и с векторной: - если terminated — скаляр: берётся как есть; - если массив: успех = any(terminated).