摘要
“条件化搜索”是指:已知公开战斗日志(例如“主攻造成 336 伤害、反击 314”),在 Simulator 里尝试若干随机结果,找出能解释这条日志的那一种。为节省时间,内部有一个快捷筛选器,只用简单公式估算一次主攻和一次反击,先排除不可能的随机分支。本实验发现这个筛选器忽略了攻击过程中触发的“回调”(追加伤害、属性变化等),会把真正能解释日志的分支误删。修复后,在 20 局复查样本的 792 次攻击里误删从 26 降到 0。
要回答的问题
快捷筛选器什么时候会给出错误的“没有候选”?修复它会付出什么代价?
方法
- 快捷筛选器返回“不能用快捷路径”时,调用方会在原预算内逐一跑完整的 Simulator 转移;完整公开事件仍是唯一的接受标准。问题出在筛选器错误地返回了“空候选”。
- 第一个反例来自奈拉之吻:行动者移动前生命 2220、数量 185,移动结束先被扣 210,数量降到 168;筛选器仍按 185 计算攻击,于是认为无解,而预算内第 0 次真实尝试就生成了日志中的 336 / 314。
- 然后对 20 局既有诊断对局逐步重放(1310 个操作、其中 792 次单位攻击),为检验内部一致性,把第 0 次尝试对齐到真实随机流——这种先验只用于事后诊断,绝不会传给在线状态估计。
- 修复:凡是有行动触发伤害、追加伤害或攻击后属性变化的情况,都改走完整规则;判断复用 Simulator 现有的状态 / 被动注册表,不在别的模块复制公式。
结果
另外发现 26 次同类错误,四个实例如下:
| 回调 | 快捷路径漏掉的变化 | 实际反击 / 旧估算 |
|---|---|---|
| 穿刺 | 主攻 652 后再扣 20,反击方数量 64→63 | 335 / 341 |
| 死亡凝视 | 主攻 899 后再击杀 1 个,数量 4→3 | 22 / 29 |
| 碎骨 | 主攻后攻击者防御 43→44 | 257 / 261 |
| 低语 | 反击前反击者被施加最小伤害状态 | 145 / 174 |
| 792 次攻击的筛选结果 | 只修奈拉之吻后 | 追加回调修复后 |
|---|---|---|
| 交给完整执行 | 527 | 577 |
| 快捷路径正确保留 | 239 | 215 |
| 快捷路径误删 | 26 | 0 |
新增 16 项回归测试通过。Simulator 全量 11,100 通过、68 失败、257 错误、2 跳过,全部 325 个失败 / 错误编号都与修复前的全量相同、且在更早日志出现过,没有新增失败。状态估计全量 1,992 通过、20 跳过;接口集成 75 项通过。
失败与负结果
全仓并非全绿;54 项凤凰原生检查被已知的游戏版本门禁拦下,没有放宽证据要求。复杂攻击的完整执行量增加,但预算没有扩大,所以仍可能返回“未知”。
局限
这 20 局是既有诊断样本,没有新对局,也不提供胜率证据。“零误删”只描述这 792 次攻击,不能证明所有机制都被正确覆盖。修复也没有解决 AI 对奈拉之吻的收益估值,不替代尚未获批的公开行动风险查询。
结论与下一步
快捷筛选器只在无回调的普通攻击上使用,带回调的攻击一律交给完整规则,消除了把“能解释日志”误判为“搜索覆盖不足”的问题。后续的追加预算实验由状态估计模块另行记录。
Comments