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

别再死记硬背公式了!用Python手把手带你实现Model-based强化学习(附值迭代/策略迭代代码)

用Python实战Model-based强化学习从零实现值迭代与策略迭代在传统强化学习教材中数学公式和算法伪代码常常让学习者望而生畏。本文将通过Python代码实现一个完整的网格世界Grid World环境并逐步构建值迭代和策略迭代算法。我们将用NumPy处理矩阵运算Matplotlib可视化策略更新过程最后对比两种算法的收敛特性与适用场景。1. 搭建网格世界环境任何强化学习实践都需要一个明确的环境模型。我们首先构建一个5x5的网格世界import numpy as np import matplotlib.pyplot as plt class GridWorld: def __init__(self, size5): self.size size self.walls [(1,1), (2,3), (3,1)] # 障碍物坐标 self.goal (4,4) # 目标位置 self.trap (0,4) # 陷阱位置 self.actions [up, down, left, right] def step(self, state, action): x, y state if action up: x max(0, x-1) elif action down: x min(self.size-1, x1) elif action left: y max(0, y-1) elif action right: y min(self.size-1, y1) next_state (x, y) if next_state in self.walls: # 撞墙保持原位 next_state state if next_state self.goal: reward 10 done True elif next_state self.trap: reward -10 done True else: reward -1 # 每步有小惩罚 done False return next_state, reward, done这个环境包含以下关键元素状态空间5x5网格共25个状态动作空间上、下、左、右四个基本动作转移规则碰到边界或障碍物保持原位奖励机制到达目标点10掉入陷阱-10每移动一步-1鼓励高效路径2. 值迭代算法实现值迭代的核心思想是通过不断更新状态价值函数来逼近最优值函数。以下是完整实现def value_iteration(env, gamma0.9, theta1e-4): V np.zeros((env.size, env.size)) policy np.empty((env.size, env.size), dtypeobject) while True: delta 0 for i in range(env.size): for j in range(env.size): if (i,j) env.goal or (i,j) env.trap: continue v_old V[i,j] q_values [] for action in env.actions: (next_i, next_j), reward, _ env.step((i,j), action) q reward gamma * V[next_i, next_j] q_values.append(q) V[i,j] max(q_values) delta max(delta, abs(v_old - V[i,j])) if delta theta: break # 提取最优策略 for i in range(env.size): for j in range(env.size): if (i,j) env.goal: policy[i,j] goal elif (i,j) env.trap: policy[i,j] trap else: q_values [] for action in env.actions: (next_i, next_j), reward, _ env.step((i,j), action) q reward gamma * V[next_i, next_j] q_values.append(q) best_action env.actions[np.argmax(q_values)] policy[i,j] best_action return V, policy关键实现细节初始化价值函数V初始化为全零矩阵循环终止条件当最大价值变化小于阈值θ时停止状态价值更新使用贝尔曼最优方程更新每个状态价值策略提取在所有状态价值收敛后根据最优价值函数提取策略可视化收敛过程def plot_value_convergence(V_history): plt.figure(figsize(10,6)) for i in range(V_history[0].shape[0]): for j in range(V_history[0].shape[1]): plt.plot([v[i,j] for v in V_history], labelf({i},{j})) plt.xlabel(Iterations) plt.ylabel(State Value) plt.title(Value Iteration Convergence) plt.legend() plt.show()3. 策略迭代算法实现策略迭代包含策略评估和策略提升两个交替进行的阶段def policy_iteration(env, gamma0.9, theta1e-4): # 初始化随机策略 policy np.random.choice(env.actions, size(env.size, env.size)) policy[env.goal] goal policy[env.trap] trap V np.zeros((env.size, env.size)) while True: # 策略评估 while True: delta 0 for i in range(env.size): for j in range(env.size): if (i,j) env.goal or (i,j) env.trap: continue v_old V[i,j] action policy[i,j] (next_i, next_j), reward, _ env.step((i,j), action) V[i,j] reward gamma * V[next_i, next_j] delta max(delta, abs(v_old - V[i,j])) if delta theta: break # 策略提升 policy_stable True for i in range(env.size): for j in range(env.size): if (i,j) env.goal or (i,j) env.trap: continue old_action policy[i,j] q_values [] for action in env.actions: (next_i, next_j), reward, _ env.step((i,j), action) q reward gamma * V[next_i, next_j] q_values.append(q) best_action env.actions[np.argmax(q_values)] policy[i,j] best_action if old_action ! best_action: policy_stable False if policy_stable: break return V, policy算法特点对比特性值迭代策略迭代计算复杂度O(S²A) per iterationO(S³) per evaluation收敛速度线性收敛二次收敛内存需求只需存储V需存储V和π适用场景大状态空间小状态空间策略更新频率最后一次性提取每次迭代都更新4. 算法对比与实战技巧在实际运行中我们发现两种算法各有优劣值迭代特点每次迭代更新所有状态价值不需要完整策略评估适合状态空间较大的问题代码实现相对简单策略迭代特点策略评估阶段需要完全收敛通常需要更少的迭代次数适合可以承受每次迭代高计算量的场景策略质量在每次迭代都有提升实用调试技巧收敛监控# 在值迭代中添加 print(fIteration {k}, Delta: {delta:.4f}) # 在策略迭代中添加 print(fPolicy improved {np.sum(policy ! new_policy)} states)可视化工具def plot_policy(policy, env): arrows {up:↑, down:↓, left:←, right:→, goal:G, trap:X} grid np.empty((env.size, env.size), dtypeU2) for i in range(env.size): for j in range(env.size): grid[i,j] arrows[policy[i,j]] print(grid)超参数调优γ (折扣因子)通常在0.9-0.99之间θ (收敛阈值)一般设为1e-4到1e-6最大迭代次数防止无限循环实际项目中我通常会先用策略迭代在小规模问题上验证思路再对大规模问题采用值迭代。当状态空间特别大时可以考虑异步更新策略只随机选择部分状态进行更新。
http://www.gsyq.cn/news/1396360.html

