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):
...
reward = self.get_reward()
done = self.get_done()
obs = self.get_observation()
info = {} # 用於記錄訓練過程中的環境信息,便於觀察訓練狀態
return obs, reward, done, info
def get_observation(self):
...
return obs
def get_reward(self):
...
return reward
def get_done(self):
...
return done
定義好自己的環境後,必須將其註冊到gym中去,才能使用。下面介紹如何註冊環境:
首先建立一個文件夾myenv,將定義好的環境myenv.py放入其中,並在該目錄下再新建一個文件__init__.py,文件內容如下:
from gym.envs.registration import register
register(
id = 'env_name-v0' # 環境名,版本號v0必須有
entry_point = 'myenv.myenv:MyEnv' # 文件夾名.文件名:類名
# 根據需要定義其他參數
)
上一步完成後,有兩種方法完成環境的註冊:
方法一:(較爲方便,推薦)
在定義環境的py文件中加上:
import myenv # 上一步的文件夾名
例如:
import gym
import myenv
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/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 = 'myenv.myenv:MyEnv' # 文件夾名.文件名:類名
# 根據需要定義其他參數
)
至此,就完成了環境的註冊,就可以使用自定義的環境了!