gym是openai推出的强化学习框架,它提供了丰富的接口给开发者使用,再结合其开源的常见算法实现openai/baselines,能够使开发者方便地将各种强化学习算法应用到自己的需求中。
环境是强化学习算法中的重要一环,环境如何对agent的动作进行反馈,即state和reward的更新,直接影响了agent后续的动作。因此,针对不同的需求,我们需要定义自己的环境。下面就主要介绍如何在gym中使用自己的环境。
首先需要定义自己的环境myenv.py,其代码框架如下:
from gym import spaces, core
# core.Env是gym的环境基类,自定义的环境就是根据自己的需要重写其中的方法;
# 必须要重写的方法有:
# __init__():构造函数
# reset():初始化环境
# step():环境动作,即环境对agent的反馈
# render():如果要进行可视化则实现
class MyEnv(core.Env):
def __init__(self):
self.action_space = spaces.Box(low=-1, high=1, shape=(1, )) # 动作空间
self.observation_space = spaces.Box(low=-1, high=1, shape=(1, )) # 状态空间
# 其他成员
def reset(self):
...
obs = self.get_observation()
return obs
def step(self, action):
...
reward = self._get_reward()
done = self._get_done()
obs = self._get_observation(action)
info = {} # 用于记录训练过程中的环境信息,便于观察训练状态
return obs, reward, done, info
# 根据需要设计相关辅助函数
def _get_observation(self, action):
...
return obs
def _get_reward(self):
...
return reward
def _get_done(self):
...
return done
定义好自己的环境后,必须将其注册到gym中去,才能使用。下面介绍如何注册环境:
首先建立一个文件夹env,将定义好的环境myenv.py放入其中,并在该目录下再新建一个文件__init__.py,文件内容如下:
from gym.envs.registration import register
register(
id = 'env_name-v0' # 环境名,版本号v0必须有
entry_point = 'env.myenv:MyEnv' # 文件夹名.文件名:类名
# 根据需要定义其他参数
)
注意,entry_point的路径一定要在sys.path中,以便你在注册环境时,gym能够找到,如果该路径不在系统路径中,则会报错。
上一步完成后,有两种方法完成环境的注册:
方法一:(较为方便,推荐)
在定义环境的py文件中加上:
import env # 上一步的文件夹名
例如:
import gym
import env
env = gym.make('env_name-v0') # 参数为环境的id
obs = env.reset()
for i in range(1000):
action = agent(obs)
obs, reward, done, info = env.step(action)
if done:
break
若使用openai/baselines,即在baselines/common/cmd_util.py文件中加上这一句。
若这一步之后,在添加环境时找不到相应的包,那就是因为gym找不到entry_point的路径,则需要在添加环境的py文件中:
import sys
sys.path.append('./') # 此时假设此py文件和env文件夹在同一目录下
import env # 一定要在sys.path.append()之后
方法二:
进入gym/envs在本地的安装目录,比如我的是/usr/local/miniconda3/lib/python3.6/site-packages/gym/gym/envs,在该目录下找一个与你的环境比较相似的环境类型(其实随便选一个就可以),比如classic_control,将myenv.py放在该目录下,并在该目录中的__init__.py中加上一句:
from gym.envs.classic_control.myenv import MyEnv
完成后,返回gym/envs目录,在该目录的__init__.py中注册环境:
register(
id = 'env_name-v0' # 环境名,版本号v0必须有
entry_point = 'env.myenv:MyEnv' # 文件夹名.文件名:类名
# 根据需要定义其他参数
)
至此,就完成了环境的注册,就可以使用自定义的环境了!
官方的环境注册方法:
https://github.com/openai/gym/blob/master/docs/creating-environments.md