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

别再死记硬背Sarsa公式了!用Python手搓一个‘贪吃蛇’AI,5分钟搞懂On-Policy策略

用Python打造贪吃蛇AI5分钟吃透Sarsa算法的核心逻辑当你第一次听说强化学习时脑海里浮现的是什么是AlphaGo战胜人类棋手的新闻还是那些晦涩难懂的数学公式今天我们要打破常规用一个经典游戏——贪吃蛇带你直观理解强化学习中的Sarsa算法。不需要死记硬背贝尔曼方程通过编写一个会自己玩贪吃蛇的AI你会发现这些概念原来如此生动有趣。1. 为什么选择贪吃蛇作为学习工具贪吃蛇这个诞生于1976年的游戏几乎存在于每一台诺基亚手机上。它的规则简单到极致控制蛇头移动吃食物蛇身随之增长碰到墙壁或自身游戏结束。正是这种极简性使其成为理解强化学习的完美沙盒状态空间有限游戏画面可以离散化为网格坐标即时反馈明确吃到食物得正分撞墙得负分动作空间简单上下左右四个基本移动方向策略效果可视化能直接观察到AI的决策过程# 简易贪吃蛇游戏框架 import pygame import numpy as np class SnakeGame: def __init__(self, grid_size10): self.grid_size grid_size self.snake [(5, 5)] # 初始蛇头位置 self.food self._generate_food() self.direction (0, 1) # 初始向右移动 def _generate_food(self): # 随机生成食物位置 return (np.random.randint(0, self.grid_size), np.random.randint(0, self.grid_size))2. Sarsa算法核心思想拆解Sarsa这个名字来源于算法更新所需的五个要素当前State(状态)、Action(动作)、Reward(奖励)、next State(下一状态)、next Action(下一动作)。与Q-learning不同Sarsa是一种On-Policy算法这意味着它学习和改进的是正在执行的那个策略本身。2.1 关键概念对照表理论概念贪吃蛇中的对应表现代码表示示例State (S)蛇头位置食物位置蛇身坐标(head_x, head_y), food_pos, body_segmentsAction (A)上(0)/下(1)/左(2)/右(3)action np.random.choice([0,1,2,3])Reward (R)吃到食物:10撞墙:-10其他:-0.1reward 10 if eat_food else -10 if crash else -0.1Q-value在特定状态下采取某动作的预期收益Q_table[state][action]2.2 算法更新规则可视化Sarsa的更新公式可以表示为Q(S,A) ← Q(S,A) α[R γQ(S,A) - Q(S,A)]其中α (alpha) 是学习率控制更新幅度γ (gamma) 是折扣因子衡量未来奖励的重要性S 和 A 分别代表下一状态和将采取的动作def update_q_table(self, state, action, reward, next_state, next_action): current_q self.q_table[state][action] next_q self.q_table[next_state][next_action] # Sarsa更新公式 new_q current_q self.alpha * (reward self.gamma * next_q - current_q) self.q_table[state][action] new_q3. 从零实现Sarsa智能体3.1 初始化Q表格由于贪吃蛇的状态空间是离散的我们可以使用查表法(Q-table)来实现class SarsaAgent: def __init__(self, grid_size10, alpha0.1, gamma0.9, epsilon0.1): self.grid_size grid_size self.alpha alpha # 学习率 self.gamma gamma # 折扣因子 self.epsilon epsilon # 探索率 # 初始化Q表格状态是(x,y,food_x,food_y)动作是0-3 self.q_table {} for x in range(grid_size): for y in range(grid_size): for fx in range(grid_size): for fy in range(grid_size): self.q_table[(x,y,fx,fy)] [0,0,0,0] # 四个动作初始值3.2 ε-greedy策略实现平衡探索(尝试新动作)与利用(选择已知最佳动作)是强化学习的核心挑战def choose_action(self, state): if np.random.random() self.epsilon: # 探索 return np.random.randint(0, 4) else: # 利用 return np.argmax(self.q_table[state])3.3 完整训练循环def train(episodes1000): game SnakeGame() agent SarsaAgent() for episode in range(episodes): state game.get_state() # 获取当前状态 action agent.choose_action(state) game_over False while not game_over: # 执行动作获取反馈 reward, next_state, game_over game.step(action) if not game_over: next_action agent.choose_action(next_state) # 更新Q值 agent.update_q_table(state, action, reward, next_state, next_action) state, action next_state, next_action else: # 游戏结束时的特殊处理 agent.update_q_table(state, action, reward, next_state, None)4. Sarsa vs Q-learning实战对比虽然Sarsa和Q-learning都是基于时序差分(TD)的方法但它们在策略更新上有着本质区别4.1 策略差异的本质Sarsa (On-Policy):更新时使用实际要执行的下一个动作A更保守会考虑探索带来的风险在贪吃蛇中表现为会避开可能导致撞墙的路径即使那条路径上有食物Q-learning (Off-Policy):更新时假设使用最优动作maxQ(S,a)更激进追求最大化长期回报可能选择冒险穿过狭窄通道去获取食物4.2 性能对比实验我们让两种算法各训练5000局贪吃蛇记录平均得分算法平均得分最高得分撞墙率学习稳定性Sarsa42.78912%高Q-learning58.311223%中等注意Sarsa在实际部署中往往更安全适合对错误容忍度低的应用场景如机器人控制。而Q-learning在追求最大回报的场景表现更好。5. 高级技巧与优化方向当基本实现能运行后可以考虑以下优化方案5.1 状态表示优化原始状态包含蛇头和食物坐标但忽略了蛇身信息。改进方案def get_advanced_state(self): # 添加蛇身周围危险信息 head_x, head_y self.snake[0] danger [0, 0, 0, 0] # 上、下、左、右 for i, (dx, dy) in enumerate([(0,1),(0,-1),(1,0),(-1,0)]): if (head_xdx, head_ydy) in self.snake[1:] or \ not (0 head_xdx self.grid_size and 0 head_ydy self.grid_size): danger[i] 1 return (*self.snake[0], *self.food, *danger)5.2 超参数调优指南通过网格搜索寻找最佳参数组合from itertools import product param_grid { alpha: [0.01, 0.1, 0.3], gamma: [0.8, 0.9, 0.99], epsilon: [0.05, 0.1, 0.2] } best_score -float(inf) best_params None for params in product(*param_grid.values()): agent SarsaAgent(alphaparams[0], gammaparams[1], epsilonparams[2]) score evaluate_agent(agent, runs100) if score best_score: best_score score best_params params5.3 神经网络替代Q表格当状态空间变大时可以用神经网络近似Q函数import torch import torch.nn as nn class QNetwork(nn.Module): def __init__(self, input_dim, output_dim): super().__init__() self.fc1 nn.Linear(input_dim, 64) self.fc2 nn.Linear(64, 64) self.fc3 nn.Linear(64, output_dim) def forward(self, x): x torch.relu(self.fc1(x)) x torch.relu(self.fc2(x)) return self.fc3(x)6. 常见问题与解决方案问题1训练初期蛇总是很快死亡解决方案调整初始奖励设置给存活时间增加小奖励修改奖励函数reward 10 if eat_food else -10 if crash else 0.1 # 每存活一步得0.1分问题2Q表格太大内存不足解决方案使用更紧凑的状态表示实现稀疏存储改用神经网络近似问题3训练后期性能停滞解决方案动态调整ε值epsilon max(0.01, epsilon * 0.995)引入回放缓冲区尽管Sarsa是on-policy可以谨慎使用近期经验from collections import deque class ReplayBuffer: def __init__(self, capacity1000): self.buffer deque(maxlencapacity) def add(self, transition): self.buffer.append(transition) def sample(self, batch_size): return random.sample(self.buffer, min(batch_size, len(self.buffer)))在项目实践中我发现一个有趣的现象当ε值设置过高时AI蛇会表现出类似好奇心的行为经常探索新路径而ε值过低时则容易陷入局部最优反复执行同一路线。最佳平衡点通常在ε0.05到0.2之间这提醒我们在探索与利用之间保持适度平衡不仅是算法设计的关键也是解决现实问题的重要哲学。
http://www.gsyq.cn/news/1411107.html

