igofreely
发布于 2026-07-20 / 50 阅读
0
0

美服红警精确建造助手

RA2 Hybrid AI
面向 Chrono Divide《红色警戒 2》1v1 的规则引擎 + 强化学习 AI。长期验收目标是在多地图、多出生点、多阵营和真人盲测中稳定击败顶尖人类玩家。

当前版本完成的是可持续变强所需的工程底座,不声称现有冠军已经达到顶尖人类水平。正式冠军仍是 v4-paired-correction-v2,由 strategies/champion.json 锁定路径和 SHA-256。

核心设计
运行时只有一条决策链:

实时战局
  → 默认规则策略(完整可玩基线)
  → 声明式规则引擎(强制 / 屏蔽 / 先验)
  → PyTorch 策略残差(只在可信区间介入)
  → 合法性、经济、兵力、冷却与执行门
  → 战术执行层(集火 / 残血保全 / 编队 / 反制出兵)
  → 游戏命令 + 完整决策轨迹
规则负责不可违反的底线:开局经济、侦察、反 rush、防空、兵力和执行合法性。
模型负责规则难以枚举的部分:时机、组合、对手适应、地图和出生点差异。
战术执行层负责“怎么打”:小队集火、残血单位撤退、编队密度和按敌方兵种反制出兵,实现集中于 src/ai/tactical-policy.ts 的纯函数,内置 Bot 与浏览器端共用同一份逻辑。
训练使用回放回报、价值头、离线 AWAC(优势加权 actor)、负动作学习和冠军 KL 锚定;四类数据按有效 sample weight 强制混合,缺少任一必需来源时失败关闭。
候选模型永远不会直接覆盖冠军。只有配对竞技场的总体置信下界为正、所有地图桶无显著回归、模型实际影响动作流、无规则违例且无崩溃时,才可原子晋升。
被拒候选不会成为下一轮起点,大模型文件会删除,只保留报告和遥测。因此“线上战力单调不退化”是工程约束,而不是训练口号。
详细说明见 docs/architecture.md 和 docs/training.md。

硬件目标
默认配置针对本机 Intel Core Ultra 7 265K(20 逻辑处理器)、64 GiB 内存和 RTX 5080 16 GiB:

首次没有冻结数据集时执行一次 bootstrap:19 个 CPU actor 完成采样后再启动 CUDA learner;
稳态迭代把两条工作流重叠:19 个 CPU actor 采集下一代回放,同时 GPU learner 只读上一代冻结数据;
并发窗口的平均 CPU 和 GPU 使用率都必须至少 95%,且并发窗口必须覆盖该轮活跃时间的至少 85%;
监控忽略 30 秒 warm-up,至少采 120 个样本,不接受瞬时峰值冒充持续利用率;
CUDA allocated/reserved 上限分别为 14.2/15.2 GiB;
任何 CUDA 不可用、利用率不足、显存越界、专家/hard-case/规则反例数据缺失或冠军 SHA 漂移都失败关闭。
当前机器上的 torch 2.10.0+cpu 不支持 CUDA,因此 npm run train:doctor 会正确失败。先通过 PyTorch 官方安装选择器 安装与 Windows、Python 和驱动匹配的 CUDA 版本;不要让训练脚本静默回退到 CPU。

录像冠军精确建造助手
D:\rlpdownloads 中的评分录像可以生成按“地图 + 实际出生点 + 阵营”索引的精确开局手册。每个基础情景保留评分最高录像的胜方视角,同时建立紧凑的高质量对局搭配索引。1v1 与 2v2 是不可跨越的学习边界:实战 1v1 只从 1v1 录像选择,实战 2v2 只从 2v2 录像选择;在同一模式内再优先采用相同苏/盟/尤里对阵结构,并在质量门槛内优先玩家、盟友和对手国家分布一致的录像。策略保存建筑入队 tick、落地 tick 和绝对格子坐标。日常新增录像和强制全量更新分别使用:


更新器使用 .runtime/exact-opening-book-update-state.json 记录评分指纹、地图指纹和上次通过审计的建造书 SHA-256。候选文件只有通过来源、覆盖率、建筑、单位、占领、大兵进驻、空投伞兵、坦克打树/打矿、卖建筑/原位重建依赖和完整操作步骤审计后才会原子替换正式策略;失败时保留旧策略。完整更新说明见 docs/09-精确建造策略更新.md。

