我们以经典的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运行图