工欲善其事必先利其器,借助一个好的开发平台,我们能够快速地将理论知识变成代码,从而实现和验证我们的一些想法。Openai的gym(openai/gym)便是这样一个好的平台。之所以说它好,是因为它背后有一支强大的团队在支持,维护和更新,这保证了平台的可持续性。而且它是openai于2017年5月16号,也就是前天释放出来的roboschool(openai/roboschool)的基础;它还可以与谷歌的tensorflow联合使用,等等。因此,我们在实战系列的第一讲中比较全面地介绍下gym。为方便交流,公布个交流群。
本讲打算分3个小节对gym进行介绍。
第1小节:gym安装及简单的demo示例
第2小节:深入剖析gym的环境构建
第3小节:构建自己的gym环境
第1小节,gym安装及简单的demo示例
该小节讲的是gym在ubuntu下的安装,其他系统可参考官网安装过程。
1.1 为了便于管理,需要先装anaconda. 具体下载和安装步骤如下:
Step1. 下载anaconda安装包 .推荐利用清华镜像来下载,下载地址为:
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive 。我装的是Anaconda3-4.3.0版本。
Step2. 安装anaconda。下载完成anaconda后,安装包会在Dowloads文件夹下,在终Ctrl+Alt+T打开终端)键入cd Downloads, 然后键入 bash Anaconda3_4.3.0-Linux-x86_64.sh(小技巧,键入bash an然后按Tab键,linux系统会自动补全后面的名字)
Step3. 安装过程会询问你是否将路径安装到环境变量中,键入yes, 至此Anaconda安装完成。你会在目录/home/你的用户名文件夹下面看到anaconda3。关掉终端,再开一个,这样环境变量才起作用。
1.2. 利用anaconda建一个虚拟环境。
Anaconda创建虚拟环境的格式为:conda create –-name 你要创建的名字 python=版本号。比如我创建的虚拟环境名字为gymlab(你可以用自己的环境名), 用的python版本号为3.5,可这样写:
conda create –-name gymlab python=3.5
操作完此步之后,会在anaconda3/envs文件夹下多一个gymlab。Python3.5就在gymlab下得lib文件夹中。
1.3 安装gym
上一步已经装了一个虚拟环境gymlab, 在这一步要应用。
开一个新的终端,然后用命令source activate gymlab激活虚拟环境,然后再装gym。具体步骤如下:
Step1. 键入git clone openai/gym,将gym克隆到计算机中. 如果你的计算机中没有安装git, 那么可以键入:sudo apt install git.先安装git.
Step2. cd gym 进入gym文件夹
Step3. pip install –e ‘.[all]’进行完全安装。等待,会装一系列的库等. 装完后可以将你的gym安装文件的目录写到环境变量中,一种方法是打开.bashrc文件,在末尾加入语句:
export PYTHONPATH=你的gym目录:$PYTHONPATH。如果不出意外的话,你就可以开始享用gym了。
对于step3, 如果报错可以先安装依赖项,键入命令sudo apt-get install -y python-numpy python-dev cmake zlib1g-dev libjpeg-dev xvfb libav-tools xorg-dev python-opengl libboost-all-dev libsdl2-dev swig,然后再按照Step3的命令安装。
下面给出一个最简单的例子:
1. 开一个终端(ctr+alt+t), 然后激活用anaconda建立的虚拟环境:
source activate gymlab
2. 运行python:
python
3. 导入gym模块
import gym
4. 创建一个小车倒立摆模型
env = gym.make(‘CartPole-v0’)
5. 初始化环境
env.reset()
6. 刷新当前环境,并显示
env.render()
通过这6步,我们可以看到一个小车倒立摆系统.如下图所示:
讯享网
第2小节,深入剖析gym环境构建
我们继续讲,从第1小节的尾巴开始。有三个重要的函数:
env = gym.make(‘CartPole-v0’)
env.reset()
env.render()
第一个函数是创建环境,我们会在第3小节具体讲如何创建自己的环境,所以这个函数暂时不讲。第二个函数env.reset()和第三个函数env.render()是每个环境文件都包含的函数。我们以cartpole为例,对这两个函数进行讲解。
Cartpole的环境文件在~你的gym目录/gym/envs/classic_control/cartpole.py.
该文件定义了一个CartPoleEnv的环境类,该类的成员函数有:seed(), step(),reset()和render(). 第1小节调用的就是CartPoleEnv的两个成员函数reset()和render()。下面,我们先讲讲这两个函数,再介绍step()函数
2.1 reset()函数详解
reset()为重新初始化函数。那么这个函数有什么用呢?
在强化学习算法中,智能体需要一次次地尝试,累积经验,然后从经验中学到好的动作。一次尝试我们称之为一条轨迹或一个episode. 每次尝试都要到达终止状态. 一次尝试结束后,智能体需要从头开始,这就需要智能体具有重新初始化的功能。函数reset()就是这个作用。

