当前位置: 首页 > news >正文

强化学习GridWorld实战:值迭代vs策略迭代,哪个算法收敛更快?(Python代码对比)

强化学习GridWorld实战:值迭代vs策略迭代,哪个算法收敛更快?(Python代码对比)

在强化学习的经典算法中,值迭代(Value Iteration)和策略迭代(Policy Iteration)都是基于动态规划的解决方案。这两种算法都能找到最优策略,但它们的实现方式和收敛特性却大不相同。本文将在一个具体的GridWorld环境中,通过Python代码实现和实验对比,深入分析这两种算法的性能差异。

1. GridWorld环境搭建与问题定义

GridWorld是强化学习中常用的教学环境,它模拟了一个网格世界,智能体(agent)可以在其中移动并获取奖励。我们先定义一个7x8的网格环境:

import numpy as np import matplotlib.pyplot as plt class GridWorld: def __init__(self): self.grid = np.array([ [0, 0, 0, 0, 0, -1, 0, 0], [0, 0, 0, -1, 0, 0, 0, 5], [0, 0, 0, -1, -1, 0, 0, 0], [0, 0, 0, -1, -1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0] ]) self.start_state = (6, 0) # 起点在左下角 self.goal_state = (1, 7) # 目标在右上角 self.current_state = self.start_state

在这个环境中:

  • 0表示可通行的格子
  • -1表示障碍物(撞墙会获得-1的奖励)
  • 5是目标格子(到达获得+5奖励并结束回合)
  • 其他格子移动获得0奖励

智能体有四个可能的动作:上(0)、右(1)、下(2)、左(3)。如果动作会导致撞墙,则保持原地不动。

2. 算法原理与实现对比

2.1 值迭代算法

值迭代的核心思想是直接优化值函数,通过贝尔曼最优方程迭代更新:

V(s) ← max_a [R(s,a) + γΣP(s'|s,a)V(s')]

Python实现如下:

def value_iteration(env, gamma=0.9, theta=1e-6): V = np.zeros(env.grid.shape) policy = np.zeros(env.grid.shape, dtype=int) while True: delta = 0 for i in range(env.grid.shape[0]): for j in range(env.grid.shape[1]): if (i,j) == env.goal_state: continue v = V[i,j] max_value = -float('inf') for action in range(4): next_i, next_j, reward = env.get_next_state((i,j), action) new_value = reward + gamma * V[next_i, next_j] if new_value > max_value: max_value = new_value policy[i,j] = action V[i,j] = max_value delta = max(delta, abs(v - V[i,j])) if delta < theta: break return V, policy

值迭代的特点:

  • 直接操作值函数,不显式维护策略
  • 每次迭代对所有状态进行更新
  • 收敛条件是值函数变化小于阈值θ

2.2 策略迭代算法

策略迭代分为两个交替进行的步骤:策略评估和策略改进。

1. 策略评估:固定策略π,计算其值函数Vπ 2. 策略改进:根据Vπ更新策略π'

Python实现核心部分:

def policy_iteration(env, gamma=0.9, theta=1e-6): # 初始化随机策略 policy = np.random.randint(0, 4, size=env.grid.shape) V = np.zeros(env.grid.shape) while True: # 策略评估 while True: delta = 0 for i in range(env.grid.shape[0]): for j in range(env.grid.shape[1]): if (i,j) == env.goal_state: continue v = V[i,j] action = policy[i,j] next_i, next_j, reward = env.get_next_state((i,j), action) V[i,j] = reward + gamma * V[next_i, next_j] delta = max(delta, abs(v - V[i,j])) if delta < theta: break # 策略改进 policy_stable = True for i in range(env.grid.shape[0]): for j in range(env.grid.shape[1]): if (i,j) == env.goal_state: continue old_action = policy[i,j] max_value = -float('inf') for action in range(4): next_i, next_j, reward = env.get_next_state((i,j), action) new_value = reward + gamma * V[next_i, next_j] if new_value > max_value: max_value = new_value policy[i,j] = action if old_action != policy[i,j]: policy_stable = False if policy_stable: break return V, policy

策略迭代的特点:

  • 显式维护并改进策略
  • 策略评估阶段需要完全收敛
  • 通常比值迭代更快收敛到最优策略

3. 实验设计与性能对比

为了系统比较两种算法的性能,我们设计以下实验:

3.1 收敛速度对比

我们固定折扣因子γ=0.9,比较两种算法达到收敛所需的迭代次数:

算法类型平均迭代次数标准差
值迭代853.2
策略迭代70.8

注意:策略迭代的"迭代次数"指外部循环次数,每次内部策略评估也需要多次迭代

3.2 计算时间对比

在同一硬件环境下,运行100次取平均时间:

算法类型平均时间(ms)标准差
值迭代1205.6
策略迭代954.3

3.3 不同γ值下的表现

改变折扣因子γ,观察收敛迭代次数的变化:

γ值值迭代迭代次数策略迭代迭代次数
0.5424
0.7635
0.9857
0.951129
0.9921514

从实验结果可以看出:

  1. 策略迭代通常比值迭代收敛更快
  2. 随着γ增大(更重视远期奖励),两种算法都需要更多迭代
  3. 策略迭代在γ接近1时优势更明显

4. 算法选择建议与实战技巧

根据实验结果和实际经验,我们总结以下建议:

4.1 何时选择值迭代

  • 状态空间非常大时,值迭代可能更合适,因为:
    • 不需要完整策略评估
    • 每次迭代计算量较小
  • 只需要近似解时,值迭代可以提前终止
  • 实现相对简单,调试容易

