Skip to content

ShouChenICU/Snake-RL

Repository files navigation

🐍 Snake-RL

基于深度强化学习的贪吃蛇AI

Nuxt Vue TypeScript TensorFlow.js License

Snake-RL

基于浏览器的贪吃蛇AI,采用Double DQN和优先经验回放技术

特性安装使用算法架构


🎯 特性

🧠 先进的AI算法

  • Double DQN - 减少Q值过估计,实现更稳定的学习
  • 优先经验回放 - 从重要经验中高效学习
  • 重要性采样 - 纠正优先级采样引入的偏差
  • 智能启发式 - BFS路径规划、安全评估和空间分析
  • 自适应探索 - 基于性能的动态epsilon衰减

🎨 交互式训练界面

  • 实时可视化 - 实时观察AI学习过程和棋盘更新
  • 训练指标 - 追踪分数、损失、Q值和最高分
  • 超参数调整 - 调整学习率、批量大小、epsilon等
  • 模型持久化 - 自动保存到IndexedDB,支持导入导出
  • 深色模式 - 护眼主题切换

⚡ 性能优化

  • WebGL加速 - 使用TensorFlow.js WebGL后端快速训练
  • 内存管理 - 高效的张量释放和内存限制
  • 增强的CNN架构 - 批量归一化和Dropout层
  • 客户端训练 - 无需服务器,完全在浏览器中运行

📦 安装

前置要求

  • Node.js >= 18.x
  • Yarn(推荐)或 npm/pnpm

克隆并安装

# 克隆仓库
git clone https://github.com/yourusername/snake-rl.git
cd snake-rl

# 安装依赖
yarn install

🚀 使用

开发环境

# 启动开发服务器,访问 http://localhost:3002
yarn dev

训练AI

  1. 在浏览器中打开 http://localhost:3002
  2. 在训练面板中调整超参数:
    • 训练轮数:训练回合数(默认:500)
    • 学习率:模型学习率(默认:0.0005)
    • 批量大小:训练批次大小(默认:64)
    • Epsilon:初始探索率(默认:1.0)
    • Gamma:折扣因子(默认:0.95)
  3. 点击 "训练AI" 开始训练
  4. 实时监控指标并观察AI的改进

模型管理

// 自动保存到IndexedDB(训练期间自动进行)
// 模型保存位置:indexeddb://snake-ai-model

// 导出模型
点击"导出模型"下载JSON文件

// 导入模型
点击"导入模型"并选择导出的文件

生产环境

# 构建生产版本
yarn generate

# 预览生产构建
yarn preview

🤖 算法

Double DQN架构

状态 → CNN → 动作选择 → 环境
  ↓                         ↓
目标网络 ← 定期同步 ← 主网络
  ↓                         ↓
Q值评估 ← TD误差 → 优先回放

核心组件:

  1. 主网络:为下一个状态选择最佳动作
  2. 目标网络:评估Q值(每10轮同步一次)
  3. 优先回放:根据|TD误差| + ε采样经验
  4. 重要性采样:权重 = (N·P)^(-β),β从0.4衰减到1.0

奖励塑形

奖励函数- 吃到食物+10
  - 靠近食物+0.1
  - 远离食物-0.15
  - 存活奖励每步 +0.01
  - 速度奖励快速吃到食物 +1
  - 死亡惩罚-10
  - 长时间饥饿递增惩罚

神经网络架构

输入:[高度, 宽度, 1] 棋盘状态

Conv2D(32, 3×3) + ReLU + BatchNorm
    ↓
Conv2D(64, 3×3) + ReLU + BatchNorm
    ↓
Conv2D(64, 3×3) + ReLU + BatchNorm
    ↓
Flatten → Dense(256) + ReLU + Dropout(0.2)
    ↓
Dense(128) + ReLU + Dropout(0.2)
    ↓
Dense(4) → Q值 [上, 下, 左, 右]