reset()的源代码为:
def _reset()
self.state = self.np_random.uniform(low=-0.05, high=0.05, size=(4,))
self.steps_beyond_done = None
return np.array(self.state)
第一行代码是利用均匀随机分布初试化环境的状态。
第二行代码是设置当前步数为None
第3行,返回环境的初始化状态。
2.2 render()函数详解
render()函数在这里扮演图像引擎的角色。一个仿真环境必不可少的两部分是物理引擎和图像引擎。物理引擎模拟环境中物体的运动规律;图像引擎用来显示环境中的物体图像。其实,对于强化学习算法,该函数可以没有。但是,为了便于直观显示当前环境中物体的状态,图像引擎还是有必要的。另外,加入图像引擎可以方便我们调试代码。下面具体介绍gym如何利用图像引擎来创建图像。
我们直接看源代码:
def _render(self, mode=’human’, close=False):
if close:
…. #省略,直接看关键代码部分
if self.viewer is None:
from gym.envs.classic_control import rendering
#这一句导入rendering模块,利用rendering模块中的画图函数进行图形的绘制
#如绘制600*400的窗口函数为:
self.viewer = rendering.Viewer(screen_width, screen_height)
其中screen_width=600, screen_height=400
#创建小车的代码为:
l,r,t,b = -cartwidth/2, cartwidth/2, cartheight/2, -cartheight/2
axleoffset =cartheight/4.0
cart = rendering.FilledPolygon([(l,b), (l,t), (r,t), (r,b)])
其中rendering.FilledPolygon为填充一个矩形。
创建完cart的形状,接下来给cart添加平移属性和旋转属性。将车的位移设置到cart的平移属性中,cart就会根据系统的状态变化左右运动。具体代码解释,我已上传到github上面了,gxnk/reinforcement-learning-code 。想深入了解的同学可去下载学习。
2.3 step()函数详解
该函数在仿真器中扮演物理引擎的角色。其输入是动作a,输出是:下一步状态,立即回报,是否终止,调试项。
该函数描述了智能体与环境交互的所有信息,是环境文件中最重要的函数。在该函数中,一般利用智能体的运动学模型和动力学模型计算下一步的状态和立即回报,并判断是否达到终止状态。
我们直接看源代码:
def _step(self, action):
assert self.action_space.contains(action), "%r (%s) invalid"%(action, type(action))
state = self.state
x, x_dot, theta, theta_dot = state #系统的当前状态
force = self.force_mag if action==1 else -self.force_mag #输入动作,即作用到车上的力
costheta = math.cos(theta) #余弦函数
sintheta = math.sin(theta) #正弦函数
#底下是车摆的动力学方程式,即加速度与动作之间的关系。
temp = (force + self.polemass_length * theta_dot * theta_dot * sintheta) / self.total_mass
thetaacc = (self.gravity * sintheta - costheta* temp) / (self.length * (4.0/3.0 - self.masspole * costheta * costheta / self.total_mass)) #摆的角加速度
xacc = temp - self.polemass_length * thetaacc * costheta / self.total_mass #小车的平移加速
x = x + self.tau * x_dot
x_dot = x_dot + self.tau * xacc
theta = theta + self.tau * theta_dot
theta_dot = theta_dot + self.tau * thetaacc #积分求下一步的状态
self.state = (x,x_dot,theta,theta_dot)
2.4 一个简单的demo
下面,我给出一个最简单的demo,让大家体会一下上面三个函数如何使用。
import gym import time env = gym.make('CartPole-v0') #创造环境 observation = env.reset() #初始化环境,observation为环境状态 count = 0 for t in range(100): action = env.action_space.sample() #随机采样动作 observation, reward, done, info = env.step(action) #与环境交互,获得下一步的时刻 if done: break env.render() #绘制场景 count+=1 time.sleep(0.2) #每次等待0.2s print(count) #打印该次尝试的步数
讯享网
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/64740.html