Почему моя модель постоянно застревает на одном месте? [закрыто]Python

Программы на Python
Anonymous
Почему моя модель постоянно застревает на одном месте? [закрыто]

Сообщение Anonymous »

Описание проблемы
Код RL реализует среду, совместимую с Gymnasium (DoomEnv), для обучения агентов обучения с подкреплением в DOOM Retro. Он фиксирует состояние игры (наблюдения) через общую память или снимок экрана, отправляет действия для управления игрой и предоставляет награды. Проблема в том, что среда использует DOOM Retro, работающий в фоновом режиме, и без него она возвращается к захвату всего монитора, что может не обеспечить точное состояние игры. Кроме того, сценарии обучения и оценки RL нуждаются в доработке для обеспечения стабильности и производительности.
Основные проблемы:
Зависимость от процесса DOOM Retro.
Интеграция общей памяти для состояния в реальном времени.
Пространство действий и формирование вознаграждения.
Сходимость обучения и показатели оценки.
Это незавершенный код, поэтому ожидаются ошибки или неполные функции.
Вот основной класс DoomEnv (из doom_env.py). Это среда Gymnasium, взаимодействующая с DOOM Retro.

Код: Выделить всё

    import gymnasium as gym
from gymnasium import spaces
import numpy as np
import time
from controller.doom_controller import DoomController
from observation.observation_builder import ObservationBuilder
from rewards.reward_manager import RewardManager
from utils.shm_reader import ShmReader
from frame_cache import FrameCache

class DoomEnv(gym.Env):
def __init__(self):
super().__init__()
self.action_space = spaces.Discrete(8)  # Example: 8 actions (move, turn, shoot, etc.)
self.observation_space = spaces.Box(low=0, high=255, shape=(84, 84, 3), dtype=np.uint8)

self.controller = DoomController()
self.obs_builder = ObservationBuilder()
self.reward_manager = RewardManager()
self.shm_reader = ShmReader()
self.frame_cache = FrameCache()

self.prev_health = 100
self.prev_ammo = 50
self.prev_kills = 0

def reset(self, seed=None, options=None):
super().reset(seed=seed)
self.controller.reset_game()
obs = self._get_observation()
info = {}
return obs, info

def step(self, action):
self.controller.send_action(action)
time.sleep(0.1)  # Frame delay

obs = self._get_observation()
reward = self._calculate_reward()
done = self._is_done()
truncated = False
info = {}

return obs, reward, done, truncated, info

def _get_observation(self):
# Try shared memory first
if self.shm_reader.is_available():
frame = self.shm_reader.get_frame()
else:
# Fallback to screen capture
frame = self.frame_cache.capture_frame()

# Process frame (resize, grayscale, etc.)
processed = self.obs_builder.build_observation(frame)
return processed

def _calculate_reward(self):
current_health = self.shm_reader.get_health() if self.shm_reader.is_available() else 100
current_ammo = self.shm_reader.get_ammo() if self.shm_reader.is_available() else 50
current_kills = self.shm_reader.get_kills() if self.shm_reader.is_available() else 0

reward = self.reward_manager.calculate_reward(
current_health, self.prev_health,
current_ammo, self.prev_ammo,
current_kills, self.prev_kills
)

self.prev_health = current_health
self.prev_ammo = current_ammo
self.prev_kills = current_kills

return reward

def _is_done(self):
return self.shm_reader.get_health() Общая память: DOOM Retro должен работать с поддержкой RL (запись в /dev/shm/doomretro_rl).
Для базового тестирования не требуются внешние файлы данных, но при обучении используются траектории/клипы.
Необходимые данные/настройка
Двоичный файл DOOM Retro: построен из основного репозитория (требуется SDL2, CMake).
Файл IWAD: например, freedoom1.wad или doom.wad.
Среда Python: Virtualenv с Gymnasium, Stable-baselines3, numpy, mss, pynput, Torch, Pillow.
Общая память: DOOM Retro должен работать с поддержкой RL (запись в /dev/shm/doomretro_rl).
Для базового тестирования не нужны внешние файлы данных, но используется обучение траектории/клипы.
Чтобы запустить DOOM Retro:./build/doomretro -iwad /path/to/doom.wad
Полученный результат
Выполнить скрипты Python/test_env.py без запуска DOOM Retro (возврат к захвату монитора):
Подключение к существующему окну DOOM...Окно DOOM Retro не найдено! ВНИМАНИЕ: окно DOOM не найдено. DOOM Retro запущен? Окно DOOM Retro не найдено! [frame_cache] Окно DOOM не найдено — захватывается весь монитор.  (84, 84, 12)поэтапная работа
obs.shape: (84, 84, 12) — Наблюдение представляет собой кадр измененного размера с 12 каналами (вероятно, RGB + дополнительные возможности).
"шаговый рабочий": указывает метод шага, выполненный без ошибок.
Ожидаемый результат
При запуске DOOM Retro:
obs.shape: (84, 84, 3) или аналогичный (обработанный игровой кадр).
Расчет вознаграждения на основе изменений здоровья/боеприпасов/убийств.
Вместо захвата монитора используется общая память.
Никаких предупреждений об окне DOOM нет. найдено.
Полный эпизод запускается с правильными флагами выполнения/усечения.
Среда должна легко интегрироваться с библиотеками RL, такими как Stable Baselines3, для обучения агентов, играющих в DOOM.

Вернуться в «Python»