相关文章:

  • 手把手教你用Python复现FBCNet:一个融合FBCSP与CNN的脑电解码模型(附完整代码)
  • java实现ofd文件转pdf文件
  • 别再傻傻短接了!荣品RK3399刷机,一个USB BOOT键就能搞定Ubuntu系统
  • 手把手教你定制一个“会自己干活”的智能PE:集成Wget和自动安装脚本
  • 外卖微信小程序京东拼多多外卖cps|外卖红包优惠券源码美团饿了么红包的技术要点
  • 5分钟解锁游戏新体验:BepInEx插件框架让你轻松打造专属游戏模组
  • SAP物料账差异分摊翻车实录:CKMLCP跑完后余额不为0,我踩了这5个坑
  • 2026年电竞椅哪家靠谱:拓际TGIF安全可靠 - 17329971652
  • Corrosion2靶机实战:从HTTP指纹到systemd timer提权全链路解析
  • 5分钟解锁VdhCoApp:浏览器视频下载的本地增强神器
  • Rocky Linux 9.2 保姆级安装教程:从服务器Minimal到桌面Workstation,一次讲透分区与配置
  • 2026年人体工学电竞椅品牌哪个好:拓际TGIF技术精湛 - 13724980961
  • 影像技术实战24:抠图后边缘白边、毛刺、黑底异常?Alpha 通道优化与背景合成方案
  • Unity 2022.3.3 LTS + Visual Studio 2022:手把手教你复刻《吸血鬼幸存者》核心战斗(附完整源码)
  • 别再死记硬背了!用Python思维理解ArcGIS栅格计算器的Con和Pick函数
  • WSL 里的文件上传到 Azkaban
  • 自助洗车机品牌哪家靠谱:红帽沿专业可靠 - 13724980961
  • Azkaban 安装完整教程(基于 WSL2/Ubuntu)
  • Node.js 服务端项目接入 Taotoken 统一大模型 API 的配置指南
  • 20252410李沐泽Python实验四
  • Git下载安装与零基础使用完整教程
  • 【信息学奥赛一本通】核心算法精讲与实战指南
  • 避坑指南:用Unity 2D Tilemap和预制体做《吸血鬼幸存者》Demo时,我踩过的5个坑
  • 别再手动改定标系数了!ENVI 5.5+ 国产卫星插件一键搞定GF-1/WFV预处理
  • 风电双馈发电机无传感器控制与效率优化:改进MRAS与最小铜损融合方案
  • 告别命令行焦虑:在Windows上5分钟搞定OpenLens,像用IDE一样管理你的K8s集群
  • Linux命令:stress-ng
  • Mac 连接 Windows 云服务器保姆级教程|新手零失败远程桌面指南
  • SLAM后端:滤波与滑窗优化的理论分析
  • 建图:从占用栅格到3D高斯——三种SLAM的地图表示理论