尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Q Learning强化学习完整代码解析:从表格法到DQN的进阶指南
简介这是一份面向强化学习入门者与Python开发者的Q Learning算法完整实现代码包聚焦在无法预知全部状态与动作的场景下通过构建Q表并迭代更新让智能体逐步逼近最优策略。包内共5个文件以py核心脚本为主辅以md说明文档、pdf报告、license授权文件及临时文件整体约852KB结构轻量便于直接阅读与二次修改。代码围绕Q函数更新公式展开涵盖学习率、折扣因子、epsilon-greedy探索策略等关键参数并演示了与gym环境如CartPole-v1结合的训练流程同时涉及状态离散化处理思路。目前已有1108人学习下载适合希望从零理解Q表构建、episode训练循环与收敛调参的读者可据此快速搭建实验、观察奖励曲线并迁移到自身任务中。1. 从一份 Q Learning 完整代码说起为什么表格法至今仍是强化学习最值得先跑通的那一版很多人第一次接触强化学习是从一份python实现Q Learning强化学习(完整代码).zip开始的。解压之后通常是一个几百行的脚本跑起来在控制台里打印一串回合奖励最后画出一条慢慢爬升的曲线。看起来朴素但它恰好是理解整个强化学习算法族最省事的一扇门。Q Learning 属于 value-based、model-free、off-policy 的时序差分方法核心就是一张 Q 表状态做行、动作做列每个格子记录「在这个状态下做这个动作长期能拿多少回报」。它不需要环境模型不需要神经网络甚至不需要 GPU一台装了 python 的普通笔记本就能跑。适合谁适合刚学完 python 基础、想搞懂强化学习到底在优化什么的人也适合需要快速验证某个环境奖励设计是否合理的工程师——因为表格法没有函数逼近带来的玄学出问题基本都能定位到具体某个格子。这一章先把「它是什么、为什么还值得学」讲清楚后面几章再落到代码、参数和踩坑上。2. Q Learning 的更新逻辑从贝尔曼方程到那张会收敛的表2.1 为什么是「离线学、在线用」的 off-policyQ Learning 最容易被忽略的一点是它更新时用的不是当前正在执行的动作而是下一状态里 Q 值最大的那个动作。这就是它 off-policy 的来源。行为策略可以是 ε-greedy一边探索一边利用而目标策略始终是 greedy也就是「假设我之后都选最好的」。两者分开意味着它可以边试错边学一个更优的策略哪怕当前动作选得很烂更新目标依然朝着最优方向走。更新公式写成代码就是一行# Q(s,a) - Q(s,a) alpha * (r gamma * max(Q(s,:)) - Q(s,a)) q_table[state, action] alpha * ( reward gamma * np.max(q_table[next_state, :]) - q_table[state, action] )这里的max就是 off-policy 的体现。如果换成q_table[next_state, next_action]那就变成了 SARSA是 on-policy。这个差别在悬崖行走Cliff Walking环境里会非常明显Q Learning 学到的策略敢贴着悬崖走因为它假设后续都走最优SARSA 会绕远因为它把探索时的风险也算进去了。选哪个取决于你的场景能不能承受试错代价。2.2 一张 Q 表要多大什么时候该放弃表格法Q 表的形状是(状态数, 动作数)。状态数如果是 100动作 4 个那就是 400 个浮点数随便跑。但如果状态是连续值比如小车的位置、速度都是浮点那状态空间是无限的表格法直接失效。常见的离散化做法是把每个维度切成若干桶# 把连续观测离散成有限状态 def discretize(obs, bins): # bins 是每个维度的分桶边界列表 return tuple(np.digitize(o, b) for o, b in zip(obs, bins))分桶数量是个权衡桶太少不同情况被合并学出来的策略粗糙桶太多每个格子被访问的次数骤降收敛慢甚至学不动。经验上单个维度 10 到 20 个桶是常见起点维度超过 4 到 5 个就要警惕维度灾难——状态数会指数膨胀。这时候就该考虑 DQN 这类用神经网络逼近 Q 值的方法了。判断标准很简单如果 Q 表里大部分格子长期没被访问过那表格法已经不适合你当前的问题。2.3 一个能跑通的最小实现骨架下面这段是 Q Learning 训练循环的通用骨架环境用 Gym 风格的接口换成任何离散动作环境都能套import numpy as np def train_q_learning(env, episodes5000, alpha0.1, gamma0.99, epsilon1.0, epsilon_min0.01, epsilon_decay0.995): # 初始化 Q 表状态数 x 动作数 n_states env.observation_space.n n_actions env.action_space.n q_table np.zeros((n_states, n_actions)) for ep in range(episodes): state, _ env.reset() done False while not done: # ε-greedy以 epsilon 概率随机探索 if np.random.rand() epsilon: action env.action_space.sample() else: action np.argmax(q_table[state, :]) next_state, reward, terminated, truncated, _ env.step(action) done terminated or truncated # 核心更新注意用的是 next_state 的最大 Q 值 best_next np.max(q_table[next_state, :]) q_table[state, action] alpha * ( reward gamma * best_next - q_table[state, action] ) state next_state # 每回合结束后衰减探索率 epsilon max(epsilon_min, epsilon * epsilon_decay) return q_table逻辑上分四步选动作、执行、用贝尔曼最优方程更新、衰减探索率。参数含义逐个说alpha是学习率控制新信息覆盖旧估计的幅度太大震荡、太小收敛慢gamma是折扣因子越接近 1 越看重长期回报epsilon是探索概率从 1 衰减到epsilon_min让前期多试、后期多利用epsilon_decay决定衰减速度0.995 意味着大约几百回合后探索率降到很低。这套默认值在 FrozenLake、Taxi 这类小环境上基本都能收敛换环境时优先调alpha和epsilon_decay。3. 把代码真正跑起来环境、依赖和三个必调参数3.1 环境准备与依赖安装拿到一份python实现Q Learning强化学习(完整代码).zip第一步不是急着运行而是确认 python 版本和依赖。这类代码通常依赖 numpy如果带环境演示还会依赖 gym 或 gymnasium。python 3.8 及以上都能跑安装命令# 建议先建虚拟环境避免污染全局 python -m venv ql_env source ql_env/bin/activate # Windows 用 ql_env\Scripts\activate # 安装核心依赖 pip install numpy gymnasium如果代码里用的是老版gym接口是env.step()返回四个值(next_state, reward, done, info)新版gymnasium返回五个值多了truncated。这是最常见的翻车点之一报错通常是「too many values to unpack」。解决办法要么装对应版本要么在代码里改成五元组解包。先跑通再谈优化别一上来就改算法。3.2 三个必调参数alpha、gamma、epsilon_decay参数作用常见起点调大后果调小后果alpha学习率0.1更新激进Q 值震荡不收敛收敛极慢像没在学gamma折扣因子0.99更看重长期方差大短视学不到长线策略epsilon_decay探索衰减0.995探索久收敛慢但更充分过早利用可能卡在次优调参顺序建议先固定gamma0.99把alpha从 0.1 试到 0.5 看曲线是否稳定再调epsilon_decay如果奖励曲线前期一直很低、后期才起来说明探索不够把 decay 调大更慢衰减如果曲线早早平了但没到最优说明探索不足就过早利用同样调大 decay。gamma一般最后动除非你的任务回报周期特别长。3.3 怎么判断它真的在学看奖励曲线和 Q 表不要只看最后一行打印的奖励。健康的训练过程奖励曲线应该是前期低、中期快速上升、后期在高位小幅波动。如果曲线一直贴地先检查奖励函数是不是太稀疏——很多环境只有到达目标才给 1其余全是 0这种稀疏奖励下 Q Learning 收敛很慢需要更多回合或者做奖励塑形。另一个验证手段是直接看 Q 表在关键状态下最优动作对应的 Q 值应该明显高于其他动作。如果所有格子数值都差不多说明还没学到东西。把 Q 表打印出来看几行比盯着曲线猜有用得多。4. 避坑与排查Q Learning 跑不动时先查这几条4.1 现象奖励曲线长期不上升原因通常有三个探索率衰减太快、学习率太小、奖励太稀疏。先确认epsilon是不是几回合就掉到 0.01 了如果是把epsilon_decay调到 0.999 让它多探索。再看alpha0.01 这种小值在小环境上会慢得让人怀疑人生试 0.1 到 0.3。如果奖励本身只有终点给分考虑加中间引导奖励但要小心塑形过度导致策略跑偏。4.2 现象Q 值越来越大甚至溢出这是漏了折扣或者更新公式写错的典型症状。检查更新里有没有gamma * best_next如果写成reward best_nextQ 值会随回合数线性累加几百回合后就是天文数字。另一个可能是gamma设成了 1 且任务没有终止状态回报无限累积。把gamma压到 0.99 以下并确认环境有明确的终止条件。4.3 现象训练时好时坏换个随机种子就崩Q Learning 对初始化和探索顺序敏感单次运行的结果不能说明问题。正确做法是固定多个随机种子各跑一遍看平均表现。如果不同种子差异巨大说明当前参数处在一个不稳定区间通常是alpha偏大。把学习率降下来或者引入学习率衰减让后期更新更稳。别拿一次跑出来的漂亮曲线当结论。4.4 现象状态离散化后维度爆炸连续状态做分桶时如果每个维度都切 50 个桶4 个维度就是 625 万种状态Q 表内存直接吃满而且绝大多数格子永远访问不到。解决办法是降低分桶数、做特征选择去掉无关维度或者干脆换 DQN。判断依据是训练几千回合后Q 表里非零格子的比例如果低于百分之几说明状态空间相对样本量太大了。5. 从表格法往前走经验回放、目标网络和什么时候该换 DQN跑通 Q Learning 之后最自然的进阶是理解 DQN 为什么需要那两个额外组件。Q Learning 用max做自举更新本身就有高估倾向当 Q 值用神经网络表示时又多了样本相关性和训练不稳定的问题。经验回放experience replay把(s, a, r, s)存进缓冲区随机采样打破时间相关性目标网络target network用一份延迟更新的参数算best_next缓解自举带来的震荡。这两点本质上是在补表格法天然没有的坑——表格法里每个格子独立更新不存在这些问题。一个实用的迁移路径是先在离散小环境上用 Q Learning 把奖励设计和超参感觉建立起来再换到连续状态环境把 Q 表替换成两层全连接网络加上回放缓冲区和目标网络。判断该不该换的信号很明确状态离散化后 Q 表访问率过低、或者动作本身是连续的表格法无法处理连续动作。我自己的习惯是任何新任务先用 Q Learning 跑一个最小版本哪怕只能跑简化后的离散环境也能快速验证奖励函数合不合理。这一步省下来的时间远比直接上 DQN 调参要划算。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

