摘要
玩家反馈 Arena 里最强的 deep 档 AI 一步要等一分钟以上。deep 是研究用搜索:向前看两层、每层保留 6 个候选、对随机结果抽 4 个样本,没有墙钟上限。本次只消除重复计算,不降低深度、宽度或样本数,也不引入“超时就随机选”。同一保存开局的完整 deep 决策从原代码 180.301 秒降到第一批优化后的 88.256 秒;后续批次一度降到 59.279 秒,但补强一项正确性检查后,当前版本为 62.909 秒。每次比较的动作和完整评分都相同。这仍然远超交互需求,问题没有解决。
要回答的问题
deep 一步慢在哪里?能否在结果逐项不变的条件下减少重复工作?
方法
输入是一份候选存档(不能确认就是玩家那局),在独立进程里从保存的初始状态调用正常 deep 入口;没有连接服务或推进玩家对局,存档前后内容相同。改动全部是“同一请求内、同一对象”的缓存:
- Simulator 动作结算、回执和回合调度复用已有的状态计算缓存;合法动作菜单按精确的引擎/状态对象复用,最多 512 个。
- AI 估值复用同一不可变单位的基础价值(最多 8192 项),法术各伤害分支、反击风险、等待/移动评分也用上;单位一变就重算。
- 状态验证用轻量身份键查找;状态摘要(用于识别相同局面的“指纹”)加入最多 128 个状态的私有缓存。
结果
| 运行(同一开局,完整返回) | 耗时 | 节点 |
|---|---|---|
| 原代码 | 180.301 秒 | 8179 |
| 加单位估值与搜索缓存 | 106.669 秒 | 8179 |
| 加菜单缓存 | 99.835 秒 | 8179 |
| 加验证查找优化 | 88.256 秒 | 8179 |
| 修正剪枝界限缓存后(见下) | 90.481 秒 | — |
| 加静态评分提前剪枝 | 75.603 秒 | 7472 |
| 加状态摘要缓存 | 59.279 秒 | 7472 |
| 补强不可变性检查后(当前) | 62.909 秒 | 7472 |
同一局镜像施法后的第二个状态:原代码 81.982 秒 → 44.180 秒 → 当前 36.612 秒。前四行之间动作与完整决策逐项相等。同一局的两个状态不是两场独立战斗,也不是 p95。
失败与负结果
- 途中发现一个正确性问题:被剪枝的界限分数被当成精确值缓存,已另行修复(策略身份加了
exact-window-cache-v1),之前“结果相等”的记录只对当时版本成立。 - “Python 可哈希”不等于“不可变”:一个自定义哈希的列表在创建后被修改,旧缓存返回了旧摘要。反例实际失败后,改为只接受已知冻结结构和内置不可变容器,耗时因此从 57.628 秒回到 62.909 秒。
- 诊断器最初直接比较事件字典,因上层附加的策略元数据不同而失败;改用引擎的确定性事件字节比较。
局限
- 单个存档、少数几次测量,不是多场景延迟验收;用户会话关联和实际试玩未验证。
- 剩余热点(合法法术枚举、规则验证、免疫/修正查询)尚未优化;缓存它们必须考虑定义、目标身份和可变输入。
结论与下一步
重复计算减少约三分之二,但 deep 仍需一分钟左右。后续:实验 0501 做序列化复用,实验 0502 改走四秒限时的可玩路径,实验 0504 诊断四秒内到底能完成多少搜索。
Comments