1. 摘要

结论:结构化动作特征确实让模型更会挑落点,但仍没有学到足以通过门槛的移动选择;学习型 AI 目前暂停。 此前在《英雄无敌:上古纪元》竞技场模拟器上试过策略梯度(PPO)、行为克隆(BC)和交叉熵方法(CEM),全部在独立开发或保留来源上未超过规则 AI;其中 2v2 行为克隆在教师选择移动时的精确匹配为训练 0/478、开发 0/87。

本轮先把每个生物导出为统一配置(157 个生物),再给每个合法动作编码 351 维特征:原有公开特征 255 维,加路线风险、攻击序列、落点几何和行动者/目标的生物静态特征共 96 维。用这些特征模仿规则 AI T 的 60,335 个决策,冻结测试集上“完整菜单移动 Top-1”为 0.137,只用原 255 维的消融为 0.025;新特征的帮助达到事前门槛。改进优化设置并在 0070 的 320 个新来源上复测,最好结果 0.214,仍低于 0.25。

主要剩余误差来自类型选择:T 的 5,041 次移动里有 3,344 次发生在菜单上有普通攻击时,模型在这些决策中 52.5% 选了攻击;只看移动之间的排序,类内 Top-1 在两次测试都约为 0.34。局限:这是模仿一个规则教师的离线检验,不是棋力测试;T 本身未通过独立留出验证;所有结果都在模拟器 v452 规则下得到,不代表商业游戏。

2. 问题:为什么要一个会学习的 AI?

结论:规则型 AI 已经可用,学习型 AI 的目标是从同一份公开信息里学到人写规则漏掉的取舍,而不是读取隐藏信息。 当前 Arena 默认对局 AI 是规则型 Fair v59;2026-10-15 起,英雄无敌三式规则 AI H3 作为可选档位交付,默认仍是 v59(来源:simulator/docs/HANDOFF.md)。两者都只读玩家能看到的观察和合法菜单,详见 s40。

一个具体例子说明难点。一支近战兵本回合打不到敌人,菜单里可能有 40 多个可走的格子,外加等待、防御和法术。离敌人近一格,下一轮可能先手,也可能先挨一刀;对方射手每轮都在射击,拖延也有代价。人写规则要把这些代价写成公式,学习型模型则希望从样本里学到这个权衡。

问题是:模型看到什么,才能学会?早期网络把局面编码成数值和词表符号,生物身份是一个符号,例如词表外的 id:unit.crossbow_fine_bolts 只能按“未知”处理。用户 2026-10-15 提出:所有生物都应该用统一的配置描述,机器学习就能用特征向量表示任何生物。 GPT 讨论(r10、r11,均已核验)同意先做只读配置导出,同时提醒:学习型 AI 更缺的是合法动作的结构化表示,不只是生物表示。本文按这个顺序报告。

3. 背景:此前的学习路线为什么关闭

结论:此前每条学习路线都至少完成了工程或训练,但没有一条在未参与调参的来源上带来整场收益;最具体的失败症状是行为克隆几乎从不复现教师的移动。 下表摘自失败实验索引和各实验报告,均为 2026-10-12 至 10-13 的结果,规则版本与回合协议以各报告为准(例如 0203 是 Core448、100 回合研究上限;0204 起为 20 完整回合未决双输;0226、0227 为 Core449)。F 指同期 Fair 基线,Δ 为各协议定义的来源级得分差。

