- 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- 在浏览器中打开
http://localhost:3002 - 在训练面板中调整超参数:
- 训练轮数:训练回合数(默认:500)
- 学习率:模型学习率(默认:0.0005)
- 批量大小:训练批次大小(默认:64)
- Epsilon:初始探索率(默认:1.0)
- Gamma:折扣因子(默认:0.95)
- 点击 "训练AI" 开始训练
- 实时监控指标并观察AI的改进
// 自动保存到IndexedDB(训练期间自动进行)
// 模型保存位置:indexeddb://snake-ai-model
// 导出模型
点击"导出模型"下载JSON文件
// 导入模型
点击"导入模型"并选择导出的文件# 构建生产版本
yarn generate
# 预览生产构建
yarn preview状态 → CNN → 动作选择 → 环境
↓ ↓
目标网络 ← 定期同步 ← 主网络
↓ ↓
Q值评估 ← TD误差 → 优先回放
核心组件:
- 主网络:为下一个状态选择最佳动作
- 目标网络:评估Q值(每10轮同步一次)
- 优先回放:根据|TD误差| + ε采样经验
- 重要性采样:权重 = (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发送指标
}- WebGL后端:确保
tfBackend === 'webgl'以获得最佳性能 - 内存限制:根据浏览器容量调整
memorySize - BFS深度:如果遇到延迟请减小(默认:20)
- 批量大小:如果训练太慢请降低(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,检查张量释放 |
欢迎贡献!请遵循以下步骤:
- Fork本仓库
- 创建特性分支(
git checkout -b feature/AmazingFeature) - 提交更改(
git commit -m 'Add some AmazingFeature') - 推送到分支(
git push origin feature/AmazingFeature) - 开启Pull Request
本项目采用MIT许可证 - 详见 LICENSE 文件
- TensorFlow.js - 机器学习框架
- Nuxt 3 - Vue.js框架
- Vuetify - Material Design组件
- 参考论文:
项目链接:https://github.com/ShouChenICU/Snake-RL
用 ❤️ 和 🤖 制作