XiaoMate桌宠:基于Electron与WebSocket的桌面助手开发实践

XiaoMate桌宠:基于Electron与WebSocket的桌面助手开发实践

1. 桌宠这个品类,到底缺了什么桌宠这东西不新鲜。从早年 Windows 上的 Shimeji 到后来各种 Live2D 挂件,桌面上的小人儿已经晃悠了快二十年。但如果你真的用过几款,会发现一个尴尬的共性:它们几乎全是“观赏型”的。会走路、会爬窗…

📅 2026/10/25 11:55:36
让TRAE“看见”微信小程序:CLI自动化与截图反馈实战

让TRAE“看见”微信小程序:CLI自动化与截图反馈实战

1. 项目缘起:为什么我要让 TRAE “看” 到微信小程序上一轮交付的是一份微信小程序源码工程,压缩包叫2048-小程序.zip。熟悉 AI Coding 的朋友都知道,TRAE 这类工具在 Web 项目里如鱼得水——它能直接读文件、跑命令、看浏览器渲染结果&#…

📅 2026/10/25 11:55:36
OpenMontage 深度拆解:开放式素材编排与自动化剪辑框架实战

OpenMontage 深度拆解:开放式素材编排与自动化剪辑框架实战

1. 拆解 OpenMontage:它到底是什么,解决什么问题第一次看到“OpenMontage”这个词,我下意识把它拆成了两半:Open 和 Montage。Montage 在影视剪辑里指的是“蒙太奇”,也就是把不同镜头、素材、片段按照某种逻辑拼接在一…