编号 方法 实际结果 结论
0200 整局 CEM 576 计划槽中 28 局自然结束、1 次引擎异常,0 次分布更新 工程中止,不能称 CEM 失败
0203 冻结 PPO v2 保留集 F/BC/PPO 各 32 局 9/6/5 胜,P−F 为 −.125 0 个改善来源,关闭
0204 20 回合 PPO 600 训练局;保留集 F/BC/PPO 18/12/10 胜,P−F 为 −.25 升级门槛失败;小集合可拟合不等于泛化
0210 2v2 行为克隆 1328 标签、168 次更新;开发动作 Top-1 62.50%,5 胜 11 负,Δ −.125 75% 与 Δ≥−.10 两门槛均失败
0212 加相对几何的 BC 固定 93 个移动样本的移动内部 Top-1 从 11 升到 25,完整菜单仍 0;开发 63.44% 局部排序改善没有转成整局收益
0214 分层 BC(先类别后动作) 固定诊断完整移动 0→20,但攻击退化;开发 63.27%,8 胜 8 负,Δ 0 动作保真门槛失败
0215 一次 DAgger 新增 446 标签(101 个移动),共 1774;开发 1 胜 15 负,旧模型同场 5 胜 11 负 数据更多反而更差,停止精确模仿
0216 反事实终局优势 906 次续玩得到 206 个标签;训练后 0 胜 16 负,未训练对照 7 胜 9 负,差 −.4375 标签有信号,部署严重退化
0217 改选频率对照 新模型整场一次与每回合一次都 1 胜 23 负,旧权重都 11 胜 13 负 单次改选已经有害
0227 完整 Arena 动作级 CEM 808 局、3 次分布更新;训练 Δ +.125,开发 16 个方向赢家与 F 全同 开发实际改选 461 次也没改变胜负

来源:game_ai/experiments/failed-experiments.md、game_ai/experiments/0204-round20-training/README.md、0210–0217、0227 各自的 README。

行为克隆的移动问题

0210 的分动作结果最能说明问题:攻击在训练集匹配 715/730,移动却是 0/478。

教师动作类别 训练精确匹配 开发精确匹配
移动 0/478 0/87
攻击 715/730 197/204
单位特技 4/56 3/21
等待 0/20 0/3
防御 0/44 0/5

来源:game_ai/experiments/0210-two-stack-bc-curriculum/README.md。

随后的 0211 只读诊断冻结了这个模型,取 93 个教师移动样本:模型在完整菜单中一次也没有把移动排第一,但移动候选的总概率均值有 66.21%,平均分散到 32.18 个格子;只在移动之间排序时,Top-1 也只有 11/93。也就是说,模型既在“移动还是攻击”上选错,也不会在格子之间排序。0212 加入相对几何后内部排序升到 25/93,0214 分层后完整移动升到 20/93,但两者都没换来整场收益(来源:game_ai/experiments/0211-frozen-move-action-audit/README.md、0212、0214)。

这些失败分别属于工程中止、准入不足、开发门槛失败等不同类别,不能读成“强化学习或模仿学习无效”。它们留下的具体问题是:现有输入是否足以区分不同落点?

4. 方法:生物配置与结构化动作特征

结论:每个生物现在有一份确定性的配置导出;每个合法动作得到一行 351 维、带“已知位”的公开特征,同一菜单内宽度一致且不受隐藏随机状态影响。

4.1 生物配置导出

export_creature_definitions(Simulator 公开门面,只读)把 157 个模板导出为一份文档,包含基础数值、安装版攻击几何、技能绑定参数(按执行方式分为类型化程序、仅施加状态、专用结算代码)、被动、免疫、召唤来源,以及 18 项按兵种编号写死在代码里的机制及代码出处。文档带确定性字节与内容哈希。设计稿记录了导出依据的探针事实,例如 141 个竞技场兵种、13 个旧网页来源兵种和 3 个只能召唤的单位;98 个有技能的兵种逐个检查了技能激活门槛(来源:simulator/docs/creature-definitions-design-2026-10-15.md)。

导出刻意不包含英雄加成、阵营士气、战斗中的位置与状态、显示文字和草稿权重。原因是这些不是生物本身的属性。安装数据里还有 7 处受伤修正和 5 个光环不在被动注册表中,导出把它们列为“未表示”,不声称覆盖。

4.2 每个动作的 351 维特征

编码器 action-relational-features.v1 在原 v1 公开特征(每动作 255 列)之后追加四块。每个标量都配一个“已知位”:未知是 [0, 0],已知零是 [0, 1],两者不会混淆。

