Gym TransformObservation包装器未生效:MultiDiscrete观测空间未转换
问题解决方法
核心问题说明
你遇到的情况是因为TransformObservation包装器仅会转换环境实际输出的观测值(比如reset()、step()返回的结果),不会自动修改observation_space的定义。所以直接调用wrapped_env.observation_space.sample()还是会从原MultiDiscrete空间采样,看不到转换效果。另外你的环境代码还有两个小bug需要修正。
具体修复步骤
修正环境的
reset方法
原代码reset返回的是2维数组,但你的观测空间是118维,这会导致维度不匹配,必须改成118维:def reset(self): self.state = np.zeros(118, dtype=np.int64) # 改为118维,指定类型避免后续转换警告 self.test_begin = 7 return self.state验证转换效果的正确方式
不要用observation_space.sample()验证,而是调用wrapped_env.reset(),看返回的观测值是否已经转换为-1和1:print(wrapped_env.reset()) # 输出应该是全-1的数组:array([-1., -1., ..., -1.])可选:更新包装后环境的观测空间定义
如果需要让observation_space准确反映转换后的空间(值范围-1到1的连续空间),可以手动设置为Box类型:from gym.spaces import Box wrapped_env.observation_space = Box(low=-1, high=1, shape=(118,), dtype=np.float32) # 此时调用sample()会得到-1到1之间的值 print(wrapped_env.observation_space.sample())修正
step方法的未定义变量
原step方法里的hot_encoding_action未定义,需要补充或删除该无效代码:def step(self, action): # 这里补充你的逻辑,比如更新state self.state = np.random.randint(0, 2, size=118) # 示例:随机生成观测值 reward = 0.0 # 示例奖励 done = False # 示例结束标志 info = {} return self.state, reward, done, info
完整修正后的代码
from gym import Env from gym.spaces import MultiDiscrete, Box from gym.wrappers import TransformObservation import numpy as np class Test_Env(Env): def __init__(self): self.action_space = MultiDiscrete(np.repeat(3, 118)) self.observation_space = MultiDiscrete(np.repeat(2, 118)) self.state = np.zeros(118, dtype=np.int64) self.test_begin = 7 def step(self, action): # 示例逻辑:随机更新观测状态 self.state = np.random.randint(0, 2, size=118) reward = 0.0 done = False info = {} return self.state, reward, done, info def render(self): pass def reset(self): self.state = np.zeros(118, dtype=np.int64) self.test_begin = 7 return self.state env = Test_Env() def transform(vec): # 转换0→-1,1→1 return vec * 2 - 1 wrapped_env = TransformObservation(env, transform) # 可选:更新观测空间为Box wrapped_env.observation_space = Box(low=-1, high=1, shape=(118,), dtype=np.float32) # 验证转换效果 print("原始环境reset结果:", env.reset()) print("包装后环境reset结果:", wrapped_env.reset())
内容的提问来源于stack exchange,提问作者E.T
相关产品推荐
相关产品推荐

