在openai/gym中使用自己的环境

  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

你可能感兴趣的:(强化学习)