特征块 维度 内容 来源接口
原 v1 公开列 255 单位面板、英雄、动作类别等固定数值特征,无学习词表 masked_ppo_encoding.encode
路线风险 13 支持度(3 类加其它)、路线长度、已知停点、守望数、可见地形进入数、预计路线伤害、预计主伤害 public_battle_movement_risks
攻击序列 4 仅攻击动作:预计对敌、对己生命损失占比(各带已知位) public_battle_attack_sequence
落点几何 15 落点到最近敌人的距离及变化、相邻敌友数、下回合可能够到落点的敌方堆数与等级、最近射手距离、是否移动、可见敌友数 public_battle_hex_distance
生物静态 2×32 行动者与目标:9 项基础数值(各带已知位)、5 个标志、3 类技能执行方式计数、技能/被动/免疫/写死机制/已知缺口数,加 1 个缺失位 export_creature_definitions

来源:game_ai/benchmarks/code/action_features_0069.py、game_ai/experiments/0069-structured-action-features/README.md。

编码只读公开观察与合法菜单,不输入 T 或 v59 自己的评分(GPT r11 建议,避免模型直接抄教师的打分)。编码器在代码里写明三项近似:下回合可达只按公开速度与六角距离、不计障碍和行动顺序;攻击序列是公开平均伤害场景,不是精确预览;生物静态值不含英雄加成。

实测一个开局决策(来源 68000,红方第一个行动单位):状态 1282 维,菜单 376 个合法动作(244 个地块法术、82 个移动、45 个单位法术、3 个攻击、等待、跳过),82 个移动行两两不同,热状态下编码一次 0.115 秒。

4.3 测试

编码器测试检查:多个开局与前缀下同一菜单宽度一致、全为有限值;移动落点可区分;深拷贝输入结果相同;未知生物为全零加缺失位。按 GPT r12 建议新增一项信息边界测试:同一公开观察、不同隐藏随机状态的两个世界,编码必须完全相同(test_hidden_rng_does_not_change_the_encoding)。这些测试说明编码按设计只依赖公开信息,不说明特征足够好。

第一次运行时 6 项测试全部失败:生物表缓存以目录对象为键,而目录不可哈希;改为按目录内容哈希缓存后通过,失败记录保留在 0069 报告中。

4.4 决策数据生成

生成器 action_dataset_0069 从已保存的对局逐步重放,按对局自己的规则版本执行,每一步事件字节必须与记录一致。在指定一方的每个决策前,投影当时的公开观察(含事件历史)与公开菜单并编码;标签取策略自己记录的动作编号,没有记录时逐个还原菜单动作与记录动作比较。选中的动作不在菜单里就直接报错。

flowchart TD
  G["Saved games<br/>(0068 run 3, T side)"] --> R["Replay step by step<br/>event bytes must match"]
  R --> P["Public observation<br/>+ legal menu"]
  C["export_creature_definitions<br/>(157 creatures)"] --> E
  P --> E["encode_actions<br/>255 v1 + 96 new = 351 per action"]
  E --> S["Shards<br/>rows.f32.gz + json"]
  S --> SP["Split by source seed<br/>train / dev / test"]
  SP --> M["Ranker in Torch env<br/>softmax over one menu"]
  M --> T["Test split<br/>read once"]

图 1:生成器只在 core 环境中运行并写出标准库格式分片;训练在独立的 Torch 环境中读分片,不导入项目代码。测试集在全部训练和开发结束后只读一次。窄屏可横向滚动查看图。

构建数据时发现的错误。 0229 第一轮生成得到 838 局后,写分片的宽度检查报错:落点几何在“无落点/无行动者格/无可见敌人”时返回 14 个零,正常应为 15 维,同一局出现 350 和 351 两种行宽。该异常还发生在单局失败记录之外,使进程退出,362 局未生成。修复把几何宽度定为常量 15 并在两条分支自检,新增回归测试 test_geometry_fallback_keeps_the_width。已写出的 838 局全部为 351 宽、不含这条分支,因此不重生成;补齐 362 局属于修复软件错误,不是按结果挑选数据(来源:game_ai/experiments/0229-action-ranker-imitate-t/README.md)。

