使用DummyVecEnv包装gym_super_mario_bros环境时遇实例重复错误
解决DummyVecEnv包装Super Mario Bros环境的实例重复报错问题
问题重现
尝试用DummyVecEnv包装gym_super_mario_bros环境时,两种写法均触发相同错误:
"You tried to create multiple environments, but the function to create them returned the same instance instead of creating different objects"
初始代码:
env = gym_super_mario_bros.make("SuperMarioBros-v0") env = JoypadSpace(env, SIMPLE_MOVEMENT) env = GrayScaleObservation(env, keep_dim=True) env = DummyVecEnv([lambda: env]) # 此处报错
封装环境创建逻辑后的代码:
# 封装环境创建逻辑到函数中 def create_default_environment(): newEnv = gym_super_mario_bros.make("SuperMarioBros-v0") newEnv = JoypadSpace(newEnv, SIMPLE_MOVEMENT) return GrayScaleObservation(newEnv, keep_dim=True) # 创建调用辅助函数的lambda列表 env = DummyVecEnv([lambda: create_default_environment()]) # 仍报错
解决方法
- 避免lambda延迟绑定问题
直接在lambda内部完成完整的环境创建与包装流程,彻底消除外部变量或函数可能带来的实例复用风险:
from stable_baselines3.common.env_util import DummyVecEnv from gym_super_mario_bros import make from gym_super_mario_bros.actions import SIMPLE_MOVEMENT from nes_py.wrappers import JoypadSpace from stable_baselines3.common.atari_wrappers import GrayScaleObservation env = DummyVecEnv([ lambda: GrayScaleObservation( JoypadSpace( make("SuperMarioBros-v0"), SIMPLE_MOVEMENT ), keep_dim=True ) ])
- 验证环境实例的独立性
在创建DummyVecEnv前,先手动检查环境创建函数是否真的返回不同实例:
env1 = create_default_environment() env2 = create_default_environment() print(env1 is env2) # 输出False才表示实例完全独立
如果输出True,说明gym_super_mario_bros.make默认返回单例,可通过指定随机seed强制生成新实例:
import random def create_default_environment(): newEnv = gym_super_mario_bros.make("SuperMarioBros-v0", seed=random.randint(0, 10000)) newEnv = JoypadSpace(newEnv, SIMPLE_MOVEMENT) return GrayScaleObservation(newEnv, keep_dim=True)
- 检查依赖版本兼容性
确保stable_baselines3、gym_super_mario_bros和nes-py为最新稳定版,旧版本可能存在逻辑bug:
pip install --upgrade stable-baselines3 gym-super-mario-bros nes-py
内容的提问来源于stack exchange,提问作者Joshua Clouse
相关产品推荐
相关产品推荐

