新增: - PdkFriendServer/Logic/IsmctsBot.cs: ISMCTS蒙特卡洛搜索机器人 - 800次模拟/决策,对手手牌从未知牌池随机采样 - 包庄决策:大牌(≥J/Q/K/A/2)数量 ≥6 则包庄 - winRate日志输出,决策透明 - docs/bot-architecture.md: 系统架构文档 - docs/bot-algorithms.md: A/B/C三条算法路径完整分析 - docs/ismcts-design.md: ISMCTS实现设计详案 切换: - PdkGameMain.InitBots: PdkBot → IsmctsBot(默认ISMCTS) 验证: - dotnet build 0 errors - 多人对局完整运行:包庄→出牌→结算→test over
4.5 KiB
4.5 KiB
PdkBot 算法路径分析
问题定义
跑得快是不完全信息三人卡牌游戏。目标:成为第一个出完所有手牌的玩家。
状态空间估算(48 张牌,每人 16 张):
- 单步动作空间:≤ 100(单张、对子、三带二、顺子、连对、飞机、炸弹、四带二/三)
- 完整游戏深度:约 30-50 步(每步出 1-N 张牌)
- 信息集数量:C(48,16) × C(32,16) ≈ 10^26
直接穷举搜索不可行。
三条策略路径
A 路径:启发式评分(已实现)
当前 PdkBot.DecidePlay() 使用 5 维手工评分:
| 维度 | 分值范围 | 逻辑 |
|---|---|---|
| 直接获胜 | +10000 | 出完即胜利,最高优先级 |
| 对手威胁 | +300~800 | 对手手牌 ≤3 张时增加权重 |
| 牌效率 | (20-剩余)×15 | 剩余越少分越高 |
| 炸弹管理 | -80~+400 | 对手快赢时用,否则留 |
| 出牌量 | +8×出牌数 | 多牌组合优先 |
| 先手权 | +60 | 保持出牌主动权 |
| 黑桃3必出 | +150 | 规则要求时选出含黑桃3的方案 |
优点:即时决策(<1ms)、无依赖、易理解
缺点:权重手工调整,不保证最优性,无法推理多步后效
B 路径:ISMCTS(推荐实现)
Information Set Monte Carlo Tree Search——在不完全信息下做蒙特卡洛搜索。
核心思想:对每个候选出牌方案,模拟 N 局随机对局到结束,统计胜率。
DecidePlay(view):
candidates = GetTipCard() // 所有合法出牌
for each candidate:
模拟 M 局:
- 随机分配对手手牌(从"未知牌池"中抽样)
- 所有玩家用随机策略打到结束
- 记录自己是否获胜
选胜率最高的方案
优点:
- 统计收敛到近似最优(M=1000 时 95% 置信区间 < 3%)
- 不需要训练数据,决策时运行
- 自然处理不完全信息(对手手牌随机采样)
- 实现约 300 行 C#
缺点:
- 决策延迟 50-200ms(取决于 M)
- 每次独立决策,不做跨回合规划
实现细节:见 ismcts-design.md
C 路径:深度蒙特卡洛(CNN + MCTS)
借鉴 DouZero (ICML 2021) 的 Deep Monte Carlo 方法:
架构:
CNN编码器(手牌+历史出牌+状态)→ 价值网络 V(s) + 策略网络 π(s)
MCTS搜索(用 π 引导探索,V 评估叶子节点)
训练:自对弈强化学习
1. 随机初始化 CNN
2. 自对弈产生数据(状态、动作、胜负)
3. 用 (s, a, r) 训练 CNN
4. 更新 CNN → 回到步骤 2
参考项目:
适配跑得快的挑战
| 差异 | 斗地主 (DouZero) | 跑得快 |
|---|---|---|
| 牌数 | 54(含大小王) | 48(无大小王) |
| 人数 | 3(1地主 vs 2农民) | 3 等权 |
| 叫地主 | 有 | 包庄代替 |
| 合法牌型 | 单/对/三带一/炸弹/火箭/顺子... | 单/对/三带二/顺子/连对/飞机/炸弹/四带 |
| 动作空间 | 最大 27472(编码后 309) | 估计 200-400(编码后 < 100) |
根本瓶颈:没有预训练模型。 跑得快的状态编码、动作空间、奖励函数都需要从零构建和训练。
训练成本估算:
- GPU:4× NVIDIA V100/A100
- 时间:2-5 天(跑得快状态空间小于斗地主)
- 自对弈局数:约 10^6 局
- 代码量:训练管道 ~1000 行 Python + 推理适配 ~300 行 C#
推理部署:
- 训练好的 PyTorch 模型 → ONNX 导出 → 在 C# 中通过 ML.NET 或 ONNX Runtime 加载
- 单步推理延迟:10-50ms(CPU)
可行性结论
C 路径技术上完全可行,DouZero 的 Deep Monte Carlo 方法已经验证。但投入产出比需要评估:
- 训练基础设施要求高(多 GPU + 数天训练)
- 需要独立维护 Python 训练管道
- 跑得快是小众游戏,无社区预训练模型可复用
建议:先落地 B 路径(ISMCTS),达到近似最优水平。如果后续需要进一步提升(如参与竞技),再启动 C 路径训练。
路径对比
| A: 启发式 | B: ISMCTS | C: CNN+MCTS | |
|---|---|---|---|
| 最优性 | 低 | 高(接近最优) | 理论最高 |
| 延迟 | <1ms | 50-200ms | 10-50ms |
| 实现复杂度 | 100 行 | 300 行 | 1000+ 行 + 训练管道 |
| 训练需求 | 无 | 无 | 4 GPU × 2-5 天 |
| 预训练模型 | 不需要 | 不需要 | 不存在(需自训) |
| 维护成本 | 低 | 低 | 高 |