如何更新openai.gym.spaces.Dict状态并解决dict无flatten属性报错
Dict类型观测空间报错解决方案
你遇到的报错核心是Stable Baselines3默认的MlpPolicy仅支持一维扁平的Box类观测输入,无法直接处理gym.spaces.Dict类型的复合观测结构,同时原代码的step、reset方法也不符合Gym环境的接口规范,也会引发后续报错。
需要修改的内容
- 把PPO的策略类型从
MlpPolicy替换为MultiInputPolicy,该策略原生支持Dict、Tuple等复合观测空间的自动处理 - 补全
step方法的返回值:Gym要求step方法必须返回「下一状态、奖励、是否终止、是否截断、额外信息」五要素(Gym 0.26及以上版本),低于0.26版本返回「下一状态、奖励、是否终止、额外信息」四要素即可 - 补全
reset方法的返回值:Gym要求reset方法返回「初始状态、额外信息」二元组
完整修改后代码
import math from gym import Env from gym.spaces import Discrete, Box, Dict, Tuple, MultiBinary, MultiDiscrete from stable_baselines3 import PPO screen_width = 900 class GameEnv(Env): def __init__(self): self.action_space = Discrete(5) observation_positions = Box(low=0, high=screen_width, shape=(2,)) self.observation_space = Dict({'observation_positions': observation_positions}) self.state = self.observation_space.sample() def step(self, action): self.state = self.observation_space.sample() # 奖励、终止/截断标志可根据自身业务逻辑调整 reward = 0 terminated = False truncated = False info = {} return self.state, reward, terminated, truncated, info def render(self): pass def reset(self, seed=None, options=None): super().reset(seed=seed) self.state = self.observation_space.sample() info = {} return self.state, info env = GameEnv() # 替换为适配复合观测的多输入策略 model = PPO('MultiInputPolicy', env, verbose=1,) model.learn(total_timesteps=1000)
可选替代方案:如果你不想使用多输入策略,也可以手动把Dict观测扁平化为一维向量,把观测空间改为对应维度的Box即可,不需要修改策略类型。
内容的提问来源于stack exchange,提问作者msba
相关产品推荐
相关产品推荐

