【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

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

相关文章
|
6天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
22 1
|
1天前
|
人工智能 安全 Java
Python 多线程编程实战:threading 模块的最佳实践
Python 多线程编程实战:threading 模块的最佳实践
10 5
|
2天前
|
算法 数据可视化 Python
Python用MCMC马尔科夫链蒙特卡洛、拒绝抽样和Metropolis-Hastings采样算法
Python用MCMC马尔科夫链蒙特卡洛、拒绝抽样和Metropolis-Hastings采样算法
13 6
|
3天前
|
机器学习/深度学习 算法 搜索推荐
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
30 12
|
3天前
|
人工智能 Python
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
8 0
|
6天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
12 1
Flask框架在Python面试中的应用与实战
|
7天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
28 6
|
9天前
|
算法 数据可视化 Python
Python贝叶斯推断Metropolis-Hastings(M-H)MCMC采样算法的实现
Python贝叶斯推断Metropolis-Hastings(M-H)MCMC采样算法的实现
14 0
|
9天前
|
数据可视化 算法 数据挖掘
PYTHON实现谱聚类算法和改变聚类簇数结果可视化比较
PYTHON实现谱聚类算法和改变聚类簇数结果可视化比较
|
10天前
|
算法 数据可视化 Python
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
15 0