browser:assist 默认用 PROXY_HOST=0.0.0.0 监听全部 IPv4 网卡,启动时同时打印 localhost 和检测到的局域网地址;本机控制面板可用 http://localhost:3000/,同一局域网可用。首次出现 Windows Defender 防火墙提示时需要允许 Node.js 访问“专用网络”。油猴脚本仍建议在运行 Chrono Divide 的电脑上从 http://localhost:3000/ra2bot-cdhelper.user.js 安装。安装后删除/禁用旧的 Ra2Bot helper 和独立 cdhelper,避免重复采集。仓库中的 src/proxy/web/ra2bot-helper.user.js 只是合成时使用的内部执行模块,不能单独安装;所有功能均以代理输出的 ra2bot-cdhelper.user.js 为最终交付和验收对象。界面统一为 cdhelper 风格,“建造步骤”可展开查看建筑、单位、占领、大兵进驻、空投伞兵、坦克打树/打矿、卖矿场、完整狗探路、工程师装车和建筑集结点的状态、录像参考时间、精确坐标、路线进度和重试次数。实战按 Ctrl+B 可暂停/继续精确时间线;暂停期间不执行动作,继续后所有动作整体顺延,不会瞬间补发暂停期间已过期的步骤。

精确模式使用单一 Node BrowserBotBrain:精确录像拥有录到的建造、生产、占领和单位路线,普通建造/生产只在录像释放相应队列后接管;同一个 Brain 始终负责战斗、基地防守、采矿经济和缺电恢复。旧浏览器 BuiltIn Bot 在该模式下禁用,避免它的单车任务与整队战术或玩家控制租约争抢单位。

观看录像时,面板从录像开局起就按当前地图显示可选出生点和阵营;点击“播放”即可把该情景的原始冠军学习录像导入 Chrono Divide 录像仓库,并在专用新标签页播放。脚本按录像 ENGINE 版本自动使用当前客户端或 Chrono Divide 官方历史客户端;学习录像结束后专用标签页自动关闭,原录像页不会卡在关闭提示。

精确建造步骤还会显示卖建筑动作;若录像在出售后于同一占地范围重建,出售成功是新建筑自动落地的前置条件。

实战中进局后读取当前玩家的真实 startLocation,据此选择最近出生点,再读取对手国家选择同阵营搭配/高质量同国家分布录像,并用源录像的相对出生点坐标换算本局落点;精确助手负责录像建筑入队和落地、MCV 展开、建筑出售/维修及已确认的录像单位/占领/进驻动作。录像动作会短暂占用对应单位或生产队列作用域,同一 Brain 的普通命令自动让路。防御队列不得越过录像中更早且未完成的结构建筑。录像目标格被单位占用时不会移动坦克、矿车或玩家单位:普通建筑短暂重试后搜索附近合法空位,达到自动放置上限后由玩家手动放置并继续;严格原位替换只等待自身占地,不暂停进攻、采矿、生产、防守或其他自动操作。每个实战标签页拥有独立 Brain,建造命令只发往产生该状态的标签页。单位、建筑、队列、出生点、基地、维修状态和阻挡信息来自一体化脚本内的只读 cdhelper:snapshot;快照缺失或过期时只暂停精确时间线。完整说明见 docs/08-精确建造助手.md。

5.3.83 的自主战斗会在 6 辆主战坦克且综合战力达到已知敌军 1.35 倍时发动全军总攻。坦克离家后先在本方基地集结一次,已经抵达敌方基地/接战区的部队则持续进攻、绝不因重新集结返回;基地 24 格预警圈内出现成群敌军时,空闲部队先直接拦截,兵力不足才按战力缺口抽调最近的进攻单位,剩余主力保持原攻击命令。目标顺序为敌军战斗单位、全部敌军建筑、其余非战斗单位。敌方飞行兵/飞机接近时主动调集机动防空支援,地面主力不停步。铁幕仅在 9 辆坦克形成相邻 3×3 编队后自动用于强攻,或在只有 4–8 辆且附近存在敌方战斗坦克时紧急使用;其他超级武器和录像超武步骤仍由玩家控制。

