资讯动态

Python强化学习游戏AI实战:DQN训练Pong与Q-learning迷宫源码解析

发布时间:2026/9/28 22:52:10 来源:尧图企业网站定制
简介本资源面向人工智能、游戏开发方向的学生与开发者尤其适合以强化学习游戏AI为选题的毕业设计或课程大作业参考。包内提供基于Python的强化学习与深度强化学习游戏AI训练源码覆盖DQN等经典算法在Atari Pong等环境中的实现并附带迷宫Plus的Q-learning示例帮助读者理解从环境搭建、模型训练到加载推理的完整流程。资源共49个文件以py源码、pyc编译文件、png运行截图、md说明文档、pdf论文与报告为主另有txt依赖与日志文件压缩包约2.4MB结构清晰便于按模块查阅。其中论文与报告部分可辅助梳理算法原理与实验分析项目说明则给出运行入口与目录组织方式。目前已有267人学习适合需要完整代码、文档与论文材料一体化参考的读者。1. 从 Pong 到迷宫这份 Python 强化学习游戏 AI 源码到底能跑出什么如果你正在做毕业设计或者课程大作业选题是「强化学习游戏 AI」大概率会遇到一个尴尬局面论文里的 DQN 公式看得懂但真要从零搭一个能跑起来的训练环境光是环境封装、经验回放、目标网络同步这几块就够折腾好几天。这份资源包的核心价值就在这——它把两条典型技术路线打包好了一条是基于 Pong 游戏的深度强化学习DQN另一条是基于迷宫Plus 的表格型 Q-learning。前者对应playing atari with DRL.pdf和1910.09986.pdf两篇参考论文后者是经典强化学习入门的标准练手场景。资源包里Pong_for_demo目录下有dqn.py、pong_load_model.py、runs、pong_runs、requirements.txt说明训练和加载模型是分开的训练日志和模型权重也有独立存放位置。迷宫Plus 那边则是 Q-learning 的实现配套 README 和报告。适合谁适合已经会 Python 基础语法、想找一个能直接跑通、能改参数、能写进论文实验章节的从业者或学生。不适合完全没接触过 numpy 和神经网络的人因为代码里有些地方默认你懂张量维度。2. 环境搭建与依赖安装把 requirements.txt 变成可运行的 Python 环境2.1 为什么优先用虚拟环境而不是全局安装强化学习项目对版本敏感尤其是 PyTorch 和 gym 的版本组合。我见过太多人全局装完 torch 之后跑dqn.py直接报AttributeError: module gym has no attribute make原因是 gym 版本太新API 变了。这份资源包里的requirements.txt是作者当时跑通的版本组合所以第一件事是建虚拟环境把依赖锁在项目级别。常见做法是用 conda 或者 venv。如果你已经装了 Anaconda直接conda create -n rl_game python3.8 -y conda activate rl_game cd Pong_for_demo pip install -r requirements.txt如果你习惯用 venvpython -m venv rl_env source rl_env/bin/activate # Windows 用 rl_env\Scripts\activate cd Pong_for_demo pip install -r requirements.txt逻辑说明Python 3.8 是这份资源比较稳妥的版本因为里面用到的 gym 和 torch 版本在 3.8 上兼容性最好。requirements.txt里通常会列gym、torch、numpy、matplotlib这几个核心包。参数说明如果你机器有 NVIDIA 显卡装完 torch 后建议去 PyTorch 官网查一下对应 CUDA 版本的安装命令把requirements.txt里的 torch 那行替换掉否则默认装的是 CPU 版训练 Pong 会慢到让你怀疑人生。2.2 验证环境是否真的可用装完之后别急着跑训练先做一次导入检查import gym import torch import numpy as np print(gym version:, gym.__version__) print(torch version:, torch.__version__) print(cuda available:, torch.cuda.is_available())逻辑说明这一步是确认 gym 能正常导入、torch 能识别显卡。如果cuda available是 False 而你有显卡说明装的是 CPU 版 torch需要重新装。参数说明gym.__version__如果大于 0.26后面env.step()的返回值可能变成 5 个值而不是 4 个这是最常见的翻车点后面避坑章节会细说。2.3 迷宫Plus 的 Q-learning 环境更简单迷宫Plus 那边不依赖 torch只需要 numpy 和 matplotlib。如果你只想先跑通 Q-learning 建立信心可以直接cd 迷宫Plus pip install numpy matplotlib python q_learning.py # 具体文件名以实际目录为准逻辑说明Q-learning 是表格型方法不需要神经网络所以依赖极少。参数说明迷宫环境通常是自定义的 grid world状态数有限Q 表就是一个二维数组。跑起来之后你会看到每一轮的路径变化适合用来理解 epsilon-greedy 探索策略。3. DQN 训练 Pong 的核心机制经验回放、目标网络与 epsilon 衰减3.1 为什么 DQN 需要经验回放和目标网络Pong 是一个连续状态空间的环境不能像迷宫那样用表格存 Q 值所以要用神经网络来近似 Q 函数。但直接用 Q-learning 的更新方式训练神经网络会有一个致命问题样本之间高度相关网络容易震荡不收敛。经验回放experience replay就是解决这个的——把每一步的(state, action, reward, next_state, done)存进一个缓冲区训练时随机采样一批打破时间相关性。目标网络target network解决的是另一个问题如果计算 TD 目标时用的 Q 网络和正在更新的 Q 网络是同一个目标会跟着参数一起动导致训练不稳定。所以 DQN 用两个网络一个在线网络负责选动作和更新一个目标网络定期从在线网络复制参数用来计算 TD 目标。这份资源里dqn.py应该就是这套逻辑的实现。你打开代码会看到类似ReplayBuffer类、online_net、target_net这些命名。常见做法是缓冲区大小设 10000 到 100000batch size 设 32 或 64目标网络每隔几百步同步一次。3.2 训练脚本的关键参数怎么调假设dqn.py里有这些超参数我一般会按下面这个思路调# 伪代码示意具体变量名以源码为准 EPISODES 1000 # 总训练轮数 GAMMA 0.99 # 折扣因子 LR 1e-4 # 学习率 BATCH_SIZE 32 # 每次采样批次大小 BUFFER_SIZE 10000 # 经验回放缓冲区容量 EPSILON_START 1.0 # 初始探索率 EPSILON_END 0.05 # 最终探索率 EPSILON_DECAY 0.995 # 每轮衰减系数 TARGET_UPDATE 10 # 每隔多少轮同步目标网络逻辑说明GAMMA设 0.99 是因为 Pong 的奖励有延迟需要看得远一点。LR用 1e-4 是 DQN 的经典值太大容易震荡太小收敛慢。EPSILON_DECAY用 0.995 意味着大约 600 轮之后 epsilon 降到 0.05 左右探索逐渐减少。参数说明BUFFER_SIZE如果设太小比如 1000样本多样性不够训练会不稳定设太大比如 1000000内存吃紧且早期样本质量差。TARGET_UPDATE如果设成 1等于没有目标网络训练容易发散。3.3 加载模型和继续训练资源里有pong_load_model.py说明作者支持加载已训练模型做推理或者继续训练。常见写法是# 加载模型权重 model DQN(input_dim, output_dim) model.load_state_dict(torch.load(pong_runs/best_model.pth)) model.eval() # 推理时不需要探索 with torch.no_grad(): action model(state).argmax().item()逻辑说明load_state_dict加载的是网络参数eval()把网络切到推理模式关闭 dropout 和 batch norm 的训练行为。torch.no_grad()关闭梯度计算省显存。参数说明如果你要接着训练而不是纯推理就不要调eval()并且要把 optimizer 的状态也加载进来否则学习率调度会重置。4. 迷宫Plus 的 Q-learning 实现表格型方法的参数与收敛判断4.1 Q 表的更新公式和代码对应迷宫Plus 用的是经典 Q-learning更新公式是Q(s, a) Q(s, a) alpha * (reward gamma * max(Q(s, a)) - Q(s, a))对应到代码里通常是这样的# Q-learning 核心更新 current_q q_table[state, action] max_next_q np.max(q_table[next_state, :]) td_target reward gamma * max_next_q td_error td_target - current_q q_table[state, action] alpha * td_error逻辑说明alpha是学习率控制每次更新幅度gamma是折扣因子控制对未来奖励的重视程度。td_error是时序差分误差正值说明这个动作比预期好负值说明比预期差。参数说明alpha一般设 0.1 到 0.5迷宫这种确定性环境可以大一点gamma设 0.9 到 0.99看迷宫大小和路径长度。4.2 epsilon-greedy 探索策略的实现Q-learning 必须要有探索否则会卡在局部最优路径上。常见做法是 epsilon-greedyimport random def choose_action(state, q_table, epsilon): if random.random() epsilon: return random.randint(0, num_actions - 1) # 探索 else: return np.argmax(q_table[state, :]) # 利用逻辑说明以 epsilon 的概率随机选动作以 1-epsilon 的概率选当前 Q 值最大的动作。参数说明epsilon 通常从 1.0 开始衰减到 0.01 或 0.05。衰减方式可以是线性的也可以是指数的。迷宫Plus 这种小环境epsilon 衰减到 0.1 左右就能看到稳定路径了。4.3 怎么判断 Q-learning 收敛了看两个指标一是每轮的总步数或者总奖励二是 Q 表的变化量。如果连续几十轮的累计奖励波动很小基本可以认为收敛了。代码里可以加一个简单的记录rewards [] for episode in range(num_episodes): total_reward 0 # ... 交互逻辑 ... rewards.append(total_reward) if episode % 100 0: avg_reward np.mean(rewards[-100:]) print(fEpisode {episode}, Avg Reward: {avg_reward:.2f})逻辑说明每 100 轮打印一次最近 100 轮的平均奖励观察是否趋于平稳。参数说明如果平均奖励一直在震荡可能是学习率太大或者 epsilon 衰减太快如果一直不涨可能是奖励函数设计有问题比如到达目标的奖励太小被每一步的负奖励抵消了。5. 避坑与排查跑这份源码最容易翻车的五个地方5.1 gym 版本不匹配导致 env.step() 返回值数量不对现象跑dqn.py时报ValueError: too many values to unpack或者next_state, reward, done, info env.step(action)这行报错。原因gym 0.26 之后step()返回 5 个值多了truncated而且reset()返回的是(obs, info)而不是单独的obs。解决要么把 gym 降级到 0.21 或 0.25要么改代码适配新 API。降级命令pip install gym0.21.0。如果不想降级就把解包改成next_state, reward, terminated, truncated, info env.step(action)然后done terminated or truncated。5.2 显卡可用但训练速度没变化现象torch.cuda.is_available()返回 True但训练一轮还是要好几分钟。原因模型和张量没有搬到 GPU 上或者搬了但每次采样又从 CPU 转过来。解决在dqn.py里找到模型定义的地方加.to(device)其中device torch.device(cuda if torch.cuda.is_available() else cpu)。同时检查经验回放采样出来的 batch 是否也.to(device)了。如果 batch 在 CPU 上每次前向传播都要做一次 H2D 拷贝反而更慢。5.3 模型保存了但加载后表现很差现象pong_load_model.py加载best_model.pth后Pong 得分还不如随机策略。原因保存的时候保存的是online_net但推理时用的网络结构和训练时不一致或者保存的是state_dict但加载时用了torch.load直接加载整个模型。解决确认保存和加载的网络类定义完全一致。如果保存的是state_dict加载时要先实例化模型再load_state_dict。另外检查保存的模型是不是在 epsilon 还很高的阶段保存的那时候策略本身就不行。5.4 迷宫Plus 的 Q 表不更新或者更新后路径不变现象跑了很多轮Q 表数值几乎没变或者变了但智能体还是走老路。原因可能是q_table初始化成全零之后np.argmax总是返回第一个动作导致探索不足也可能是状态编码有问题不同位置映射到了同一个状态索引。解决检查状态编码函数确保每个格子有唯一索引。如果是全零初始化可以在早期强制随机动作或者给 Q 表加一点随机初始值。另外确认alpha不是 0gamma不是 0。5.5 训练日志和模型文件找不到现象代码跑完了但runs或pong_runs目录是空的。原因代码里保存路径用的是相对路径而你不是在Pong_for_demo目录下执行的或者保存目录没有提前创建。解决在代码里加os.makedirs(save_dir, exist_okTrue)并且用绝对路径或者基于__file__的路径来保存。执行脚本时先cd到Pong_for_demo目录确保相对路径正确。6. 从跑通到写进报告把训练曲线和模型对比做成可复现的实验跑通代码只是第一步真正要写进毕业设计或者课程报告你需要有可复现的实验数据。我一般会做三组对比随机策略、训练 500 轮的 DQN、训练 1000 轮的 DQN然后画一张累计奖励曲线图。具体操作是在dqn.py里加一个记录器import matplotlib.pyplot as plt episode_rewards [] for episode in range(EPISODES): # ... 训练逻辑 ... episode_rewards.append(total_reward) if episode % 50 0: torch.save(online_net.state_dict(), fpong_runs/model_ep{episode}.pth) # 训练结束后画图 plt.plot(episode_rewards) plt.xlabel(Episode) plt.ylabel(Total Reward) plt.title(DQN Training Curve on Pong) plt.savefig(pong_runs/training_curve.png) plt.show()逻辑说明每 50 轮保存一次模型方便后面做模型对比。训练曲线能直观看出收敛趋势。参数说明如果曲线震荡厉害可以对奖励做滑动平均窗口设 20 或 50。保存图片用savefig而不是只show因为报告里需要插图。迷宫Plus 那边可以做一个 Q 表热力图把每个状态的最大 Q 值画出来能直观看到智能体学到的策略。代码大概是这样import seaborn as sns max_q np.max(q_table, axis1).reshape(grid_height, grid_width) sns.heatmap(max_q, annotTrue, cmapYlGnBu) plt.title(Max Q Value per State) plt.savefig(maze_q_heatmap.png)逻辑说明把 Q 表按状态维度取最大值重塑成迷宫的形状用热力图展示。颜色越深说明该状态的价值越高通常终点附近颜色最深。参数说明annotTrue会在格子里显示数值如果格子太多可以关掉。还有一个血泪经验报告里写实验环境时一定要把 Python 版本、torch 版本、gym 版本、显卡型号都列清楚。我见过有人复现不出来就是因为没写 gym 版本别人装了新版直接报错。从那以后我每次跑实验都强制走一遍pip freeze requirements_lock.txt把完整依赖锁死。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