RL實踐2——RL環境gym搭建


RL回顧

首先先來回顧一下強化學習問題中,環境Env 和 代理Agent 分別承擔的角色和作用。

RL組成要素是Agent、Env

代理環境 分別承擔的作用

  • Agent:
    由Policy 和 RL_Algorithm構成,這種對RL_algorithm的算法理解比較寬泛
    • policy負責將observation映射為action
    • RL_Algorithm負責優化policy,具有學習和搜索(規划)的能力
  • Enviroment:
    • 輸入action
    • 輸出reward、state
    • 內部還需要完成執行狀態轉移、判斷是否終止等任務
  • Agent的構成的另一種理解
    組成要素:Policy、Value function、Model其中至少一個

gym

gym介紹

gym是一個熱門的學習庫,搭建了簡單的示例,其主要完成的功能,是完成了RL問題中Env的搭建。

  • 對於強化學習算法的研究者,可以快速利用多種不同的環境驗證迭代自己的算法有效性。
  • 對於強化學習應用的研究者,我們可以效仿gym中的接口,搭建自己的環境。

gym定義

gym是一個class 的形式,完成了接口定義和調用

gym的核心代碼寫在core.py里,定義兩個最基本的基類EnvSpace

  • Space
    • Discrete類,定義離散狀態、動作,初始化需要1個參數,維度n
    • Box類,定義連續狀態、動作,初始化需要2個array(size=維數n)

偽代碼如下:

  • 環境Env
class Environment():
    self.states  # 所有可能的狀態集合
    self.agent_cur_state    # 記錄個體當前的狀態
    self.observation_space  # 個體的觀測空間
    self.action_space  # 個體的行為空間
        
    def reward(self) -> reward # 根據狀態確定個體的即時獎勵
    def dynamics(self, action) -> None # 根據當前狀態和個體的行為確定個體的新狀態
    def is_episode_end(self) -> Bool # 判斷是否一個Episode結束
def obs_for_agent() -> obs  # 環境把個體當前狀態做一定變換,作為個體的觀測
  • 代理Agent
class Agent(env: Environment):
    self.env = env  # 個體依附於一個環境存在
    self.obs # 個體的觀測
    self.reward # 個體獲得的即時獎勵

    def performPolicy(self, obs) -> action # 個體執行一個策略產生一個行為

    def performAction(self, action) -> None  # 個體與環境交互,執行行為
        action = self.performPolicy(self.obs)
        self.env.dynamics(action)

    def observe(self) -> next_obs, reward # 個體得到從環境反饋來的觀測和獎勵
        self.obs = self.env.obs_for_agent()
        self.reward = self.env.reward()

gym調用

gym的調用框架

env = gym.make('x')
observation = env.reset()
for i in range(time_steps):
    env.render() # 調用第三方庫刷動畫寫這里
    action = policy(observation)
    observation, reward, done, info = env.step(action)
    if done:
        ……
        break
env.close()

例子

例程是一個簡單的策略,桿左斜車左移,右斜則右移。

import gym
import numpy as np
env = gym.make('CartPole-v0')
t_all = [ ]
action_bef = 0
for i_episode in range(5):
    observation = env.reset()
    for t in range(100):
        env.render()
        cp, cv, pa, pv = observation
        if abs(pa)<= 0.1:
            action = 1 -action_bef
        elif pa >= 0:
            action = 1
        elif pa <= 0:
            action = 0
        observation, reward, done, info = env.step(action)
        action_bef = action
        if done:
            # print("Episode finished after {} timesteps".format(t+1))
            t_all.append(t)
            break
        if t ==99:
            t_all.append(0)
env.close()
print(t_all)
print(np.mean(t_all))


gym的搭建

函數接口

一個完整的gym環境包括以下函數:

  • class Cartpoleenv(gym.env)
    • def __ init __(self):類構建
    • def reset(self):初始化
    • def seed(self, seed = None):隨機初始條件種子return [seed]
    • def step(self, action): 單步仿真observation, reward, done, info
    • def render(self, mode='human'):圖像引擎調用繪制窗口return self.viewer.render()
    • def close():關閉窗口

功能函數

  • 參數限位
    vel = np.clip(vel, vel_min, vel_max)

  • action輸入校驗
    self.action_space.contains(action)

  • action和observation空間定義

例子:
Discrete: 0,1,2三個離散值

low = np.array([min_0,min_1],dtype=np.float32)
high = np.array([max_0,max_1],dtype=np.float32)
self.action_space = spaces.Discrete(3)
self.observation_space = spaces.Box(
self.low, self.high, dtype=np.float32)

agent 的構建

agent與環境進行交互,輸入是env的輸出(observation),輸出是env的輸入(action)

class Agent():
    def __ init__(self,action_space):
        self.action_space = action_space
    def act(self, observation, reward, done):
        return action

agent和env交互邏輯如下:

nb_episodes = xx
nb_steps = xx
reward = 0
done = False        
for i in range(nb_episodes):
    ob = env.reset()
    sum_reward = 0
    for j in range(nb_steps):
        action = agent.act(ob, reward, done)
        ob, reward, done, _ = env.step(action)
        sum_reward += reward
        if done:
            break

添加自己寫的環境到gym,方便調用

設置過程

  1. 打開gym.envs目錄:/usr/local/lib/python3.7/site-packages/gym/envs
  2. 將自己編寫的myenv.py拷貝至一個custom目錄
  3. envs/custom__init__.py添加 from gym.envs.custom.myenv import MyEnv ,將子文件夾的.pyimport到上層目錄
  4. env下__init__.py添加
register(
id='myenv-v0',
entry_point='gym.envs.custom:MyEnv,
max_episode_steps=999,      #限制了最大終止仿真步數
)

授權gym的方法可以調用myenv.py中的MyEnvclass

  • 注意:
    • __init__.py里的register方法中env_name版本號-v0不能省略
    • 調用的時候,也要帶上環境相應的版本號

調用方法

env_name = 'myenv-v0'
env = gym.make('env_name')
env.reset()     # 初始化環境
env.render()    # 繪制環境,if necessary
env.step()      # 單步仿真
env.close()     # 關閉環境,一般涉及圖像繪制的任務,此步為必須


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM