《强化学习:原理与Python实现 》 —1.6.3 小车上山
1.6.3 小车上山
本节通过一个完整的例子来学习如何与Gym库中的环境交互。本节选用的例子是经典的控制任务:小车上山(MountainCar-v0)。本节主要关心交互的Python代码,而不详细介绍这个控制任务及其求解。任务的具体描述和求解方式会在第6章中介绍。
首先我们来看看这个任务的观测空间和动作空间,可以通过执行代码清单1-1实现。
代码清单1-1 导入环境并查看观测空间和动作空间
这段代码的运行结果为:
观测空间 = 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 根据指定确定性策略决定动作的智能体
接下来我们试图让智能体与环境交互。代码清单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 智能体和环境交互一个回合的代码
借助于代码清单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回合求平均以测试性能
- 点赞
- 收藏
- 关注作者
评论(0)