0. gym 核心
这部分的代码在gym/core.py中,
原始基类为Env,主要可调用step,reset,render,close,seed几个方法,大体框架如下
class Env(object):
def reset(self):
pass
def step(self, action):
pass
def render(self, mode='human'):
pass
def close(self):
pass
def seed(self, seed=None):
pass
同时Wrapper包装器继承Env类
class Wrapper(Env):
def step(self, action):
return self.env.step(action)
def reset(self, **kwargs):
return self.env.reset(**kwargs)
def render(self, mode='human', **kwargs):
return self.env.render(mode, **kwargs)
def close(self):
return self.env.close()
def seed(self, seed=None):
return self.env.seed(seed)
包装器的作用在于我们想定制新的环境配置时可以直接继承Wrapper,重写其中的部分方法,使用时将选择的游戏env作为参数传递进去,即可更改相应游戏环境的配置.
相应的也有observation,reward,action的包装器,更改对应方法即可
class ObservationWrapper(Wrapper):
def reset(self, **kwargs):
observation = self.env.reset(**kwargs)
return self.observation(observation)
def step(self, action):
observation, reward, done, info = self.env.step(action)
return self.observation(observation), reward, done, info
def observation(self, observation):
raise NotImplementedError
1. 环境名
atari中的每个游戏环境通过后缀名来区分内部的细微区别.
以Pong游戏为例,Pong-ram-v0表示其observation为Atari机器的内存情况(256维向量表示).其它的环境表示observation来自一个210*160的输入图片,具体区别可以细分为下(来自https://www.endtoend.ai/envs/gym/atari/)
Name | Frame Skip k | Repeat action probability p |
---|---|---|
Pong-v0 | 2-4 | 0.25 |
Pong-v4 | 2-4 | 0 |
PongDeterministic-v0 | 4 | 0.25 |
PongDeterministic-v4 | 4 | 0 |
PongNoFrameskip-v0 | 1 | 0.25 |
PongNoFrameskip-v4 | 1 | 0 |
其中带有V0后缀的表示以一定的概率p重复之前动作,不受智能体的控制(sticky actions,增加环境的随机性,[Revisiting the Arcade]),v4后缀表示这个概率p为0.中间字段的不同表示智能体每隔k帧做一个动作(同一个动作在k帧中保持,这种设置可以为避免训练出的智能体超出人类的反应速率).
使用如下代码可以看到所有环境:
from gym import envs
env_names = [spec.id for spec in envs.registry.all()]
for name in sorted(env_names):
print(name)
2.增加配置
除了环境自带的配置外,实验前常常对环境进行一系列新的配置,通常对gym.Wrapper进行继承重写其中的方法
2.1 reset规则
整个Atari游戏环境是一个确定性的环境,一个智能体可能在确定性环境中表现良好,但可能对一点细小的扰动高度敏感,所以常在设置中增加随机性
class NoopResetEnv(gym.Wrapper):
def __init__(self, env, noop_max=30):
"""Sample initial states by taking random number of no-ops on reset.
No-op is assumed to be action 0.
"""
gym.Wrapper.__init__(self, env)
self.noop_max = noop_max
self.override_num_noops = None
self.noop_action