📅 2026/10/25 11:55:36
MORE NEWS

更多资讯

📰

Python AI五子棋实战:Minimax与Alpha-Beta剪枝实现解析

简介:这份资源面向Python初学者与AI算法爱好者,提供一套可直接运行的五子棋AI实现方案,重点演示极大极小值搜索与Alpha-Beta剪枝在博弈决策中的落地方式。包内共12个文件,以py源码、xml配置、pyc缓存及iml工程文件为主&#xff0c…

📰

YOLO版本选型实战指南:从v1到v10的工程适配逻辑

1. 这不是版本罗列,而是一张YOLO技术演进的实战地图你点开这篇内容,大概率不是为了背诵“YOLOv1发布于2016年”这种教科书式答案。你真正需要的,是搞清楚:当我在PyCharm里敲下pip install ultralytics时,背后调用的是哪…

📰

AI行业动态追踪方法论:从日更简报中提炼技术选型与趋势判断

1. 从一份日期简报说起:AI行业动态追踪到底在追什么每个月总有那么几天,我的信息流会被各种“AI大事件汇总”刷屏。3月17日这个时间节点,放在全年来看不算什么特殊日子,但如果你持续跟踪人工智能应用行业的动态,就会发…

📰

欧拉公式:数学之美与应用解析

1. 最美数学公式的永恒魅力第一次看到欧拉公式e^iπ 1 0时,那种震撼感至今难忘。这个被数学家们公认为"最美数学公式"的等式,神奇地将数学中五个最重要的常数联系在一起:自然对数的底e、虚数单位i、圆周率π、数字1和0。就像突然…

📰

基于YOLOv6与PaddleOCR的银行卡号识别系统开发

1. 项目概述银行卡号检测与识别系统是一个结合计算机视觉与OCR技术的实用解决方案。这个项目采用YOLOv6作为目标检测框架,配合PaddleOCR完成文字识别任务,最终通过PySide6构建用户友好的图形界面。整套系统能够在复杂背景下准确提取银行卡区域并识别卡号…

📰

原神抽卡模拟器开发指南:概率模型、代码实现与验证

简介:这是一份面向C初学者与原神玩家的抽卡模拟器源码工程,用C复刻游戏内祈愿逻辑,帮助学习者在无需消耗原石的前提下理解抽卡概率与保底机制。资源以Visual Studio解决方案形式组织,包含main.cpp、wish_function.cpp、wish.h、cm…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