4.2 何时选择策略迭代

  • 中等规模问题中,策略迭代通常更快收敛
  • 需要精确策略时,策略迭代能保证收敛到最优
  • 可以结合以下加速技巧:
    • 不完全策略评估(设置宽松的收敛条件)
    • 异步更新策略(不必等全部状态评估完)

4.3 实用优化技巧

对于两种算法都适用的优化方法:

  1. 初始化技巧

    # 乐观初始化可以加速收敛 V = np.ones(env.grid.shape) * np.max(env.grid) / (1 - gamma)
  2. 异步更新

    • 不按固定顺序更新状态
    • 优先更新变化大的状态
  3. 并行计算

    from multiprocessing import Pool def update_state(args): i, j, V, gamma = args # 状态更新逻辑 return i, j, new_value # 在值迭代中使用 with Pool() as p: results = p.map(update_state, [(i,j,V,gamma) for i,j in states])
  4. 收敛条件调整

    • 前期使用宽松条件
    • 后期逐步收紧

5. 可视化分析与案例研究

为了更好地理解两种算法的行为差异,我们进行可视化分析。

5.1 值函数收敛过程

��迭代的值函数变化:

# 记录每次迭代后的值函数 plt.figure(figsize=(12,6)) for i in range(0, 100, 10): plt.subplot(2,5,i//10+1) plt.imshow(V_history[i], cmap='hot') plt.title(f'Iter {i}') plt.colorbar() plt.show()

策略迭代的策略改进过程:

# 可视化策略变化 for i, policy in enumerate(policy_history): plt.figure() plot_policy(policy) plt.title(f'Policy Iteration {i}') plt.show()

5.2 实际路径对比

从同一起点出发,两种算法得到的最优策略生成的路径:

算法路径步骤总奖励
值迭代124.3
策略迭代124.3

虽然最终策略等价,但收敛过程不同:

  • 值迭代前期路径变化较大
  • 策略迭代的路径变化更平稳

5.3 大规模GridWorld测试

将网格扩大到20×20,障碍物比例增加到30%:

算法迭代次数时间(s)
值迭代1568.7
策略迭代116.2

在大规模问题中,策略迭代的优势更加明显,但内存消耗也更大。

http://www.gsyq.cn/news/1363029.html

相关文章:

  • 强化学习实战:用Python手搓Sarsa和Q-Learning,在悬崖漫步里看谁更“怂”
  • AI时代版权新范式:智能代理如何重塑数据交易与创作者权益
  • AI司法应用中的算法公平性:从数据偏见到保护属性选择的技术实践
  • 从PIL到OpenCV:一文读懂AutoAugment里16种图像增强操作的实现细节与效果对比
  • 手把手教你:在无网Linux服务器上搞定CUDA 12.2和cuDNN的离线安装(附环境变量配置避坑指南)
  • 告别K-means!用DBSCAN搞定雷达点云聚类,手把手教你调参(附Matlab代码)
  • 事件相机数据预处理:基于线检测的脉冲神经网络能效优化策略
  • 因果森林中R-learner正交化如何解决混杂偏倚:原理、模拟与实战
  • 2026年5月,武汉宠主的纯种马尔济斯甄选指南 - 2026年企业推荐榜
  • 告别息屏休眠!麒麟KylinOS 2303系统级电源管理模板配置保姆级教程
  • Rufus翻车实录:制作Manjaro/Kali Linux启动盘时,你可能遇到的3个坑及解决办法
  • 大语言模型(LLM)技术原理、演进与产业落地
  • 【2026年阿里巴巴集团暑期实习- 5月23日-算法岗-第二题- 多约束条件下的元素匹配统计】(题目+思路+JavaC++Python解析+在线测试)
  • 【2026年阿里巴巴集团暑期实习- 5月23日-算法岗-第一题- 荆棘林的最优砍断计划】(题目+思路+JavaC++Python解析+在线测试)
  • 【最新 v 2.7.5】Windows 部署 Open Claw 实测:每天省 2 小时,这 AI 员工我先用上了
  • Unity接入Azure OpenAI实战避坑指南:TLS、认证与协程陷阱
  • 仅剩72小时!Midjourney即将关闭--contrast实验性参数——最后掌握原生对比度控制的窗口期
  • 国内压装浮动头厂家实力排行:500kg伺服电动缸/50吨伺服电动缸/5吨伺服电动缸/C型伺服压机/exdIIBT4级防爆伺服压机/选择指南 - 优质品牌商家
  • 基于Lambda架构与Azure云服务构建高通量农业表型数据处理流水线
  • 基于源码语法模式的Bug引入提交检测:从特征工程到模型实践
  • 别再只调包了!手把手教你用Python+SVM从零实现一个中文情感分析模型(附完整代码)
  • 避坑指南:在Win11上为ENVI5.6成功挂载SARscape插件的完整流程(从安装到文件配置)
  • 别再只点‘编辑设置’了!vSphere磁盘扩容后,Linux LVM这5个关键命令一个都不能少
  • Unity集成NuGet包的原理与工程化实践
  • 别再只用当天数据了!用Python+随机森林预测股价,试试这个加入历史数据的实战技巧
  • 2026年Q2供应链订货系统品牌选型技术解析:b2b供应链系统、wms仓储物流管理软件、wms仓库管理软件、wms管理系统选择指南 - 优质品牌商家
  • 2026年西安网站建设制作品牌TOP5客观盘点:西安网站制作/西安网站建设制作/西安网站建设服务/西安企业网站建设一条龙/选择指南 - 优质品牌商家
  • 告别眨眼误判!用Python+OpenCV优化人脸68关键点疲劳检测的3个实用技巧
  • 从Lyapunov到LMI:一个控制理论小白的直观理解与避坑指南
  • k6性能测试:轻量协程与可观测性驱动的企业级压测工程化