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

自定义OpenAI Gym环境运行时出现AssertionError问题求助

解决OpenAI Gym自定义PlacementEnv的AssertionError问题

错误根源

你遇到的AssertionError核心原因是**reset()方法返回了观测空间对象,而非符合空间格式的实际观测数据**:

  • Gym要求reset()必须返回与observation_space结构匹配的具体数值(比如字典、numpy数组等),但你的代码里返回了gym.spaces.Dict实例,这违反了Gym的接口规范。
  • 额外问题:reset()中重复定义observation_space完全没必要,观测空间只需要在__init__中初始化一次即可。

修正后的代码

import gym
from gym import spaces
import numpy as np

class PlacementEnv(gym.Env):
    def __init__(self, sb, bb):
        super().__init__()  # 必须调用父类构造函数
        self.reward = None
        self.smallBoxes = sb
        self.bigBoxes = bb

        # 定义观测空间(仅初始化一次)
        space_to_observe = {}
        for i, smallbox in enumerate(self.smallBoxes, start=1):
            highx = smallbox.pointMax_X
            highy = smallbox.pointMax_Y
            space_to_observe.update({
                f'points_smallbox{i}': spaces.Box(low=np.array([0, 0]), 
                                                 high=np.array([highx, highy]),
                                                 shape=(2,), dtype=int),
                f'bbID_smallbox{i}': spaces.Discrete(len(self.bigBoxes))
            })
        self.observation_space = spaces.Dict(space_to_observe)

        # 定义动作空间(修复多余括号的语法错误)
        self.action_space = spaces.Tuple((
            spaces.Discrete(len(self.bigBoxes)),
            spaces.Box(low=0, high=3000, shape=(2,), dtype=int), 
            spaces.Discrete(8)
        ))

    def reset(self):
        # 重置所有小箱子的状态
        for smallbox in self.smallBoxes:
            smallbox.bb_id = 0  # 用Discrete空间的合法初始值(范围0到n-1)
            smallbox.insertion_point = (0, 0)
            smallbox.rotation_angle = 0

        # 构建符合观测空间结构的实际观测数据
        observation = {}
        for i, smallbox in enumerate(self.smallBoxes, start=1):
            observation[f'points_smallbox{i}'] = np.array(smallbox.insertion_point, dtype=int)
            observation[f'bbID_smallbox{i}'] = smallbox.bb_id

        return observation  # 返回实际观测数据,而非空间对象

关键修改说明

  • 添加父类构造调用:super().__init__()是自定义Gym环境的必要步骤,确保父类初始化完成。
  • 移除reset中的观测空间定义:观测空间只在__init__中创建一次,避免重复修改导致的混乱。
  • reset返回实际观测数据:构建与observation_space结构完全匹配的字典,每个键对应具体的数值(numpy数组或整数),符合Gym的接口要求。
  • 修复动作空间语法错误:原代码中动作空间的定义多了一对闭合括号,已修正。
  • 合法初始值设置:bb_id初始化为0,符合Discrete空间的有效值范围,避免后续报错。

测试验证

创建环境实例后调用reset(),将不再触发AssertionError:

# 假设你已创建small_boxes和big_boxes实例
env = PlacementEnv(small_boxes, big_boxes)
obs = env.reset()
print(obs)  # 输出符合观测空间结构的字典数据

内容的提问来源于stack exchange,提问作者Jürgen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:25:42