在看一些示例程序代码时,一般从gym中引用环境只需要用gym.make就可以了,比如
env=gym.make('CartPole-v0')
但在很多程序中(如莫烦pytorch的DQN程序),还有这样一句
env = env.unwrapped
关于这个unwrapped的含义,文章gym中env的unwrapped中是这么解释的:
Open AI gym提供了许多不同的环境。每一个环境都有一套自己的参数和方法。然而,他们通常由一个类Env包装(就像这是面向对象编程语言(OOPLs)的一个接口)。这个类暴露了任一环境的最常用的,最本质的方法,比如step,reset,seed。拥有这个“接口”类非常好,因为它允许您的代码不受环境限制。如果您希望在不同的环境中测试单个代理,那么它还使事情变得更简单。
然而,如果你想访问一个特定环境的场景动态后面的东西,需要使用unwrapped属性。
但这个解释并不是很清楚,后来又从知乎文章OpenAI gym——一款开发和比较RL算法的工具包中看到了这样的解释
#还原env的原始设置,env外包了一层防作弊层
之后在文章深度强化学习DQN详解CartPole(1)中看到了比较详细的解释。
创建环境:
env = gym.make('CartPole-v0')
返回的这个env其实并非CartPole类本身,而是一个经过包装的环境:
env
<TimeLimit<CartPoleEnv>>
据说gym的多数环境都用TimeLimit(源码)包装了,以限制Epoch,就是step的次数限制,比如限定为200次。所以小车保持平衡200步后,就会失败。
env._max_episode_steps
200
用env.unwrapped可以得到原始的类,原始类想step多久就多久,不会200步后失败:
env.unwrapped
gym.envs.classic_control.cartpole.CartPoleEnv