5.3.84 根据最新实战录像 replays/20260727_185649_typescript_vs_YUSUF11_2poltergeistprecaptured.rpl 修复高频改令:8:00–8:59 一分钟内曾产生 1,396 条部队命令,其中 1,243 条为攻击类,自动点射、移动和玩家接管互相覆盖。现在有效点射目标保持 4 秒,跨越射程边界不再重发;大规模进攻只用敌方野战部队判断明显优势,静态防御不再把优势总攻卡住;主力整局只在本方基地集结一次,之后不会因新波次或重选目标返回。Ctrl+X 同时作为全部自动操作总开关;开启时,玩家选择或下令的单位独享 10 秒人工控制期,精确录像和 Botscript 都不得覆盖,但自动建造、生产、防守及未被操作的部队继续运行。插件会读取实时恐怖机器人寄生状态:来得及则让中招车辆进入维修厂,否则由附近武装单位强制打爆;空闲矿车停满 10 秒后把采矿搜索半径从 3 格扩大到 20 格。自动攻击优先清除恐怖机器人,苏军优先生产恐怖机器人克制辐射工兵,防空履带车优先迎击飞行兵;防空炮是地面部队最后处理的目标。

5.3.85 收窄了上述开关并恢复连续进攻:Ctrl+X 关闭时只暂停原插件 BrowserBotBrain 对普通作战单位的自动移动、攻击、碾压、防守调动、维修和铁幕编队,不影响精确录像、内置 Botscript、建造/生产或采矿经济;已经入队但尚未提交的原插件作战单位命令会被单独清除,精确录像和 Botscript 动作保留。每一支新形成且尚未抵达敌方前线的主力波次都可以再次在本方基地集结后出发;已在敌方基地或接战区的部队不会被拉回,目标消失时继续搜寻并攻击敌军部队和建筑。

5.3.86 修复自动天梯的重复提交竞态:Quick Match 只负责进入排位页,真正提交 Match 的 Play 每轮只点击一次;匹配、倒计时和载入期间只监视状态,不会因为按钮仍可见而再次排队。匹配参数与官方 0.83.2 客户端保持一致:WOL CVERS 使用完整发布版 0.83.2,matchbot VRS 使用引擎版 0.83;STARTG 一次性 ticket 在游戏服务器也只执行一次 join。遇到 Received unrecognized parameters from match server、Cannot join a game that has already started 或 You've been disconnected from the server 时,插件废弃旧比赛与旧 ticket,按 5–60 秒有界退避建立全新连接重新匹配,不再以 200ms 刷新形成断线风暴。命令行排位在 gserv 完成接管前会保留 WOL 会话,并在收到 STARTG 前预先完成 Bot/策略初始化。

5.3.87 根据最新实战录像 replays/20260727_212028_typescript_vs_Sopheak_2pinchpointle.rpl 重写进攻时机。该局 10:47 内有 2,397 条攻击命令和 910 次三秒内攻移反转,成组推进却集中到约 8 分钟后。现在首波在 4 辆主战坦克时开放、6 辆时无条件出发;若更早首次出现余额不超过 500 且生产连续 3 秒无进度,则至少 3 辆坦克也可提前出击。敌方作战实验室首次建成会立即派出至少 2 辆新坦克作为第二波;10:00 是全军总攻硬截止,不再等待战力比。浏览器使用真实履带寻路、地形高度和通道宽度比较直线与四条侧翼路线,只在已知敌军埋伏于高地或窄口且侧翼风险更低时,为整支坦克群提交同一组 Shift 航点。玩家选择或下令后,锁步提交口会再次过滤该单位的全部自动命令 10 秒;精确录像、Botscript、建造清障和采矿都不能抢回该单位,但建造、生产、防守流程及其他单位照常运行。

5.3.88 继续审计 replays/20260727_221836_typescript_vs_Shenju_mp15s4.rpl:2:24–3:15 的 4–6 辆坦克一直对本方基地中心 (53,88) 重发 AttackMove,真正的 25 单位前推到约 8:00 才出现。根因是把被基地建筑占用的 baseTile 当作坦克集结点,并在首波状态已消耗后没有后续强制出发线。现在浏览器沿真实履带路径选择离开建筑占地的可通行基地出口;6 辆坦克最多集结 3 秒便直接前推,4–5 辆最多等待 6 秒,目标暂时消失也继续沿敌基方向行动;任何后续 6 辆主力都会再次强制发动总攻。录像建筑坐标被单位阻挡时不再移动坦克、矿车或玩家单位,只短暂重试后使用邻近合法落点/人工放置,因此不会刷新单位租约或压住战斗。精确录像仍拥有当前建造命令的最高优先级,但检测到敌方空军后可在空余队列追加低优先级应急防空;单架基洛夫按至少 5 个机动防空单位配置并集中调动。最终锁步过滤还会从未标记的 SelectUnits → OrderUnits 动作推断单位 ID,封住第三方/遗漏路径对玩家 10 秒控制权的绕过。

