【Python强化学习】动态规划法中策略迭代和值迭代求解冰湖问题实战(图文解释 附源码)

简介: 【Python强化学习】动态规划法中策略迭代和值迭代求解冰湖问题实战(图文解释 附源码)

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

基于值函数优化策略的方法是先求得值函数,然后通过值函数来求得最优策略。相应地,该类算法的迭代过程可分为策略评估阶段和策略改进阶段。

在策略评估阶段,算法基于当前策略来求得值函数;在策略改进阶段,算法利用当前值函数来更新策略。

动态规划法

1:策略迭代算法

状态值函数V_π(s)可以看作动作值函数Q_π(s,a)在状态处于s时关于动作a的数学期望:

π(a│s)是概率表示的策略,也是Q_π(s,a)发生的概率值。

同样地,动作值函数Q_π(s,a)可以看作在状态s执行了动作a后,进入到下一状态s^′的立即回报r^′与下一状态的状态值函数的折扣γV_π(s^′)之和的数学期望:

式中,P_ss^′^a是状态转移概率,也是r^′+γV_π(s^′)发生的概率。

代入

可得:

称为状态值函数的贝尔曼期望方程。

在五元组〈S,A,P,R,γ〉和策略π(a│s)均为已知的条件下,根据状态值函数的贝尔曼期望方程,可列出由|S|个独立方程组成的方程组。

其中只有|S|个未知数V_π(s),因此,可以求解得到在确定策略π时每个状态值函数的值。

可完成基于值函数求解算法中的策略评估任务。

冰湖问题中,假定当前要评估的策略是在所有状态s都执行向左的动作:

π(0│s)=1, π(1│s)=π(2│s)=π(3│s)=0

根据环境模型,执行向左的动作时,状态0只可能转移到状态0、状态0和状态4,不可能到达终点G,因此,R_0^a=0。

根据V_π(s)=∑_a∈A▒[π(a│s)(R_s^a+γ∑_s^′∈S▒P_ss^′^aV_π(s^′))]和主体在冰面上的移动规则,在状态0,可得:

同样地,在其他每个状态都可得到一个独立的方程。将这些方程联立,得到方程组,可以求得各状态的状态值。

利用计算机对方程组的求解,仍然采用迭代法,其迭代关系式为:

其中,上标k表示迭代的轮数,并初始化V_π^0(s)=0。

s^′是s的下一状态,因此,状态值的求解是通过从未来到现在的反向迭代来进行计算的。

在策略改进阶段,要根据指定策略π时各状态值函数V_π(s),采用贪心策略来对强化学习主体的策略进行优化。

根据动作值函数与状态值函数的关系式Q_π(s,a)=∑_s^′∈S▒P_ss^′^a(r^′+γV_π(s^′)),可求得动作值函数Q_π(s,a)。 因此,在策略改进阶段,基于贪心策略依据下式来得到新策略π^′(s):

策略迭代法流程图如下

实际运行效果如下

部分代码如下

n_states = 16 # 状态空间的大小
n_actions = 4 # 动作空间的大小
# 对确定性策略pi进行评估,即计算状态值函数
def policy_evaluation(pi, gamma=1.0):
    V_table = np.zeros(n_states) # 状态值函数表
    threshold = 1e-10 # 收敛判断阈值
    while True:
        pre_V_table = np.copy(V_table)
        for s in range(n_states):
            = sum([ trans_prob * (r + gamma*pre_V_table[next_s])
                            for trans_prob, next_s, r, done in env.P[s][a]])# 环境模型,存储状态s下采取动作a得到的状态转移概率,下一步状态,回报,完成标志
        if (np.sum((np.fabs(pre_V_table - V_table))) <= threshold): # 是否收敛
            break
    return V_table
# 基于新的状态值函数对策略进行改进
def police_improvement(v_table, gamma=1.0):
    pi = np.zeros(n_states)
    for s ge(n_actions):
            for next_sr in env.P[s][a]: # 环境模型,存储状态s下采取动作a得到的状态转移概率,下一步状态,回报,完成标志
                trans_prob, next_s, r, done = next_sr
                Q_table[a] += (trans_prob * (r + gamma*v_table[next_s]))
        pi[s] = np.argmax(Q_table) # 贪心策略
    return pi