5. 实验设置

结论:四次实验都在看结果前冻结了数据划分、模型、预算和门槛;每个测试集只读一次。

教师。 T 是 v59 加“威胁圈推进”:只替换近战单位的移动价值,在下次行动前估算冲进去会挨多少伤害、不冲又会被射手消耗多少;攻击、法术和远程单位沿用 v59。H3 在 T 上再加“打得到就打”(来源:game_ai/experiments/0068-heroes3-style-rule-ai/README.md)。0229 选择 T,是因为它的移动规则正是 BC 学不会的部分;这时 T 的独立留出验证尚未出结果。

数据。 0068 第 3 次运行中 T 组全部 1200 局(规则 battle-core.v452-2026-10),T 方 60,335 个决策、7,253,161 个动作行。按来源种子划分,同一来源两局同组:68000–68399 训练(39,650 决策)、68400–68499 开发(10,605)、68500–68599 测试(10,080)。0232 另用 0070 主检验 640 局中 T 方全部 31,798 个决策(种子 70000–70319,v452)作新测试集。

模型。 排序模型:状态向量经线性 128+ReLU;每个动作行经 256→128 两层;两者拼接后再经 128 维隐层输出一个分数,在同一菜单内做 softmax 和交叉熵。0231 另试“状态嵌入先拼入每个动作行”的结构 D(状态 128,两层 512)。

主指标与门槛(0229 起冻结)。 测试集上,T 选移动的决策中,模型在完整菜单里把同一落点排第一的比例(完整菜单移动 Top-1)。门槛为 ≥0.25,且 ≥ 移动类内均匀随机期望的 5 倍。完整模型比只用 v1 列的消融高 ≥0.05,才说“新增特征有帮助”。另报告类内 Top-1(只在合法移动之间排序)、按来源平均、与 T 落点的六角距离,这些只作诊断。

实验 问题 冻结设置 预算
0229 能否学会 T 的移动;新特征有没有用 Adam 1e-3,权重衰减 1e-4,批 64,固定 20 轮,取最后一轮 训练两个模型各不超过 30 分钟
0230 不足来自优化还是信息 阶段 1:512 个训练决策、无权重衰减、最多 2000 步;阶段 2:0229 设置延长到 80 轮 约 45 分钟,GPU
0231 小样本记不住是优化还是容量 四种设置各最多 4000 步:A 3e-4/批 64,B 1e-3/全批 512,C 加宽到 512,D 状态先拼入 约 15 分钟,GPU
0232 稳定优化与足够更新后能否过门槛 A 与 D 各 8000 次更新(Adam 3e-4、批 512),4000/8000 各存一次;按开发集移动 Top-1 选一个,新测试集读一次 生成约 20 分钟,训练 30–60 分钟

来源:game_ai/experiments/0229-action-ranker-imitate-t/README.md、0230-ranker-trainability、0231-ranker-memorization-settings、0232-ranker-retrain-update-budget 的 README。训练环境为 torch 2.7.1+cu128、RTX 5080,种子 0;GPU 训练不保证逐位确定。

6. 结果

6.1 0229:新特征有效,门槛未过

结论:完整模型 0.137,消融 0.025;“可学”门槛失败,“新特征有帮助”通过。

测试集指标(只读一次) 完整 351 列 消融 v1 255 列
全部决策 Top-1 0.5185 0.4905
动作类型正确率 0.7963 0.7759
完整菜单移动 Top-1(主指标) 0.1373 0.0253
完整菜单移动 Top-3 0.4187 0.1796
类内移动 Top-1/Top-3 0.3403/0.5560 0.1537/0.2884
按来源平均移动 Top-1 0.1351 0.0239
最佳移动与 T 落点距离 ≤1 格 0.4769 0.2720
平均距离 2.76 格 4.11 格

