如何在OpenAI的gym中注册自定义环境?

16

我创建了一个自定义环境,遵循OpenAI Gym框架,其中包含stepresetactionreward函数。我想在这个自定义环境上运行OpenAI基线算法。但在此之前,这个环境必须在OpenAI gym上进行注册。我想知道如何在OpenAI gym上注册自定义环境?另外,我需要修改OpenAI基线代码来整合它吗?

3个回答

25

不需要修改基线存储库。

以下是一个最简例子。假设你有一个名为myenv.py的文件,其中包含所有所需的函数(stepreset等)。环境类的名称为MyEnv,你想将其添加到classic_control文件夹中。你需要:

  • myenv.py文件放置在gym/gym/envs/classic_control文件夹中
  • 在相同的文件夹中的__init__.py中添加

    from gym.envs.classic_control.myenv import MyEnv

  • 通过添加以下内容在gym/gym/envs/__init__.py中注册该环境:

    gym.envs.register(
         id='MyEnv-v0',
         entry_point='gym.envs.classic_control:MyEnv',
         max_episode_steps=1000,
    )
    
    在注册时,您还可以添加`reward_threshold`和`kwargs`(如果您的类需要一些参数)。 您还可以直接在运行脚本(TRPO、PPO或其他)中注册环境,而不是在 `gym/gym/envs/__init__.py` 中进行注册。 编辑 这是一个创建LQR环境的最小示例。
    将以下代码保存在 `lqr_env.py` 中,并将其放置在 gym 的 classic_control 文件夹中。
    import gym
    from gym import spaces
    from gym.utils import seeding
    import numpy as np
    
    class LqrEnv(gym.Env):
    
        def __init__(self, size, init_state, state_bound):
            self.init_state = init_state
            self.size = size 
            self.action_space = spaces.Box(low=-state_bound, high=state_bound, shape=(size,))
            self.observation_space = spaces.Box(low=-state_bound, high=state_bound, shape=(size,))
            self._seed()
    
        def _seed(self, seed=None):
            self.np_random, seed = seeding.np_random(seed)
            return [seed]
    
        def _step(self,u):
            costs = np.sum(u**2) + np.sum(self.state**2)
            self.state = np.clip(self.state + u, self.observation_space.low, self.observation_space.high)
            return self._get_obs(), -costs, False, {}
    
        def _reset(self):
            high = self.init_state*np.ones((self.size,))
            self.state = self.np_random.uniform(low=-high, high=high)
            self.last_u = None
            return self._get_obs()
    
        def _get_obs(self):
            return self.state
    

    from gym.envs.classic_control.lqr_env import LqrEnv添加到__init__.py中(同样在classic_control中)。

    在您的脚本中创建环境时,请执行以下操作:

    gym.envs.register(
         id='Lqr-v0',
         entry_point='gym.envs.classic_control:LqrEnv',
         max_episode_steps=150,
         kwargs={'size' : 1, 'init_state' : 10., 'state_bound' : np.inf},
    )
    env = gym.make('Lqr-v0')
    

你有没有关于如何在脚本中注册环境的提示或示例(而不是在TRPO、PPO或其他地方进行注册)? - bbartling
我正在尝试按照上述所有步骤操作,但是出现了错误:gym.error.Error: Attempted to look up malformed environment ID: b'hvac_Env'. (Currently all IDs must be of the form ^(?:[\w:-]+\/)?([\w:.-]+)-v(\d+)$.) - bbartling
@HenryHub我从未遇到过你的错误。我已添加了一个最小示例,希望有所帮助。 - Simon
感谢分享,@Simon...它起作用了。LQR似乎也很有趣,你能否分享一些联系方式以便合作?否则我可以给你我的联系方式。我正在尝试使用这个自定义Gym环境来控制管道系统中的阀门到温度传感器。关于我的副业项目,我在这篇博客文章的底部留下了联系信息:https://medium.com/getting-reinforcement-learning-into-the-bas - bbartling
1
这在2020年仍然是可行的方式吗?这似乎是一种非常尴尬的做法,因为通常不希望在包管理(pip / conda)下更改文件。 - Stanley F.
好的,我明白了,这个问题已经在2017年以一种干净的方式得到解决:https://dev59.com/dlcO5IYBdhLWcg3w7lgm#47132897 - Stanley F.

3
您可以在这里找到环境注册流程。
如果您有任何问题,请参考示例自定义环境。
如需更多信息,请参考stackoverflow问题。

0

那个问题与gym的版本有关,请尝试升级您的gym环境。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接