# 策略迭代
def policy_iteration(gamma=1.0):
    pi = np.zeros(n_states) # 0初始化策略
provement(V_table, gamma)
        i += 1
        #print("迭代次数:", i, "\n\tV_table:", V_table, "\n\tpi:", new_pi)
        if (np.all(pi == new_pi)): break # 是否收敛
        pi = new_pi
    return pi

2:值迭代算法

在策略迭代算法中,在一个迭代周期里,通过计算动作值函数的数学期望来更新状态值函数,而在所谓的值迭代算法中,则是直接取最大动作值函数来更新状态值函数:

与策略迭代算法不同的是,值迭代每次迭代只进行策略评估。当状态值函数收敛后,再进行一次策略改进即可。

流程图如下

# 值迭代
def value_itration(env, gamma=1.0):
    V_table = np.zeros(n_states)
    n_iterations = 10000
    threshold = 1e-10
    for i in range(n_iterations):
        pre_V_table = np.copy(V_table)
        for s in range(n_states):
            Q = [] # 状态s的Q值
            for a in range(n_actions):
                next_s_prob_rewards = [] # 到下一状态的转移概率乘以下一状态的累积回报
                for next_sr in env.P[s][a]:
                    trans_prob, next_s, r, done = next_sr
                    next_s_prob_rewards.append( ( trans_prob * ( r + gamma*pre_V_table[next_s] ) ) ) # 式8-31
                    Q.append( np.sum( next_s_prob_rewards ) )
                    V_table[s] = max(Q)
        if( np.sum( np.fabs( pre_V_table - V_table ) ) <= threshold ): break
    return V_table
best_V_table = value_itration(env=env, gamma=1.0)
print("最优状态值函数:", best_V_table)
best_pi = police_improvement(best_V_table, gamma=1.0)
print("值迭代算法计算最优策略:", best_pi)

 

定义所有策略中最大的状态值函数为最优状态值函数V^∗(s): V^∗(s)=max┬πV_π(s) 同样,可以定义所有策略中最大的动作值函数为最优动作值函数Q^∗(s,a): Q^∗(s,a)=max┬πQ_π(s,a) 当采用最优状态值函数时,状态值函数贝尔曼方程称为贝尔曼最优方程,写为:

在冰湖问题中实际运行结果如下

部分代码如下

 

# 值迭代
def value_itration(env, gamma=1.0):
    V_table = np.zeros(n_states)
    n_iterations = 10000
    threshold = 1e-10
    for i in range(n_iterations):
        pre_V_table = np.copy(V_table)
        for s in range(n_states):
            Q = [] # 状态s的Q值
            for a in range(n_actions):
                next_s_prob_rewards = [] # 到下一状态的转移概率乘以下一状态的累积回报
                for next_sr in env.P[s][a]:
                    trans_prob, next_s, r, done = next_sr
             ( pre_V_table - V_table ) ) <= threshold ): break
    return V_table
best_V_table = value_itration(env=env, gamma=1.0)
print("最优状态值函数:", best_V_table)
best_pi = police_improvement(best_V_table, gamma=1.0)
print("值迭代算法计算最优策略:", best_pi)

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

相关文章
|
10月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
1099 7
|
11月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
490 26
|
10月前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
10月前
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
682 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
11月前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
1673 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
10月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
10月前
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
1976 1
Python API接口实战指南:从入门到精通
|
10月前
|
存储 分布式计算 测试技术
Python学习之旅:从基础到实战第三章
总体来说,第三章是Python学习路程中的一个重要里程碑,它不仅加深了对基础概念的理解,还引入了更多高级特性,为后续的深入学习和实际应用打下坚实的基础。通过这一章的学习,读者应该能够更好地理解Python编程的核心概念,并准备好应对更复杂的编程挑战。
280 12
|
11月前
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
1150 19
|
10月前
|
存储 数据采集 监控
Python文件操作全攻略:从基础到高级实战
本文系统讲解Python文件操作核心技巧,涵盖基础读写、指针控制、异常处理及大文件分块处理等实战场景。结合日志分析、CSV清洗等案例,助你高效掌握文本与二进制文件处理,提升程序健壮性与开发效率。(238字)
752 1

推荐镜像

更多