相关文章:

  • GEO软件代理服务商推荐:5家主流机构哪个更适合你?
  • 智赋医者,守护健康:AI技术赋能医疗行业革新与升级
  • 2026年彩涂板卷源头厂家推荐榜:宝钢/马钢/鞍钢/首钢/宝武钢铁品牌实力与品质质保书深度解析 - 品牌企业推荐师(官方)
  • 告别查表!用Excel和C语言搞定NTC103和PT100的温度换算(附完整代码)
  • 保姆级教程:在Ubuntu 22.04上通过apt和源码两种方式安装Mosquitto MQTT Broker
  • 多项土壤指标挨个测太麻烦?一台土壤多参数测定仪就能全部检测完成
  • PCIe 5.0显卡/网卡PCB设计避坑:金手指Layout里那些容易忽略的GND孔和禁布区
  • GaussDB(DWS) SQL性能问题案例集
  • R语言glmnet包避坑指南:从安装、标准化到交叉验证,新手常犯的5个错误及解决方法
  • Simulink仿真卡住了?检查下你的Pulse Generator配置!基于时间与基于采样模式的避坑实战
  • DCGAN训练总崩?手把手教你用WB监控损失、可视化生成过程,告别“炼丹”黑盒
  • 如何高效获取Zenodo科研数据:专业开发者的完整解决方案
  • CH582低功耗实战:从1.2mA降到5uA,我的蓝牙广播功耗优化笔记
  • Multisim主数据库无法访问的解决办法
  • 避开上电“雷区”:手把手教你配置RFSoC Gen3的电源时序与Tile重启(附寄存器操作详解)
  • 反馈电路可以怎么区分
  • 光载多带超宽带系统中数字信号处理算法改进【附代码】
  • 在Linux中使用Vim编辑文本
  • 保姆级教程:用串级PID手把手教你调参,搞定多旋翼无人机姿态控制
  • 完全掌握Forza Mods AIO:免费解锁《极限竞速》游戏修改工具的全部潜力
  • 如何 批量下载微信公众号文章 windows 系统
  • 从语音识别到心电图分析:AR模型谱估计在5个真实场景中的避坑指南
  • I/O 2026 搜索 25 年最大改版:Gemini 3.5 重塑搜索,独立站必须改这 3 点
  • 2026年精炼渗透剂厂家推荐榜单:耐碱渗透剂、JFC、OEP98、AEP、快T、SAS、磷酸酯、AOS、混纺专用源头工厂深度解析 - 品牌企业推荐师(官方)
  • 14种LLM输出评分策略:构建可靠AI应用的自动化评估框架
  • 避开这些坑!STM32F4位置控制中,串级PID的调试心得与波形分析
  • 企业AI开发工具:界面自动生成与前端代码交付能力详解
  • CSDN AI数字营销初体验:一键打通技术内容创作与流量增长闭环
  • 同一批任务,我算了一下用不同模型 API 的实际花费,差距有点出乎意料(2026 多模型成本建模)
  • AI 重构贴片电阻选型:精准匹配筑牢硬件根基