0 引言
David Silver课程中使用了很多GridWorld的例子,如Samll GridWorld, Random Walk, Windy GridWorld, GridWorld, Cliff Walking. 这些例子中状态空间和动作空间都是离散的有限值,可以用gym中Discrete类来描述,另外这些例子都是用格子来表示世界,动作都是上下左右,所以可以考虑建立一个通用的GridWorld环境类,通过配置格子的数量、属性等来具体描述每一个例子。
1 通用的GridWorld环境类
整体思路是编写GridWorldEnv类,然后按照【强化学习】算法实践-OpenAI gym中介绍的办法来注册。
设计三个类 Grid GridMatrix GridWorldEnv
Grid 负责管理单个格子的属性,包括
2 Sarsa实现
通过设计一个Agent类的方式来实现。要怎么设计呢?
|
|
Sarsa算法需要维护一个动作-状态值函数表$Q(x,a)$,也就是处于状态$x$的时候,采取动作$a$的价值。首先需要设计$Q$表的数据结构,怎么设计呢?字典套字典,即字典里的每一个健对应于状态名,其值对应于另一个新字典,这个新字典的键值是行为名,值对应相应的行为价值。
{“s0”:{“a0”:q_value00, “a1”: q_value01, …}, “s1”:{“a0”:q_value10, “a1”: q_value11, …}, …}
为了对$Q$表进行查询、更新等操作,需要定义几个私有方法来供agent类内部使用:
下面就是Agent类的重头戏,performPolicy和learning
|
|
执行策略中的use_epsilon参数可以使我们随时切换是否使用$\epsilon$。通过这样的设置,今后可以很容易将SARSA算法修改为Q学习算法。
learning部分Sarsa算法的实现:(只向前看一步)
试验问题:会出现反复,结果好坏相间,不具有严格单调性
3 Sarsa($\lambda$)实现
Agent类的部分和Sarsa基本一致,主要区别在两点:一是learning方法,二是Sarsa($\lambda$)算法要维护一个E表(效用追踪)。
PS: 容易在代码的世界里迷失,找不到的公式的感觉
4 理想与现实的差距-格子世界毕竟是格子世界
参考文献
[1] David Silver, reinforcement learning lecture
[2] 叶强, David Silver强化学习公开课中文讲解及实践, 知乎专栏