强化学习(二):SARSA,附代码改写

强化学习(二):SARSA,附代码改写

本篇文章带来第二个经典强化学习算法:SARSA。

SARSA这个名字其实是State、Action、Reward、State_、Action_的组合,因为它在计算Q值的时候利用到了这五个值,其中State_是下一个时刻的状态,Action是下一个时刻的动作。相比于Q-learning的不同在于SARSA的Q值计算用到了下一时刻的动作,而Q-learning没有,Q-learning只用到了SARS,前四个。

SARSA与Q-learning很相似,也有不同,它们的不同之处在于SARSA是在线on-policy算法,而Q-learning是离线算法;并且我们在计算SARSA的Q值时用到了下一时刻的动作A_,这也是SARSA的一个特点,就是说agent在下一时刻一定是执行动作A_,而Q-learning不是。到后面如果大家按照我的方法去改强化学习(一)的Q-learning的代码就会发现,我们把绿色三角形比作悬崖,如果agent碰到悬崖就会死亡,那么Q-learning的agent就是不怕死的类型,它很快就能训练到收敛,可以得到“最优路径”;而SARSA的agent不同,它就比较“害怕死亡”,所以在最初的几次"死亡"后,它会避开障碍物,或者说会犹豫,这一步在运行代码的时候比较明显能看出来,所以SARSA的训练时间就本篇文章的代码而言要比Q-learning长一些。

但是从实际上来看,SARSA要比Q-learning好,因为实际生活中我们并没有像Q-learning那样那么多次试错的机会。

这里贴上两个伪代码的对比:

在这里插入图片描述

下面介绍一下怎么修改强化学习(一)中的Q-learning代码吧,其实很简单:

主函数:

if __name__ == "__main__":
    env = Env()
    agent = QLearningAgent(actions=list(range(env.n_actions)))
    for episode in range(1000):  #循环1000次
        state = env.reset()
        action = agent.get_action(str(state))
        while True:
            env.render()
            # agent产生动作   #str()是把数字转为字符串
            next_state, reward, done = env.step(action)
            next_action = agent.get_action(str(next_state))
            # 更新Q表
            agent.learn(str(state), action, reward, str(next_state),next_action)
            state = next_state   #状态更新
            action = next_action
            env.print_value_all(agent.q_table)
            # 当到达终点就终止游戏开始新一轮训练
            if done:
                break

这里主要是将获取当前状态的当前动作放在了while循环之外,然后在循环内有一个获得下一个动作A_的代码,并且后面的agent.learn进行了修改,原来Q-learning的agent.learn只有四个输入,现在有五个输入,看下面的对比:

agent.learn(str(state), action, reward, str(next_state))  #Q-learning

agent.learn(str(state), action, reward, str(next_state),next_action)   #SARSA

当然,这里改了的话那learn函数也相应的要改:

    def learn(self, state, action, reward, next_state, next_action):
        current_q = self.q_table[state][action]   #找到Q表中对应的坐标,分别给其加入选择状态的Reward
        # 贝尔曼方程更新
        new_q = reward + self.discount_factor * self.q_table[next_state][next_action]   #更新Q值
        self.q_table[state][action] += self.learning_rate * (new_q - current_q)

这里是前面的定义也增添了next_action,然后在计算new_q的时候主要是self.q_table这里进行了修改,下面放出对比:

new_q = reward + self.discount_factor * max(self.q_table[next_state])   #Q-learning

new_q = reward + self.discount_factor * self.q_table[next_state][next_action]   #SARSA

这里是根据Q-learning的算法和SARSA的算法来的,大家可以结合算法进行分析。

然后放上SARSA的结果图:

在这里插入图片描述
SARSA在刚开始的时候也会不断的试错,掉进三角形那里,当然也会进入圆形区域,然后主要是运行一段时间后,SARSA的agent会一直在左上角的四个白格子那里徘徊,就类似我前面说的“害怕死亡”,但因为这里我们给了10%的动作随机性,所以agent还是有可能走出那四个格子,然后大概率会进入圆形区域,也不排除进行三角形区域的可能性,不过最后训练的结果还是很成功的,而且大家可以发现右下角有两个格子是完全没有被探索过的。

最后做个说明:本人最近也是刚开始学强化学习,比较经典的算法还是要过一遍的,写这篇文章一是自己记录一下,二是也给其他跟我一样的小白看一看,如果有不懂的可以互相交流。后面的文章讲经典算法的可能比较少一些,B站的莫烦大佬已经讲的很清晰了,除非我有过自己的代码实现或者修改可能会分享给大家,谢谢!

更新一下:
绿色伪代码图中的Q-learning有点问题,橙色标出的γmax(s’,a’)这里应该有问题,这里应该是γmax(s’,a),因为Q-learning的Q值计算没有用到下一时刻的动作,所以这里应该是a不是a’。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值