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

如何在Ray中用gym.make创建的带Wrapper的自定义环境替代CartPole

在RLlib中使用带Wrapper的自定义Gym环境替换CartPole

要实现带自定义Wrapper和FlattenObservation的自定义环境集成,核心是通过环境工厂函数封装完整的环境创建流程——这个函数负责调用gym.make、链式应用所有Wrapper,最后返回处理好的环境实例。RLlib支持直接将这种工厂函数传入训练配置,完美适配你的需求。

完整修改代码

import ray
import ray.rllib.agents.dqn.apex as apex
from ray.tune.logger import pretty_print
import gym
from gym.wrappers import FlattenObservation

# 替换为你实际的自定义Wrapper类
class CustomEnvWrapper(gym.Wrapper):
    def __init__(self, env):
        super().__init__(env)
        # 在这里添加你的自定义逻辑,比如动作空间约束、奖励重塑等

# 定义环境工厂函数:封装环境创建与Wrapper应用流程
def make_custom_env():
    # 1. 创建自定义环境实例
    env = gym.make("你的自定义环境ID")
    # 2. 应用FlattenObservation
    env = FlattenObservation(env)
    # 3. 应用自定义Wrapper(顺序可根据需求调整)
    env = CustomEnvWrapper(env)
    return env

def train_custom_env() -> None:
    ray.init()
    config = apex.APEX_DEFAULT_CONFIG.copy()
    config["num_gpus"] = 0
    config["num_workers"] = 3
    # 直接将工厂函数传入env参数
    trainer = apex.ApexTrainer(config=config, env=make_custom_env)

    for _ in range(1000):
        result = trainer.train()
        print(pretty_print(result))

train_custom_env()

关键说明

  • 环境工厂函数:make_custom_env封装了从原始环境创建到所有Wrapper应用的完整流程,确保每个Worker拿到的都是已处理好的环境。
  • Wrapper顺序:根据需求调整FlattenObservation和自定义Wrapper的顺序——如果自定义Wrapper需要处理原始观测,就先加自定义Wrapper再扁平化;反之则先扁平化再处理。
  • 替代方案:注册环境
    若更习惯用字符串指定环境,可将工厂函数注册到RLlib:
    from ray.tune.registry import register_env
    
    # 注册环境,绑定字符串ID与工厂函数
    register_env("custom-wrapped-env", lambda config: make_custom_env())
    
    # 配置中用字符串引用
    trainer = apex.ApexTrainer(config=config, env="custom-wrapped-env")
    
    这种方式适合需要重复使用该环境配置的场景。

内容的提问来源于stack exchange,提问作者blindeyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:45:56