You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gym TransformObservation包装器未生效:MultiDiscrete观测空间未转换

问题解决方法

核心问题说明

你遇到的情况是因为TransformObservation包装器仅会转换环境实际输出的观测值(比如reset()、step()返回的结果),不会自动修改observation_space的定义。所以直接调用wrapped_env.observation_space.sample()还是会从原MultiDiscrete空间采样,看不到转换效果。另外你的环境代码还有两个小bug需要修正。

具体修复步骤

  1. 修正环境的reset方法
    原代码reset返回的是2维数组,但你的观测空间是118维,这会导致维度不匹配,必须改成118维:

    def reset(self):
        self.state = np.zeros(118, dtype=np.int64)  # 改为118维,指定类型避免后续转换警告
        self.test_begin = 7
        return self.state
    
  2. 验证转换效果的正确方式
    不要用observation_space.sample()验证,而是调用wrapped_env.reset(),看返回的观测值是否已经转换为-1和1:

    print(wrapped_env.reset())
    # 输出应该是全-1的数组:array([-1., -1., ..., -1.])
    
  3. 可选:更新包装后环境的观测空间定义
    如果需要让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())
    
  4. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:53:11