core.Env类
作为一个环境,他需要有如下的成员变量:
- action_space
agent的动作空间( 逻辑上是不需要有这个的,但是代码实现上需要有——用来确认传入的action没有出错——for code robustness 仅此而已)
这个Agent类也要有的
- observation_space
state_space 这个Env类肯定要有的
- current state
当前Agent的state,一方面用于给Agent一个反馈 ,另一方面在step函数里面要用到
虽然一开始会觉得Agent拥有这个成员变量会好一些,但是其实由Env保存并给出更合理
作为一个环境,他需要有如下的function:
-
render(mode=‘human’)
用于渲染动画(无需可视化就不需要)
-
reset()
每次一个episode结束了以后重新开始
-
seed()
给出基于当前环境下的一个随机值
-
step(action)
根据传入的动作进行状态转移,并且返回observation,reward,done(是否到达episode的重点),info(多用于调试用)
-
close()
相当于析构函数
Agent类
这部分不是源码里的,是我看到Env类自己想的
需要有的成员变量:
- Env
逻辑上不知道整个环境的模型,所以实现的时候也不会通过这个类获得环境的参数,只不过利用这个类的step()来获得reward以模拟和未知世界的交互
- action_space
逻辑和代码上都是需要的
- current_state
Env类给的反馈
- Qtable / Etable / approximation function
需要有的成员函数:
- act(action)
执行当前动作,实际上调用Env的step函数
不需要传入state参数? 直接利用self.current_state就行
- performPolicy( epsilon ,epoch) ->action
不需要传入state参数? 直接利用self.current_state就行
epsilon ,epoch用于exploitation和exploitation的衰减
实际上只是一个Agent类的通用API ,里面会调用每个具体agent自己实现的算法( sth like function:_curPolicy() )
- learning( alpha(learning rate) ,gamma(discoumt factor) ,lambda )
updata自己对这个世界模型的想法(主要是值函数的进一步更新与估计)
(要调的参数好多哦…)
- 一些辅助类(like _init , _get , _set )
Space类
本身就是一个现实世界的”物品“的代码投射,我们这里主要关注它的成员函数
- sample( ) ->action
Uniformly randomly sample a random element of this space(注意,这里的sample不是采样episode而是采样一个action哦)
- seed( )
- contains( x ) ->boolean
specifying if x is a valid member of this space
在Env里面之所以要包含一个Space类就是为了利用这个函数来检查传入参数的合法性
关于调参
- alpha 学习步长
应该不断衰减
如果没有收敛,那么就是后期衰减力度不够或者训练的epoch太少【啥情况要加大数据量来着。。。】
- gamma 折扣因子
这部分还不是很清楚怎么调参
- lambda
balance TD and MC , more unbias when goes to 1 ( equal to MC ) and less variance when goes to 0 ( equal to TD(0) ) )