7.3 Hello World!OpenAI Gym

我们以经典的CartPole问题开始我们的OpenAI Gym之旅,本节代码在配套GitHub的code/CartPole-v0-demo.py。

如图7-3所示,在CartPole中,黑色的小车上面支撑的一个连杆,连杆会自由摆动,我们需要控制黑色的小车,通过左右移动小车,保持连杆的平衡。

图7-3 CartPole问题

如图7-4所示,在强化学习中有几个基本的概念:

·Environment,即所谓的环境,比如CartPole和Acrobot都是一种环境。

·Agent,即所谓的智能体,与环境进行交互。

·Action,即所谓的动作,动作可以是连续的也可以是离散的。

·Observation,即所谓的观察或者说状态,包含Agent执行动作以后进入的下一个状态,状态可以是连续的也可以是离散的。

·Reward,即所谓的奖励,Agent执行动作后会得到环境反馈的奖励。

Agent在具体环境下基于一定的策略判断后执行动作,然后会得到环境的奖励和反馈,这就是强化学习中的一个典型交互过程。CartPole就是这个环境,我们开发的强化学习算法就是Agent。

图7-4 强化学习基本概念图

我们初始化CartPole环境,直接引用gym。使用gym的make方法,需要指定初始化的环境的名称,在本例中环境的名称为CartPole-v0:


import gym
env = gym.make('CartPole-v0')

接着我们需要重置环境,让环境恢复到一个随机状态,在强化学习中需要在一个环境下多次学习,所以每次学习之前重置环境是非常重要的,通常使用env的reset方法即可:


observation = env.reset()

环境重置后,env会反馈当前环境的一些参数,返回的结果以observation对象的形式体现。observation对象的内容是可以自定义的,最简单的情况下,observation对象就是返回Agent的状态。以CartPole-v0为例,打印环境重置后获得的observation对象的内容:


print observation

得到observation对象的具体内容如下:


[-0.02159057 -0.03945381  0.00044521  0.01299886]

CartPole-v0中,Agent可以执行的动作只有两种,即向左移动小车还是向右移动小车。在env的action_space属性中会记录该env对应的环境的动作有哪些:


print "env actionspace:"
print(env.action_space)

打印的结果表明,动作是离散的,包含两个值,这与我们的预期一致:


env actionspace:
Discrete(2)

CartPole-v0的状态空间相对复杂,需要使用一个四维向量来表示当前的状态。在env的observation_space属性中会记录该env对应的状态空间,对于连续型的状态,会通过observation_space.high和observation_space.low两个属性表明其范围:


print "env observationspace:"
print(env.observation_space)
print(env.observation_space.high)
print(env.observation_space.low)

打印的结果表明,状态是连续的,对应的是一个四维向量,每个维度对应的范围如下:


Box(4,)
[  4.80000000e+00   3.40282347e+38   4.18879020e-01   3.40282347e+38]
[ -4.80000000e+00  -3.40282347e+38  -4.18879020e-01  -3.40282347e+38]

当我们的Agent基于一定的策略对环境执行一个动作之后,会得到环境的反馈,这个过程通常使用env的step方法完成:


observation, reward, done, info = env.step(action)

执行完动作以后,step方法会返回4个参数,这4个参数分别为:

·observation,Agent进入的下一个状态。

·reward,Agent执行动作得到的奖励。

·done,表明学习过程是否结束了。

·info,扩展信息。

强化学习最核心的地方就是如何针对当前的状态选择最优的动作,这部分内容本书后面将重点介绍。最简单的情况下,我们每次都随机选择一个动作:


action = env.action_space.sample()

我们通过多次循环,随机选择动作执行,如果达到退出条件就退出:


for t in range(100):
    #随机选择一个动作
    action = env.action_space.sample()
    #执行动作 获取环境反馈
    observation, reward, done, info = env.step(action)
    #如果玩死了就退出
    if done:             
        break
    env.render()

程序运行起来后,如图7-5所示,会显示一个图形界面,CartPole中的小车随机左右摆动,不一会连杆失去平衡倒地,程序结束。至此我们完成了OpenAI Gym的Hello World!

图7-5 CartPole-v0运行图