5.3.89 修复精确建造助手学习到的工程师占领步骤未自动执行:Capture 命令现在携带精确录像元数据,进入 exact-replay 优先队列,不再被普通战斗开关、Botscript 或同帧选择覆盖。玩家选择或下令的单位至少保留 10 秒人工控制;超过 10 秒后,只要单位仍被选中或玩家命令尚未执行完毕,所有自动路径都会继续让路,直到取消选择且单位恢复空闲才交还给 AI。

5.3.90 根据最新实战录像修复第一条狗未按学习路线探路、工程师占领启动过晚的问题:录像狗的每个航点都进入 exact-replay 优先路径,不再被普通自动作战命令覆盖;工程师和中立建筑一旦实际出现,录像占领立即执行,不再等待无关的狗生产或普通建造队列。更早的工程师运输任务和玩家人工控制仍保持最高优先级;依赖占领半径的矿厂继续保持 Ready,直到占领成功后才落地。

5.3.91 修复最新录像中 3 个工程师和 2 条狗仍未立即执行学习策略的问题:所有可执行占领步骤现在同帧并行处理,并为各目标保留不同工程师;狗的每段路线强制以非排队首命令启动,后续同帧排队航点也不会再清除前一航点。玩家人工控制和更早的工程师运输任务仍优先。

5.3.92 将工程师占领前的连续 Move/ForceMove 接近路线纳入所有精确录像的通用学习规则。运行时以非排队移动起步、排队后续航点和 Capture,停滞恢复也重放完整路线;没有前置路线的录像仍直接占领。由机场/油井所有权解锁的附近建筑继续保持 Ready,成功占领后立即按录像坐标落地。

5.3.93 根据 replays/20260728_144935_typescript_vs_15263436788_tourofegypt.rpl 修复首波和人工接管:4–5 辆坦克不再因敌方已有坦克或战力评估而留在基地,达到 4 辆即强制发动普通进攻,6 辆升级为强制总攻;敌方作战实验室事件会持续等待至少 2 辆坦克,并绕过上一波的普通冷却立即发兵。录像动作使用 60 Hz 原始时钟,而浏览器曾误用 15 Hz 策略时钟,导致玩家在 tick 20466 下令后 tick 20640(约 2.9 秒)就被自动微操抢回;现在所有自动单位路径至少让路 600 个原始 tick,之后仍持续等到单位取消选择且人工命令完成。

5.3.94 根据 replays/20260728_152625_Player1_vs_AI2_mp01t4.rpl 修复精确建造期没有运行主战 AI 的根因:exactBuildOnlyModules() 不再关闭战斗、经济和防守,精确模式同时禁用会发单车任务的旧 BuiltIn Bot,所有单位命令统一由 Node Brain 提交并继续遵守人工租约。四辆坦克先压敌方矿车/矿场;无可见目标时整队攻移到敌方矿区/基地;前线存活期间每两辆新坦克立即增援,前线全灭后每四辆重新发动。真实基地突破按敌方约 1.3 倍战力从全部可战单位中调防;精确建造期间结构队列空闲且缺电时立即补电厂,同帧已有录像建筑命令时仍保持录像优先。

5.3.95 根据 replays/20260728_163547_Player1_vs_AI2_mp01t4.rpl 修复 6 分钟后主力在敌方门口反复前进/后撤的问题:新增坦克不再参与前排回拉,队形修正只让后队向前攻移追赶;普通主攻在本方出口完成一次短集结后持续压向敌方矿区、坦克和基地,目标进入黑雾或战力转劣也不解散、不撤退、不建立第二个前线集结点。防空履带车/IFV 不再进入地面主攻、基地地面拦截或地面点射,只在空军出现时移动到主力附近并攻击空中目标;完成精确探路的空闲狗与基础步兵加入坦克屏障,仍在执行精确录像路线的狗继续由学习器独占。

