Files
hjha-server/docs/bot-algorithms.md
xiaoou a75733e4ae feat: ISMCTS bot + full documentation
新增:
- 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
2026-07-07 13:27:00 +08:00

4.5 KiB
Raw Blame History

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 — 斗地主 SOTAICML 2021
  • RLCard — 卡牌游戏 RL 框架

适配跑得快的挑战

差异 斗地主 (DouZero) 跑得快
牌数 54含大小王 48无大小王
人数 31地主 vs 2农民 3 等权
叫地主 包庄代替
合法牌型 单/对/三带一/炸弹/火箭/顺子... 单/对/三带二/顺子/连对/飞机/炸弹/四带
动作空间 最大 27472编码后 309 估计 200-400编码后 < 100

根本瓶颈没有预训练模型。 跑得快的状态编码、动作空间、奖励函数都需要从零构建和训练。

训练成本估算

  • GPU4× NVIDIA V100/A100
  • 时间2-5 天(跑得快状态空间小于斗地主)
  • 自对弈局数:约 10^6 局
  • 代码量:训练管道 ~1000 行 Python + 推理适配 ~300 行 C#

推理部署

  • 训练好的 PyTorch 模型 → ONNX 导出 → 在 C# 中通过 ML.NET 或 ONNX Runtime 加载
  • 单步推理延迟10-50msCPU

可行性结论

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 天
预训练模型 不需要 不需要 不存在(需自训)
维护成本