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

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

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

时序差分算法

时序差分法在一步采样之后就更新动作值函数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

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

相关文章
|
3月前
|
机器学习/深度学习 算法 机器人
使用 Python TorchRL 进行多代理强化学习
本文详细介绍了如何使用TorchRL库解决多代理强化学习(MARL)问题,重点讨论了在多代理环境中应用近端策略优化(PPO)。通过使用VMAS模拟器,该文展示了如何在GPU上并行训练多机器人系统,使其在避免碰撞的同时到达目标。文章涵盖了依赖项安装、PPO原理、策略与评论家网络设计、数据收集及训练循环,并强调了TorchRL在简化开发流程、提升计算效率方面的优势。无论是集中式还是分布式评论家配置,TorchRL均能有效支持复杂的MARL研究与实践。
59 5
使用 Python TorchRL 进行多代理强化学习
|
14天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
59 8
|
14天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
48 7
|
1月前
|
存储 算法 安全
ArrayList简介及使用全方位手把手教学(带源码),用ArrayList实现洗牌算法,3个人轮流拿牌(带全部源码)
文章全面介绍了Java中ArrayList的使用方法,包括其构造方法、常见操作、遍历方式、扩容机制,并展示了如何使用ArrayList实现洗牌算法的实例。
17 0
|
3月前
|
机器学习/深度学习 存储 定位技术
强化学习Agent系列(一)——PyGame游戏编程,Python 贪吃蛇制作实战教学
本文是关于使用Pygame库开发Python贪吃蛇游戏的实战教学,介绍了Pygame的基本使用、窗口初始化、事件处理、键盘控制移动、以及实现游戏逻辑和对象交互的方法。
|
Linux C语言 开发者
源码安装Python学会有用还能装逼 | 解决各种坑
相信朋友们都看过这个零基础学习Python的开篇了
449 0
源码安装Python学会有用还能装逼 | 解决各种坑
|
3天前
|
存储 数据挖掘 开发者
Python编程入门:从零到英雄
在这篇文章中,我们将一起踏上Python编程的奇幻之旅。无论你是编程新手,还是希望拓展技能的开发者,本教程都将为你提供一条清晰的道路,引导你从基础语法走向实际应用。通过精心设计的代码示例和练习,你将学会如何用Python解决实际问题,并准备好迎接更复杂的编程挑战。让我们一起探索这个强大的语言,开启你的编程生涯吧!
|
9天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。