5.3.96 根据 replays/20260729_102006_playfoot_vs_policeTri_2pinchpointle.rpl 修复玩家与自动系统反复抢单位控制权,以及劣势进攻深入敌方包围圈的问题。原生 UI 的 ActionsApi.orderUnits 入口现在立即登记人工单位,至少保护 10 秒,并在取消选择后继续等待连续空闲 3 秒才交还自动系统。首波、重建波、作战实验室波、10 分钟总攻和增援全部使用包含敌方地面防御的完整战力评估,不再以数量或时间强制送出;已形成的前线转为劣势时原地警戒和本地集火,不撤回基地也不继续深入,恢复优势后再继续推进。

5.3.97 根据 replays/20260729_140653_typescript_vs_JONG31_4heckfreezesoverle.rpl 修复 3:26 的客户端崩溃。劣势前线的 GuardArea 现在始终携带当前编队中心坐标;无法计算合法坐标时改发安全的停止命令。浏览器命令边界同时拒绝所有缺少有限地图坐标的区域警戒命令,避免非法 OrderType 6 再进入 Chrono Divide 并触发未定义目标的 tile 异常。

5.3.98 根据 replays/20260729_144233_typescript_vs_wutti_4jungleofvietnamle.rpl 修复玩家操作再次被自动防守覆盖,以及小股伞兵/飞行兵拉走全军的问题。仍处于玩家选择中的单位会在最终动作队列直接拒绝全部自动命令,右键和单位快捷键还会在原生输入捕获阶段提前建立人工租约。基地防守按地面/空中威胁分别抽调达到约 1.3 倍战力的最近最小编组;苏军防空履带车可碾压伞兵。4–6 辆坦克且敌方至少少两辆坦克、地防有限并通过完整战力评估时立即把握进攻窗口;敌方作战实验室出现后至少等待四辆安全坦克,优先攻击无保护矿车,防守严密时不正面送入火力圈。

5.3.99 修复自动排位进入游戏服时出现 Received unrecognized parameters from match server 后永久黑屏的问题。匹配错误监视器现在独立于排位按钮扫描和游戏 API 就绪状态持续运行;发现坏参数、旧比赛或断线弹窗后会关闭弹窗,丢弃当前内存中的 QuickGame/WOL/一次性 STARTG ticket,并从干净入口建立全新联机会话。真正进入对局改由首个有效游戏 tick 确认,QuickGame 的最终 Play 也要求官方 .qm-form 上下文,避免误点其他 Play 按钮。

5.3.100 根据 Snow Valley 最新实战及对应 Gopa 学习录像修复第二、第三次基地迁移遗漏。浏览器快照确认的 MCV 部署可跨旧基地/新 MCV 对象 ID 连接,支持新对象只有 DeploySelected、部署前长时间等待以及新基地稍晚出现建造证据;其他无身份部署仍使用保守阈值。展开后的建筑严格等待本次迁移完成,并且只用新基地半径内的建筑验证,不再被旧基地先落下的无关建筑干扰。

5.3.101 增加可审计的精确策略来源覆盖:Snow Valley、出生点 2、苏军阿拉伯对美国固定使用已逐步核验的 Gopa 学习录像,评分库全量刷新或后续增量合并都不会再把它替换成缺少多次基地迁移的普通开局。覆盖文件纳入更新状态指纹、深度重建审计和 cdscript 交付包。 运行时选择器也会优先完整匹配的已核验来源;随包自动演示测试已验证 17 次建造坐标和三次基地迁移全部按录像执行。

5.3.102 根据最新完整实战录像 replays/20260731_184215_tsbt_vs_pluembi_mp15s4.rpl 修复基地迁移与射程点射。迁移开始时若旧基地仍有已经造好但尚未落下的建筑,精确助手会立即落地并等待地图确认,之后才允许基地收起;只有落点位于新基地展开区域、由录像明确带往目的地的 Ready 建筑可以随基地车迁移。射程点射开启时,普通步兵即使收到过时的 crushable=false 元数据也会按稳定的重步兵排除表判断;每个附近步兵只分配一辆可碾压坦克执行 ForceMove,其余坦克继续集火装甲与防御建筑,避免多车挤向同一点。

