《强化学习:原理与Python实现 》 —1.6.3 小车上山

举报
华章计算机 发表于 2019/11/12 20:40:36 2019/11/12
【摘要】 本节书摘来自华章计算机《强化学习:原理与Python实现》 一书中第一章,第1.6.3节,作者肖智清。

1.6.3 小车上山

本节通过一个完整的例子来学习如何与Gym库中的环境交互。本节选用的例子是经典的控制任务:小车上山(MountainCar-v0)。本节主要关心交互的Python代码,而不详细介绍这个控制任务及其求解。任务的具体描述和求解方式会在第6章中介绍。

首先我们来看看这个任务的观测空间和动作空间,可以通过执行代码清单1-1实现。

代码清单1-1 导入环境并查看观测空间和动作空间

image.png

这段代码的运行结果为:

观测空间 = Box(2,)

动作空间 = Discrete(3)

观测范围 = [-1.2  -0.07] ~ [0.6  0.07]

动作数 = 3

运行结果告诉我们,观测空间是形状为(2,)的浮点型np.array,而动作空间是取的int型数值。

接下来考虑智能体。智能体往往是我们自己实现的。代码清单1-2给出了一个智能体类—BespokeAgent类。智能体的decide()方法实现了决策功能,而learn()方法实现了学习功能。代码清单1-2给出的BespokeAgent类是一个比较简单的类,它只能根据给定的数学表达式进行决策,并且不能有效学习。所以它并不是一个真正意义上的强化学习智能体类。但是,用于演示智能体和环境的交互已经足够了。

代码清单1-2 根据指定确定性策略决定动作的智能体

image.png

接下来我们试图让智能体与环境交互。代码清单1-3中的play_once() 函数可以让智能体和环境交互一个回合。这个函数有4个参数。

参数env是环境类。

参数agent是智能体类。

参数render是bool类型变量,指示在运行过程中是否要图形化显示。如果函数参数render为True,那么在交互过程中会调用env.render()以显示图形化界面,而这个界面可以通过调用env.close()关闭。

参数train是bool类型的变量,指示在运行过程中是否训练智能体。在训练过程中应当设置为True,以调用agent.learn()函数;在测试过程中应当设置为False,使得智能体不变。

这个函数有一个返回值episode_reward,是float类型的数值,表示智能体与环境交互一个回合的回合总奖励。

代码清单1-3 智能体和环境交互一个回合的代码

image.png

image.png

借助于代码清单1-1给出的环境、代码清单1-2给出的智能体和代码清单1-3给出的交互函数,我们可以用下列代码让智能体和环境交互一个回合,并在交互过程中图形化显示。交互完毕后,可用env.close()语句关闭图形化界面。

env.seed(0) # 设置随机数种子,只是为了让结果可以精确复现,一般情况下可删去

episode_reward = play_montecarlo(env, agent, render=True)

print('回合奖励 = {}'.format(episode_reward))

env.close() # 此语句可关闭图形界面

为了系统评估智能体的性能,下列代码求出了连续交互100回合的平均回合奖励。小车上山环境有一个参考的回合奖励值,如果当连续100个回合的平均回合奖励大于,则认为这个任务被解决了。BespokeAgent类对应的策略的平均回合奖励大概就在左右。

代码清单1-4 运行100回合求平均以测试性能

image.png


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。