基线:菜单内均匀随机 0.0251,移动类内均匀随机 0.0365(5 倍为 0.18),“先选最常见类型”0.2824。测试集 1581 个移动决策,候选落点数中位约 41。训练集自身移动 Top-1 只有 0.178,20 轮后损失仍在下降,属于欠拟合。来源:game_ai/experiments/0229-action-ranker-imitate-t/README.md。

6.2 0230:不是重复输入,延长训练提升很小

结论:输入碰撞几乎不存在;512 个样本也拟合不到 0.95;80 轮比 20 轮只多 0.026;T 选移动时模型四成多选攻击。

训练集 39,650 个决策中,标签行在同一菜单里有完全相同另一行的只有 250 个(0.6%),移动决策 6,381 个中为 0。抽查 40 局,所有特征绝对值都不超过 1,不存在数值尺度问题。

阶段 1(512 决策) 损失 全体 Top-1 移动 Top-1
500 步 1.11 0.703 0.267
1000 步 0.50 0.832 0.387
1800 步 0.53 0.883 0.653
2000 步 0.75 0.852 0.547
阶段 2 轮数 训练 全体/移动 开发 全体/移动/类内
20 0.534/0.178 0.525/0.139/0.307
80 0.587/0.226 0.549/0.165/0.350

第 20 轮与 0229 第 20 轮完全一致。开发集上 T 选移动时,模型第 20 轮选攻击 44.1%、移动 37.2%、等待 11.5%;第 80 轮为 42.7%、38.2%、10.8%。来源:game_ai/experiments/0230-ranker-trainability/README.md。

6.3 0231:全批训练可以记住小样本

结论:同一 512 个决策,只把批改为全批,原模型在 1400 步达到 0.95;记不住主要是优化噪声,而不是特征或标签互相矛盾。

设置 4000 步时 全体/移动 Top-1 最好记录 首次 ≥0.95
A 原模型,3e-4,批 64 0.947/0.827 0.947(仍在上升) 未达到
B 原模型,1e-3,全批 512 0.967/0.867 0.986/0.960(2000 步) 1400 步
C 加宽 512,3e-4,批 64 0.879/0.600 0.945 未达到
D 状态先拼入,3e-4,批 64 0.934/0.853 0.949/0.907 未达到

加宽没有帮助;D 对移动略有帮助。这里只测记忆能力,不是正式模型。来源:game_ai/experiments/0231-ranker-memorization-settings/README.md。

6.4 0232:新来源 0.214,仍未过门槛

结论:按更新次数重训后,开发集选出 D-8000;在 0070 新来源上移动 Top-1 为 0.214,低于 0.25。

0229 测试集已打开,不能再用;0232 改用 0070 主检验的全部 640 局生成新测试集,0 失败,结束后封存。

候选(开发集) 全体 Top-1 完整菜单移动 Top-1 类内移动 Top-1
A-4000 0.536 0.156 0.317
A-8000 0.549 0.183 0.343
D-4000 0.506 0.193 0.322
D-8000(选中) 0.492 0.200 0.313
测试集指标(0070 新来源,只读一次) 值
完整菜单移动 Top-1(主指标) 0.214
完整菜单移动 Top-3 0.446
类内移动 Top-1/Top-3 0.339/0.540
按来源平均移动 Top-1 0.222
全体 Top-1/类型正确率 0.475/0.783
类内均匀随机期望(5 倍) 0.0346(0.173)
与 T 落点 ≤1 格/平均距离 47.9%/2.77 格

事前写定的交叉表把 T 的移动按“菜单上有没有普通攻击”分开:

T 的情况 决策数 模型选攻击 选移动 其他
菜单有普通攻击,T 移动 3,344 52.5% 39.3% 8.2%
菜单无普通攻击,T 移动 1,697 — 84.3% 15.7%
T 攻击 16,735 88.5% 5.8% 5.7%

来源:game_ai/experiments/0232-ranker-retrain-update-budget/README.md。

7. 讨论

结论:可以确定的是“新特征改善了落点排序、错误主要集中在能攻击却移动的边界”;为什么这条边界难学,以及它是否值得学,还没有验证。