5.3.103 根据最新实战录像 replays/20260731_192454_Player1_vs_AI2_mp15s4.rpl 修复碾压命令在浏览器最终边界被长期拦截的问题。Node 战术日志从 1:38 起持续生成“分目标碾压”,但录像中两辆 HTK 在原始 tick 7131(1:58.85)的最后一次明确移动后仍保持选中,选择恢复动作一直到 tick 8830(2:27.17),旧逻辑会把“仍选中/命令未空闲”当成无限延期条件,最终整局没有提交一次 ForceMove。现在仅按最后一次真实玩家选择或命令建立严格 10 秒单位租约;到期后即使选择框仍保留或旧命令仍报告忙碌,也恢复该单位的射程点射和碾压。苏军全部作战坦克及防空履带车可以自动碾压,盟军仅灰熊坦克可以自动碾压;浏览器桥回归测试同时锁定 forceMove → OrderType 1,防止退化为普通移动。

5.3.104 将射程点射的自动碾压触发线从固定 6 格改为每辆车对当前步兵的实际对地射程外 2 格。步兵进入边界的首个状态快照就会把已有点射锁定切换为 ForceMove;多个步兵继续一兵一车分配给最近可用车辆,避免多车挤向同一目标。回归测试覆盖苏军犀牛坦克、防空履带车和盟军灰熊坦克,并锁定边界外不碾压、进入边界立即碾压。

5.3.105 根据最新录像 replays/20260731_203020_Player1_vs_AI2_mp15s4.rpl 修复自动碾压在浏览器最终锁步边界被玩家租约吞掉的问题。Node 端确认的每个步兵分目标碾压命令现在标记为 autoCrush,原生玩家移动只保留同一锁步约 0.25 秒的防竞态窗口,随后立即提交 ForceMove;普通移动、攻击、集结和 Viewer 指挥仍完整遵守 10 秒人工控制租约,Ctrl+X 关闭时同时清除待提交的碾压命令。新增录像时序回归测试锁定 6424→6540 原始 tick 场景。

5.3.106 修复 npm run replay:update-delivery 在 Windows 上更新完策略后可能因杀毒软件、索引器或短暂共享冲突连续 20 次写入失败的问题。约 15 MiB 的正式策略不再原地覆盖,而是先完整写入同目录临时文件,最多等待 60 秒后原子替换;失败信息会保留最后一个系统错误码,旧策略不会被截断。整条自主更新增加互斥锁,时间线未变化时跳过仅刷新 generatedAt 的重复写入,避免刚生成的增量状态 SHA-256 立即失效。新增真实 Windows 独占句柄和并发锁回归测试。

同版本把 crx 的 EXE/Chrome 插件交付从旧 5.3.81 同步到当前 browser:assist。CRX 构建会先自动运行 build:cdscript,再从 cdscript/package.json 注入 Manifest、弹窗、安装器、更新 XML 和产物文件名;交付信息记录服务、网页脚本、精确策略、证据文件及原生桥的源哈希。crx\npm run check 会校验 browser-assist 启动参数、五项环境开关、完整录像文件名集合、实际 3100 服务、原生消息、CRX 自更新与 SHA-256,防止旧服务和新清单混装。

自主进攻修复(实战对局反馈)
一次实战对局暴露出进攻行进队形差、犹豫不决、集火差和碾压不果断。根因和修复都在 src/proxy/browser-bot.ts(启动插件.cmd 运行的就是它打包出的 cdscript/server.mjs,与内置 Botscript 无关):

