【Python强化学习】时序差分法Sarsa算法和Qlearning算法在冰湖问题中实战(附源码)

本文详细介绍了时序差分学习方法,包括Sarsa和Q-learning算法的区别,采样策略,以及如何通过ε-贪婪策略更新动作值函数。通过冰湖问题实例展示了算法流程,并讨论了其存在的问题。代码示例展示了如何在环境中应用这些算法。
摘要由CSDN通过智能技术生成

需要源码请点赞关注收藏后评论区留言私信~~~

时序差分算法

时序差分法在一步采样之后就更新动作值函数Q(s,a),而不是等轨迹的采样全部完成后再更新动作值函数。

在时序差分法中,对轨迹中的当前步的(s,a)的累积折扣回报G,用立即回报和下一步的(s^′,a^′)的折扣动作值函数之和r+γQ(s^′,a^′)来计算,即:

G=r+γQ(s^′,a^′)

在递增计算动作值函数时,用一个[0,1]之间的步长α来代替1/N(s,a)。动作值函数Q(s,a)的递增计算式为:

Sarsa算法与Qlearning算法

在蒙特卡罗法中,当前状态s下,对动作的采样是完全依据Q(s,a)来进行的,选中a的概率与对应的Q(s,a)的大小成正比。在时序差分法中,对动作的采样采用ε-贪心策略,Q(s,a)最大的动作被选择的概率为ε/|A|+1−ε,其他动作被选择的概率为ε/|A|,|A|是动作空间的大小。

Sarsa算法的采样和改进都采用了ε-贪心策略,是同策略的算法。

Qlearning算法对动作的采样采用的是ε-贪心策略,而对动作值函数Q(s,a)的更新采用的是贪心策略,因此,它是异策略的算法:

算法流程图如下

 

 算法在冰湖问题中求解结果如下

 

 要注意的是,时序差分法也存在方差大,不稳定的问题,每次实验的得分可能会相差较大

部分代码如下

# 基于贪心策略,根据当前状态s的所有动作值函数,采样输出动作值
def greedy_sample(Q_s):
    # Q_s:状态s的所有动作值函数,一维数组
    
    max_Q = np.max( Q_s )
    action_list = np.where( max_Q == Q_s )[0]  # 最大动作值函数可能有多个action对应
    a = np.random.choice( action_list )      
    return a

# 基于e-gredy贪心策略,根据当前状态s的所有动作值函数,采样输出动作值
def epsilon_greedy_sample(Q_s, n_actions, epsilon):
    # Q_s:状态s的所有动作值函数,一维数组
    
    # <时表示利用,否则为探索
    if np.random.uniform(0,1) <= 1-epsilon:
        a = greedy_sample(Q_s)
    else:
        a = np.random.choice(n_actions)
    return a

# 时序差分算法
def TD(env, gamma=1.0, alpha=0.01, epsilon=0.1, n_episodes=10000, algorithm="Qlearning"):
    
    Q = np.zeros([env.observation_space.n, env.action_space.n]) # 用数组来存储动作值函数
    n_actions = env.action_space.n
    
    for i in range(n_episodes): 
        
        # 开始一次尝试
    
        sum_rewards = 0
        steps = 0
        
        s = env.reset() # 获取初始s
        a = epsilon_greedy_sample(Q[s], n_actions, epsilon)
        
        # 逐步推进
        while(True):
            next_s, r, done, _ = env.step(a) # 执行动作a
            # e-gredy贪心策略得到下一动作a'
            next_a = epsilon_greedy_sample( Q[next_s], n_actions, epsilon )
            # 更新动作值函数
            if(done):
                Q[s, a] = Q[s, a] + alpha * ( r - Q[s, a] )
            else:
                if algorithm == "Qlearning":
                    Q[s, a] = Q[s, a] + alpha * ( r + gamma * np.max(Q[next_s]) - Q[s, a] )
                else:
                    Q[s, a] = Q[s, a] + alpha * ( r + gamma*Q[next_s, next_a] - Q[s, a] )
            # 更新当前s,a
            s = next_s
            a = next_a
            
            sum_rewards += r * gamma**steps
            steps += 1
            
            if(done):
                break
        #print('尝试次:%s: 共运行步数:%s, 本次累积折扣回报:%.1f' % (i+1, steps, sum_rewards))
        
    pi = []
    for s in range(env.observation_space.n):
        a = greedy_sample( Q[s] )
        pi.append(a)
        
    return pi

 创作不易 觉得有帮助请点赞关注收藏~~~

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
Q-learningSARSA都属于时序差分强化学习方法,而不是蒙特卡洛强化学习方法。 时序差分强化学习是一种结合了动态规划和蒙特卡洛方法的强化学习方法。它通过使用经验数据进行增量式的更新,同时利用了当前和未来的估计值来逼近最优值函数。 具体来说,Q-learningSARSA都是基于Q值函数的时序差分强化学习算法。 1. Q-learning:Q-learning是一种基于动态规划的无模型强化学习算法。它使用了时序差分(TD)方法,通过不断迭代更新Q值函数的估计值,使其逼近最优的Q值。Q-learning算法通过将当前状态和动作的估计值与下一个状态和动作的最大估计值相结合,来更新Q值函数的估计值。 2. SARSASARSA是一种基于时序差分的强化学习算法,也是一种模型-free的强化学习算法SARSA算法使用了时序差分的方法,通过不断迭代更新Q值函数的估计值。与Q-learning不同的是,SARSA算法采用了一个策略(Policy)来决定下一个动作,并在更新Q值时使用下一个动作的估计值。 时序差分强化学习方法与蒙特卡洛强化学习方法相比,具有更高的效率和更好的适应性。它可以在每个时间步骤进行更新,不需要等到任务结束后才进行更新,从而更快地收敛到最优策略。而蒙特卡洛强化学习方法则需要等到任务结束后才能获取完整的回报信息,进行全局更新。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

showswoller

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值