RL实践2——RL环境gym搭建
时间:2022-07-24
本文章向大家介绍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
里,定义两个最基本的基类Env
和Space
-
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,方便调用
设置过程
- 打开gym.envs目录:
/usr/local/lib/python3.7/site-packages/gym/envs
- 将自己编写的myenv.py拷贝至一个
custom
目录 -
envs/custom
下__init__.py
添加from gym.envs.custom.myenv import MyEnv
,将子文件夹的.py
import到上层目录 - env下
__init__.py
添加
register(
id='myenv-v0',
entry_point='gym.envs.custom:MyEnv,
max_episode_steps=999, #限制了最大终止仿真步数
)
授权gym
的方法可以调用myenv.py
中的MyEnv
class
- 注意:
-
__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() # 关闭环境,一般涉及图像绘制的任务,此步为必须
- Android StringEntity() 和 UrlEncodedFormEntity() 的区别
- 如何根据日志查看删除的数据(转译)
- 具体问题解决:分离脚本
- 独家 | 手把手教你用Python 3创建用于机器学习开发的Linux虚拟机(附安装教程、代码)
- TSQL--临时表和表变量
- 微软开源 C++ REST SDK
- 使用Autofac在ASP.NET Web API上实现依赖注入
- Universal-Image-Loader完全解析--从源代码分析Universal-Image-Loader中的线程池
- 我是怎样爬下6万共享单车数据并进行分析的(附代码)
- 数据库压缩备份提高备份效率
- 教你用TensorFlow和自编码器模型生成手写数字(附代码)
- 开源OCR引擎Tesseract
- 数据仓库中如何使用索引
- PowerBI 引入时间智能
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- socket.io实践干货
- 0800-5.16.2-如何禁用Hue中Oozie的部分Action
- linux ulimit 调优
- 初识ABP vNext(3):vue对接ABP基本思路
- 0801-什么是Apache Ranger - 4 - Resource vs Tag Based Policies
- IDA-3D技术细节分析
- 0802-Cloudera Data Center7.1.3正式GA
- 2017,科学使用strace神器(附代码,举栗子)
- kubernete编排技术四:Job和CronJob
- Go 视图模板篇(二):模板指令
- go语言学习(五):通道的用法
- PHP无锁内存nosql---Yac的实战
- 0803-什么是Apache Ranger - 5 - Hive Plugin
- 2017年的golang、python、php、c++、c、java、Nodejs性能对比[续]
- go语言学习(四):数组和切片