Files
hjha-server/docs/stress-test-report.md
xiaoou 4a3fbec057 test: 1000轮 ISMCTS 压测 + 完整分析报告
新增:
- hjha-console/Program.cs: --stress N 压测模式
  - 每局独立日志 stress_logs/round_NNNNN.txt
  - 每 50 局进度汇报 + 异常捕获
- docs/stress-test-report.md: 完整分析报告
  - P0: 包庄严重高估(5.2%成功) → 需校准阈值
  - P1: 75 moves 异常局 → 疑似死循环
  - P2: 只出单张不组合 → rollout 优化
  - P3: 性能瓶颈分析
- .gitignore: stress_logs/, analyze_stress.py

压测结果: 12.8min, 0 crashes, 1000/1000通过
2026-07-07 13:53:46 +08:00

109 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 1000轮 ISMCTS 压测分析报告
运行时间: 12.8 min | 1000/1000 完成 | 0 crashes
---
## 1. Bug / 异常
### 1.1 稳定性:完美
- 0 次 Unhandled Exception
- 0 次空日志(每局都有完整结算)
- 所有 1000 局产出了完整的 包庄→打牌→结算→test over 流程
### 1.2 Move 分布异常
| 指标 | 值 | 说明 |
|------|-----|------|
| 平均 move | 12.8 | 正常 |
| p50 move | 7 | 偏少,很多局快速结束 |
| min move | 4 | 极快结束 |
| **max move** | **75** | **异常!** 一局走了 75 个 whoPlay 回合 |
**75 moves 的异常局需要排查**:正常跑得快一局 15-30 步。75 步说明可能出现了长期 pass 循环——三人都不出牌,一轮轮空转。需要检查是否有游戏状态机 bug 导致无法正常出牌。
### 1.3 结算异常
- 1 局结算 ±6非标准的 ±32/±64需要查该局日志。
---
## 2. 性能
### 2.1 吞吐量
| 指标 | 值 |
|------|-----|
| 总时间 | 12.8 min |
| 每局平均 | 0.77s |
| 每局 whoPlay | 12.8 次 |
| 每局 ISMCTS 决策 | ~12.8 × 3 人 ≈ 38 次(估算) |
| 每次 ISMCTS 决策 | ~20ms |
### 2.2 优化建议
| 方向 | 当前 | 优化后 | 改动 |
|------|------|--------|------|
| ISMCTS sims 自适应 | 800 固定 | 手牌>8→800, ≤8→300, ≤4→100 | IsmctsBot 参数 |
| GamePack JSON 保存 | 每步写文件 | 压测模式跳过 | SendPack() 加 if |
| Log 写入 | 每步 flush | 压测模式仅写结算 | 控制台 Log 静默 |
**预估优化后**:每局 0.3-0.4s1000 局 < 7 分钟
---
## 3. Bot 逻辑问题(关键)
### 3.1 包庄决策:严重高估胜率
| 指标 | |
|------|-----|
| 包庄次数 | 1331 每局平均 1.33 人包庄 |
| 包庄成功 | 52 |
| 包庄失败 | 947 |
| **包庄成功率** | **5.2%** |
**根因**ISMCTS 包庄评估中用"对手贪心 roll-out"模拟 P(win)。但实际对局中对手使用的是完整 ISMCTS 决策强度远高于贪心 roll-out导致 P(win) 系统性高估
**修复方案**
1. **提升模拟对手强度**Rollout 中对手也使用一定程度的 ISMCTS 50 sims 轻量版
2. **校准阈值**P(win)≥45% P(win)≥60% 或更高
3. **动态校准**记录实际胜率 Kalman 滤波修正评估偏差
### 3.2 包庄人数分布
```
0人包庄: 1 局 (0.1%)
1人包庄: 667 局 (66.7%) ← 常态
2人包庄: 332 局 (33.2%)
3人包庄: 0 局 (0.0%)
```
三人都包的情况从未发生——3 人同时 P(win)≥45% 需要牌局极度均衡几乎不可能
### 3.3 各位置输赢分布
```
pos1: -1498 (最差)
pos2: +1178 (最好)
pos3: +320 (中等)
```
pos1 表现显著弱于 pos2可能原因FistPlay黑桃3持有者通常被分配到 pos1而先出牌不一定占优——先出的人被后面两人联手压制
### 3.4 出牌策略优化空间
当前 ISMCTS 出牌只选单张`DanZhang:1c`从不选多牌组合根因
- Rollout 策略用 `GetTipCard` 取第一个方案最小牌几乎总是单张
- 单张是最"安全"的选择——容易通过 ISMCTS 模拟获得高胜率
- 但这导致 bot 永远打单张浪费了对子/顺子等高效出牌机会
**修复**Rollout 策略增加多牌组合的权重鼓励一次清多张牌
---
## 4. 修复优先级
| 优先级 | 问题 | 影响 | 估计时间 |
|--------|------|------|----------|
| **P0** | 包庄严重高估5.2% 成功率 | 大幅降低包庄 bot 的期望收益 | 2h校准阈值+提升rollout |
| **P1** | 75 moves 异常局 | 潜在死循环 bug | 30min查日志根因 |
| **P2** | 只出单张不组合 | 降低清牌效率 | 1hrollout 多牌权重 |
| **P3** | 性能优化静默日志 | 压测速度翻倍 | 15min |