已确定

  1. 结构化动作特征有用。 在同一冻结协议下,类内 Top-1 从 0.154 升到 0.340,约为类内随机的 9 倍;距 T 落点 1 格内从 27% 升到 48%。这回应了 BC“移动 0/478”时输入不足以区分落点的问题。
  2. 小样本记不住是优化噪声造成的。 0230 的同一 512 个决策,0231 只改为全批就在 1400 步达到 0.95,说明特征与标签在这些样本上并不矛盾。
  3. 0.137 到 0.214 的提升来自类型选择,而不是落点排序。 两次测试的类内 Top-1 分别为 0.340 和 0.339,几乎不变。两个测试集不同,这个比较只作参考。
  4. 主要误差在“能攻击却移动”。 T 的移动有三分之二(3,344/5,041)发生在菜单有普通攻击时,模型过半选了攻击;没有攻击可选时,模型选移动的比例是 84%。

未验证的解释

  • T 在能攻击时移动,取决于 v59 攻击评分与威胁圈移动价值的比较;0069 只给了按速度和距离的近似可达计数,没有给出行动顺序和敌方下一步的可达伤害。
  • 这部分 T 的选择本身可能偏弱。0070 中 T 在 320 个新来源对 v59 为 +0.025 [−0.041, 0.088],没有复现 0068 的 +0.103;0071 中“打得到就打”的 H3 为 +0.141 [0.081, 0.200],同来源 H3−T 为 +0.116 [0.047, 0.184](探索性)。因此这条边界可能既难学,也不值得学(来源:game_ai/experiments/0070-threat-zone-independent-validation/README.md、0071-heroes3-holdout-supplement/README.md)。
  • 模型结构(状态与动作只拼接一次)和容量可能仍有限制;0231 中 D 结构对移动略有帮助,但 0232 选中的 D 在类内排序上没有超过 A。

GPT 讨论的建议(均已核验)

  • r11:先做只给动作打分的模型,输入结构化动作特征,不输入 T 或 v59 的评分。
  • r12:照冻结协议执行,补报类内、按来源和六角距离诊断;若可学,下一步是 32–40 个新来源的小规模对战,先不混教师。0229 未过门槛,对战没有启动。
  • r13、r14:先做可拟合性诊断,再以更稳的优化按更新次数重训。
  • r15:机器学习暂停;以后若恢复,以 H3 为教师并分开报告;优先 H3 试玩和跨对手检验 0072。需要注意,H3 只有 5.4% 的决策是移动(T 为 15.9%),以 H3 为教师时,移动样本会少得多。
  • r16:0072、0073 中研究搜索 quick 对 H3 与 v59 都约为 −0.67;不能认定 quick 的优势只来自搜索,因为它读取特权信息并使用精确预览。建议先做信息消融,再考虑公开搜索与搜索蒸馏(用搜索结果训练策略和价值),暂缓 AlphaZero 式方案。据此的 0074 显示:遮蔽对手法术书后,quick 对 H3 仍是 +0.766 [0.64, 0.88]、113 胜 15 负,64 个来源逐局相同;装备效果与精确预览的贡献尚未排除(来源:game_ai/experiments/0074-quick-information-ablation/README.md)。

8. 局限与威胁

结论:本文的数字只说明“模仿一个规则教师的离线能力”,不能当作棋力、商业游戏正确性或玩家信息条件下的强度。

  • 不是棋力测试。 0229–0232 没有任何对战;移动 Top-1 高不代表整场更强,0212、0214 已经出现局部指标改善而整局不变的情况。
  • 教师质量。 T 未通过独立留出验证,模仿得再好也可能只是复制偏弱的选择。
  • 规则版本。 训练与测试数据都在 v452 下生成;后来的 Core453 修了农民死亡转化占格,这些数据没有重新生成。早期学习路线分别在 Core448、Core449 下,旧数字保持原日期和协议,不换算为当前结论。
  • 样本相关性。 同一战斗的决策不独立,主指标按决策计算;按来源平均的结果(0.135、0.222)与主指标接近,但两局镜像开局的同源样本仍相关。
  • 测试集复用。 0229 测试集读过一次后不再使用;0070 的对局此前用于 T 的独立验证,其决策没有进入训练,0232 用后已封存。
  • 特征近似。 下回合可达不计障碍和行动顺序;攻击序列是公开平均伤害场景;生物静态值不含英雄加成。
  • 信息边界。 编码只读公开观察,并有隐藏随机状态不变性测试;但这只测了随机状态,没有逐项测试所有隐藏装备差异。研究搜索 quick 读取特权信息,与本文模型不是同一信息条件。
  • 可复现性。 GPU 训练非逐位确定,复跑数值可能有小差异。

