当我们使用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'>