新增: - 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通过
109 lines
3.7 KiB
Markdown
109 lines
3.7 KiB
Markdown
# 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.4s,1000 局 < 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** | 只出单张不组合 | 降低清牌效率 | 1h(rollout 多牌权重) |
|
||
| **P3** | 性能优化(静默日志) | 压测速度翻倍 | 15min |
|