现象	根因	修复
进攻犹豫不决	findEnemiesNear 把敌方建筑也算作“基地入侵”,命中后直接 return。近点开局或敌方向我方扩张时,一栋静态建筑就能永久封死后续所有进攻波次	基地防御只统计移动单位;且只有真实威胁(排除军犬、矿车、战力 <0.5)才会抑制新进攻,孤狗路过不再冻结全军
进攻一发即撤、压境却未成建制防守	防守判断排在进攻维护之后,若进攻分支提前返回则本帧根本不防守;命中后又把全部进攻单位 attackMove 到基地中心,既打断主力也错过实际交战点	防守改为进攻维护前的必经步骤;24 格预警圈内用共享集火直接拦截。只有大规模压境且本地兵力不足时才按缺口抽调最近进攻单位,保留足够主力前推,绝不再把整队送到基地空坐标
集火较差	默认路径(未开 Ctrl+X)完全没有逐单位集火,整波只在发起时收到一条 attack <targetId>;目标一死就全部退回引擎自动索敌,伤害四散	新增 manageAssaultFocusFire,复用已测试的 planFocusFire 逐单位分配目标,每秒刷新,自带过度杀伤上限
行进/进攻队形差	编队只把掉队者往前拽,从不减速前排。灰熊(速度6)与 V3(速度3)混编时必然拉成长队,被逐个吃掉	新增 holdOverextendedColumn:沿推进轴摊开超过 14 格且前排未接火时,前排收拢等待后队;已在交火的单位绝不后撤
10 分钟仍未进攻	早期版本可能无限等待,随后又把数量和时间改成无条件强制线,导致少量坦克冲入优势敌军和地防	首波至少形成 6 辆并通过完整战力评估;敌方实验室事件会保持待命并绕过普通冷却,但只在火力占优时发兵;10:00 重新评估全军,不再让时间绕过安全门槛
高地/窄口埋伏	只给敌基目标,底层寻路固定走最短通道,不比较已知敌军占据的高地和狭窄口	用实时履带寻路生成直达与四条侧翼候选,按高度、横向可通行宽度和敌军射程评分,整队使用同一组排队航点绕行
十辆坦克仍在基地	本方基地建筑坐标曾被误用为集结点;后续又用强制出发掩盖战力不足,容易整团进入敌方包围	集结改用履带可通行的基地出口;后续 6 辆以上重新按敌军、地防和护航评估,优势成立才整团出发。已形成进攻在目标丢失时继续施压,但战力转劣会守住当前火力线等待增援
碾压大兵不够果断	三重封锁:地图上任意位置存在敌方坦克即禁止所有进攻坦克碾压;13 格内有敌坦克再次禁止;冷却 60 tick(4秒)导致压向 4 秒前的旧坐标	去掉“全图有敌坦克即禁用”这条无条件封锁;13 格安全包络保留,但 3 格接触距离内始终允许碾压(几乎零成本);冷却降到 20 tick
碾压的兵种判定改为:引擎 canCrush 元数据只能否决碾压,不能扩大范围。盟军仍只有灰熊自动碾压——幻影移动即暴露、光棱贴脸等于放弃全部射程优势,这是有意的战术限制,不是遗漏。

Ctrl+X 原插件单位自动操作开关与射程点射协同
5.3.85 起 Ctrl+X 只控制原插件的普通作战单位自动操作:关闭时暂停 manageTankCrush、manageAutoFocusFire、自主进攻、防守调动、维修和铁幕编队;精确录像、内置 Botscript、自动建造/生产和采矿经济继续运行。重新开启后原插件单位战术从最新快照继续。最新录像确认问题集中在高频改令:

8:00–8:59 共 1,396 条部队命令,其中 1,243 条攻击类命令;
11:00–12:59 又有 586 条命令,自动移动/点射与玩家接管明显交错,并出现针对中恐怖机器人己方车辆的人工强制攻击。
命令刷屏的两个来源都已修复:AUTO_FOCUS_REFRESH_TICKS 提高到 60(4 秒),同一仍有效的目标保持粘滞;approach/inRange 相位变化不再绕过刷新节流,并保留 0.75 格迟滞。恐怖机器人、飞行兵等紧急克制目标会先改变合法目标池,因此仍可立即打断旧锁定。

集火采用池内收敛而非替换选择:selectAutoFocusTarget 先把候选收缩为一个 pool(机动防空先打空中目标 → 恐怖机器人打辐射工兵 → 其他地面部队先打敌方恐怖机器人 → 前排坦克带 → 碾压优先 → 防空炮/矿车最后),这个池就是该单位自己认可的目标集合。新增的收敛只在池内改选,因此克制与前排带规则依然生效,也绝不会把单位拖入无意义追击。

玩家选择或下令的单位会从所有自动单位命令中过滤严格 10 秒;原始动作时钟按最高 60 Hz 计算,不能再被 15 Hz 策略时钟提前缩短。新的真实玩家操作会刷新期限,但单位持续移动、持续选中或短暂不空闲都不会在到期后继续延期。过滤在命令入队和最终锁步提交两个位置执行,因此精确录像、Botscript、建造清障和采矿命令也不能绕过。这个租约不暂停自动建造、生产、防守流程或其他未操作单位;防守会改用仍可自动控制的部队。