9. 结论与后续

结论:生物配置导出和结构化动作特征是可保留的基础设施,模仿 T 的路线按协议结案,学习型 AI 暂停。

这一轮的主要收获是方法而非模型:

  1. 冻结协议。 每次实验在读数据或训练结果前写定划分、模型、预算和门槛;不通过就结案,不在同一实验里改结构重跑。
  2. 测试集只读一次。 0229 的测试读过后,0232 必须换成新的 0070 来源,并在使用后封存。
  3. 把“选什么类型”和“去哪一格”分开报告。 只看完整菜单 Top-1 会把类型错误和落点排序混在一起;类内 Top-1 和交叉表让 0.137→0.214 的来源一目了然。
  4. 数据管线也会暴露模型代码的错误。 逐步重放和行宽检查找到了几何回退少 1 维的问题。

后续若恢复(每项都须另立实验并冻结新协议):以 H3 为教师并分开报告;只学类内落点排序、类型由规则决定;补入行动顺序与敌方可达伤害等公开信息;或在信息消融完成后考虑公开搜索的蒸馏。0228 小型残差自对战仍只是提案,没有实现或训练。更早的公开动作规划与 2026 年 10 月进展见 s40;总体设计见 s00。

10. 复现方式

结论:数据可由保存对局逐步重建,训练脚本与冻结设置一一对应。 数据生成在 core 环境,训练在 C:/Users/felix/.venvs/general(torch)。

# 1. 生成决策分片(core 环境;事件字节逐步核对)
python -m game_ai.benchmarks.code.action_dataset_0069 OUT_DIR GAMES_DIR_OR_FILES... --pattern '*-T-*.json.gz' --side ...

# 2. 0229 训练与一次性测试(Torch 环境)
python ranker_0229.py train SHARD_DIR OUT_DIR --variant full|base --device cuda
python ranker_0229.py test  SHARD_DIR OUT_DIR --variant full|base
python -m game_ai.benchmarks.code.diagnose_0229 OUT_DIR --variant full     # core 环境,六角距离

# 3. 0230 / 0231 诊断
python trainability_0230.py SHARD_DIR OUT_DIR --device cuda
python memorization_0231.py SHARD_DIR OUT_DIR --device cuda --steps 4000

# 4. 0232 重训、选择与新来源测试
python ranker_0232.py select SHARD_DIR OUT_DIR --device cuda --updates 8000
python ranker_0232.py test TEST_SHARD_DIR OUT_DIR --device cuda

训练脚本位于 game_ai/benchmarks/code/。测试:game_ai/tests/test_action_features_0069.py、game_ai/tests/test_action_dataset_0069.py、simulator/tests/test_creature_definitions.py、simulator/tests/test_creature_definitions_guards.py。各次运行的日志、指标与模型权重在 local_data/game_ai/0229-action-ranker-imitate-t/run-1/ 等对应目录。

11. 更新记录

  • 2026-10-15: 新建本文。汇总 0200–0227 学习路线的结案原因,记录生物配置导出(157 个生物)、0069 结构化动作特征(每动作 351 维)及数据生成器,以及 0229–0232 四次冻结实验的结果;补入 GPT r10–r16 的建议与 0074 信息消融结果。学习型 AI 暂停,默认对局 AI 仍为 v59。