当我们使用gym创建环境的时候:

env = gym.make('CartPole-v0')

返回的env其实并非CartPole类本身,而是一个经过包装的环境。包装的过程可以看这里:

def make(self, path, **kwargs):
    
    spec = self.spec(path)
    
    env = spec.make(**kwargs)
    
    if env.spec.max_episode_steps is not None:
        from gym.wrappers.time_limit import TimeLimit

        env = TimeLimit(env, max_episode_steps=env.spec.max_episode_steps)
    
    return env

可以此环境用TimeLimit类包装以限制Epoch,就是step的次数限制。以倒立摆小车为例,env._max_episode_steps设置为200,所以小车保持平衡200步后,就会失败。而用env.unwrapped可以得到原始的类,从而可以打破step的限制。

import gym
env = gym.make('CartPole-v0')
print(type(env))
env = env.unwrapped
print(type(env))
env.reset()
for _ in range(1000):
    env.render()
    env.step(env.action_space.sample())
env.close()

上述代码打印出:

<class 'gym.wrappers.time_limit.TimeLimit'>

<class 'gym.envs.classic_control.cartpole.CartPoleEnv'>