策略还会学习卖建筑后原位重建的出售动作、替换建筑和坐标依赖;同时学习高置信的基地车拖动路线与重新展开坐标。只有最终展开后能由邻近的新结构落点验证的路线才会写入;自动收起已有基地必须在移动前识别到明确的收起命令,既支持旧基地和基地车使用不同对象 ID,也支持游戏收起前后保持同一 ID 的 Deploy(self) → Move → DeploySelected。迁移期间暂停结构和防御建筑入队,避免生产队列阻止收起;其余证据不完整的路线只接管实际存在或已生产完成的基地车,逐点移动、重试并在目标处展开,失败作为可选步骤跳过,不会误收主基地或阻断后续建造。

战术执行层
“打不打、打哪里”由规则和模型决定,“怎么打”由这一层决定。全部为无副作用纯函数,可单独测试,实战与浏览器端行为一致:

能力	函数	要点
小队集火	planFocusFire	整队共享一份目标序列,不再各打各的;单个目标凑够“3 秒内可击杀”的火力即停止接收射手,避免过度杀伤;饱和后剩余单位仍有目标,不空转
残血保全	shouldWithdrawDamagedUnit	生命值低于 30% 的可维修载具/飞机撤回集结点;步兵、铁幕单位、矿车和缺少生命数据的单位不撤;单次最多撤走 1/3 兵力
编队密度	requiredGatherRadius	由 sqrt(n)×10 收紧为 sqrt(n)×2,9 个单位 11 格内即可进攻而非摊开 35 格,杜绝挤牙膏式添油
反制出兵	rankCounterCompositions	按威胁缓存对编成打分:敌方有空军则重罚无防空编成,敌方防空强则压低我方空中编成,敌方防御强则抬高攻城编成
造价战力	estimateCombatStrength	优先使用引擎上报造价(犀牛 900 锚定 3.2),天启不再与犀牛近似等价
两条必须遵守的约束:

锁步确定性:GameMath 是引擎的跨平台确定性数学,模拟内不得替换为 Math.*。requiredGatherRadius 因此接受可注入的 sqrt,CombatSquad 传入 GameMath.sqrt。
战力下限:造价只能把单位抬高到类型基线之上,不能压低。estimateCombatStrength(unit) >= 0.5 在浏览器端被当作“是否战斗单位”的判定使用,100 造价的动员兵仅得 0.36,无下限会被静默移出军队统计。
反制出兵在最优分数 0.15 带内保留全部候选再随机:既反制敌方兵种,又不给人类对手读出固定出兵序列的机会;无威胁缓存(未侦察)时回到中性随机,不拿残缺情报过拟合。

规则配置
生产规则位于 config/rules/strategic.json。每条规则可以:

force:紧急状态下强制一个战略意图;
block:硬屏蔽危险意图,模型分数再高也不能绕过;
prefer:添加可被模型细化的软先验。
运行时会记录命中的规则 ID、优先级、强制意图和屏蔽意图。可用 RA2_RULES_PATH 指向另一份同 schema 文件;文件无效时启动失败,不会悄悄忽略。

规则存在两份:config/rules/strategic.json 是生产配置,DEFAULT_STRATEGIC_RULES 是浏览器 IIFE 的编译期兜底(打包产物没有 fs)。二者由 src/ai/rules/strategic-rule-engine.test.ts 的漂移测试锁定:比较决策字段并回放多个战局状态验证判定完全一致,仅 description 允许中英文本地化差异。改规则时必须同步两处,否则测试失败。

训练闭环
config/training.json 是唯一生产训练配置。连续控制器执行:

校验冠军 SHA、CUDA、数据、CPU worker 和资源上限;
bootstrap 后,19 路联赛采样与 CUDA 候选训练并行运行;每地图对手轮数按当前冠军/历史冠军/规则 exploiter = 5/3/2 分配,learner 只读上一轮不可变数据,actors 写下一轮回放;
两条工作流结束后,按整局回放生成下一代 train/validation,禁止同一回放泄漏到两侧;
候选始终从当前冠军分叉,使用 AWAC 回报优势和冠军 KL 锚定;
候选与冠军在双边、换出生点、多阵营、多地图竞技场直接对战;
计算配对分差、95% 置信区间和逐地图回归;
通过则写入内容寻址冠军库并原子更新清单;失败则删除候选模型;
连续 8 个候选被拒后停止,要求新增证据或课程,而不是无意义烧算力。
最终“击败顶尖人类”还要求独立真人盲测集:至少多名顶尖选手、隐藏地图/seed、双方换位、足够场次和预注册统计标准。自博胜率或战胜内置 AI 不能替代这一验收。


评论