智能启发式

  • BFS路径规划:验证到食物的安全路径(深度:20)
  • 安全评分:评估碰撞风险和自由空间
  • 自适应策略:平衡启发式(70%)和探索(30%)
  • 自适应Epsilon:如果性能下降则减缓衰减

🏗️ 架构

状态流

GameSnake(游戏逻辑)
    ↓ 状态
SnakeAI(智能体)
    ↓ 启发式 + Q网络
动作选择
    ↓ 验证
GameSnake(执行)
    ↓ 奖励
经验回放缓冲区
    ↓ 优先采样
模型训练(Double DQN)
    ↓ 更新
Vue组件(响应式UI)

技术栈

类别 技术
框架 Nuxt 3, Vue 3 组合式API
语言 TypeScript(严格模式)
AI/ML TensorFlow.js (WebGL/WASM/WebGPU)
UI库 Vuetify 3(Material Design)
样式 CSS Grid, Vuetify主题
状态管理 Vue 3响应式系统,组合式函数
持久化 IndexedDB(模型存储)

🎛️ 配置

超参数

参数 默认值 描述
episodes 500 训练回合数
learningRate 0.0005 Adam优化器学习率
batchSize 64 训练批量大小
gamma 0.95 未来奖励的折扣因子
epsilon 1.0 → 0.01 探索率(随时间衰减)
memorySize 10000 经验回放缓冲区容量
targetUpdateFreq 10 目标网络同步的回合间隔

内存编码

棋盘状态:
  0    = 空单元格
  -1   = 食物
  1    = 蛇头
  2-5  = 蛇身(方向编码)

🔧 开发

代码风格

  • TypeScript:严格模式,完全类型安全
  • Vue 3:组合式API,使用 <script setup>
  • 格式化:Prettier保持一致风格
  • 约定:Nuxt 3自动导入(utils、composables)

关键模式

// 使用TensorFlow.js进行内存管理
tf.tidy(() => {
  const prediction = model.predict(stateTensor)
  return prediction.dataSync()
})

// 响应式训练指标
const trainingMetrics = ref({
  score: 0,
  epsilon: 1.0,
  loss: 0,
  avgQValue: 0,
  maxScore: 0
})

// 异步训练循环,支持UI更新
for (let episode = 0; episode < episodes; episode++) {
  // ... 训练逻辑
  await nextTick() // 允许UI更新
  callback?.(metrics) // 向UI发送指标
}

性能提示

  1. WebGL后端:确保 tfBackend === 'webgl' 以获得最佳性能
  2. 内存限制:根据浏览器容量调整 memorySize
  3. BFS深度:如果遇到延迟请减小(默认:20)
  4. 批量大小:如果训练太慢请降低(32 vs 64)

📊 训练技巧

最佳超参数

快速学习:

learningRate: 0.001
batchSize: 128
epsilon: 0.9 → 0.1
targetUpdateFreq: 5

稳定性能:

learningRate: 0.0005
batchSize: 64
epsilon: 1.0 → 0.01
targetUpdateFreq: 10

常见问题

问题 解决方案
AI陷入循环 增加epsilon或调整奖励塑形
训练太慢 启用WebGL后端,减小棋盘大小
性能不佳 增加训练轮数,调整学习率
内存错误 减少 memorySize,检查张量释放

🤝 贡献

欢迎贡献!请遵循以下步骤:

  1. Fork本仓库
  2. 创建特性分支(git checkout -b feature/AmazingFeature
  3. 提交更改(git commit -m 'Add some AmazingFeature'
  4. 推送到分支(git push origin feature/AmazingFeature
  5. 开启Pull Request

📝 许可证

本项目采用MIT许可证 - 详见 LICENSE 文件

🙏 致谢

📧 联系方式

项目链接:https://github.com/ShouChenICU/Snake-RL


用 ❤️ 和 🤖 制作

About

Train your own AI to master Snake using Deep Reinforcement Learning - right in your browser!

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published