自定义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
相关产品推荐
相关产品推荐

