Sarsa(lambda)

Sarsa(n)

Sarsa 是一种单步更新法
Sarsa(0):,在环境中每走一步, 更新一次自己的行为准则
Sarsa(1):走完这步, 再走一步, 然后再更新
Sarsa(n):等待回合完毕我们一次性再更新
Sarsa(lambda):ambda 值来代替想要选择的步数

单步更新 and 回合更新

  • 单步更新:虽然每一步都在更新, 但是在没有获取宝藏的时候, 现在站着的这一步也没有得到更新,直到获取宝藏时,才为获取到宝藏的上一步更新为: 这一步很好, 和获取宝藏是有关联的,而之前为了获取宝藏所走的所有步都被认为和获取宝藏没关系
  • 回合更新:等到这回合结束, 才开始对本回合所经历的所有步都添加更新, 但是这所有的步都是和宝藏有关系的, 都是为了得到宝藏需要学习的步,所以每一个脚印在下回合被选则的几率又高了一些. 在这种角度来看, 回合更新似乎会有效率一些.

Lambda 含义

lambda 就是一个衰变值, 可以让你知道离奖励越远的步可能并不是让你最快拿到奖励的步, 所以在宝藏的位置, 回头看看走过的寻宝之路, 离宝藏越近的脚印越看得清, 远处的脚印小, 很难看清, 那就索性记下离宝藏越近的脚印越重要, 越需要被好好的更新. 和之前的 奖励衰减值 gamma 一样, lambda 是脚步衰减值, 都是一个在 0 和 1 之间的数.

Lambda 取值

在这里插入图片描述
lambda 取0, 就变成了 Sarsa 的单步更新, 当 lambda 取 1, 就变成了回合更新, 对所有步更新的力度都是一样. 当 lambda 在 0 和 1 之间, 取值越大, 离宝藏越近的步更新力度越大. 这样我们就不用受限于单步更新的每次只能更新最近的一步, 我们可以更有效率的更新所有相关步了.

Lambda 实例

除了更新宝藏前一步,还更新了来时的道路
参考函数
在这里插入图片描述
在这里插入图片描述
runthis与sarsa实例一样,RL_brain中有改动
在这里插入图片描述

学习部分函数

只需要编写 SarsaLambdaTable 中 learn 这个功能就完成了. 因为其他功能都和父类是一样的.

对于经历过的 state-action, 我们让他+1, 证明他是得到 reward 路途中不可或缺的一环

def learn(self, s, a, r, s_, a_):

    self.check_state_exist(s_)

    q_predict = self.q_table.loc[s, a]

    if s_ != 'terminal':

        q_target = r + self.gamma * self.q_table.loc[s_, a_]  # next state is not terminal

    else:

        q_target = r  # next state is terminal

    error = q_target - q_predict

    # 对于经历过的 state-action, 我们让他+1, 证明他是得到 reward 路途中不可或缺的一环

    # Method 1:#没有封顶数图中的accumulating trace

    # self.eligibility_trace.loc[s, a] += 1

    # Method 2:有封顶的 这种方式带来的不可或缺性有多少

    self.eligibility_trace.loc[s, :] *= 0#在这个state没有这个action为0 采取这个action设为1

    self.eligibility_trace.loc[s, a] = 1

    # Q update除了*error还要*eligibility_trace

    self.q_table += self.lr * error * self.eligibility_trace

    # decay eligibility trace after update

    self.eligibility_trace *= self.gamma * self.lambda_#衰变
发布了20 篇原创文章 · 获赞 16 · 访问量 1724

猜你喜欢

转载自blog.csdn.net/komorebi6/article/details/104729948
今日推荐