AI 系统 · 系统论文与测量 · 研究原型(仿真)

VDSG:面向自主智能体的受指挥准入控制运行时

规则决定,证据学习,指令只收窄,眼睛由世界教出来。我们把运行时的契约与指令语义写成命题,推导其感知与步速感背后的估计器,用它所见与它的速度为卡死后的恢复定尺,并让整套系统掌舵 id Software 的《DOOM》(1993)与《德军总部 3D》(1992)来测量——每一次失败都留在记录里。

下载 PDF(英文)↓ 录制运行的回放 → VDSG,军用 Peel → 系统论文 · 研究原型 · 此处没有任何东西经过使用鉴定 修订 1.1(2026-09-26):“无模型”改为“无神经网络”(§3.1、§8、相关工作)。PDF 为修订 1.0 的措辞,其余内容完全相同。
规划器之前的准入 只收窄的指令 由引擎教出来的眼睛 负面结果公开
摘要

自主智能体通常因为看起来表现良好而被信任;没有人能事先说出它会拒绝什么,或者它为什么做了它所做的事。VDSG 采取相反的立场。它是一个运行时:在每一次决策,它根据显式规则从事实中计算出智能体被允许追求的目标集合,允许操作员用日常语言收窄这个集合,只在集合内部从证据中学习,并写下每一个选择的理由。我们形式化了这份契约——事实、可容许集合、固定优先级的规则策略、受约束的学习者——并证明了指令的三个小而承重的性质:一条指令只能收窄可容许集合,学习者永远不能离开它,无法满足的指令会被带理由地拒绝而不是被悄悄放宽。随后我们加入了运行时自己拥有而非假设的感官:一只眼睛,在游戏进行中由引擎教导,从颜色统计给渲染画面贴标签并测距(一个图像空间估计器,其唯一常数由光线投射引擎的投影定律学得);一个里程计,从每条命令产生的结果测出智能体真实的步速与转向率;以及一条由该步速校准的卡死规则,其脱出动作按眼睛所见的最深开阔处定尺。我们在真正的 1993 年 DOOM 共享版引擎与德军总部 3D 上测量了全部内容:深度缓冲区的尺度(墙每级 7.64 地图单位,精灵 7.35;1,703 个可信样本)、眼睛与教师的一致率(DOOM 上 78–92%,德军总部上 79%)及其测距误差(德军总部 ±7%;DOOM ±25–65%,并说明原因)、实测步速(每次决策 47 单位,两秒内完成校准)、校准暴露出的一个单位错误(每 1,014 次决策 150 次卡死,之后为 9 次),以及通关结果(E1M1 在第三难度通关,第五难度未通关;E1M2 未通关,死因已测量:177 点伤害中 144 点来自 15 米之外、从未进入视野的射击型敌人)。这是仿真中的研究原型。它的主张不是它玩得好;它的主张是它采取的每一个动作都能从交给它的事实中解释出来,操作员的一句话能约束它,而它的感官会报告自己的误差。

智能负责提议。运行时决定什么可以做、说明为什么,并且能被人用平常的话说"不"——而这个"不"是保证,不是偏好。

写给所有人 —— 我们想做什么,用平常的话说

问题。自己行动的机器——会开的车、会飞的无人机、会玩游戏的程序——大多因为看起来做得不错而被信任。当其中一台做错了事,没有人能指着它做决定的那一刻说:它当时被允许做什么,它选了什么,为什么。这样建立起来的信任是一种希望,不是一种检查。

VDSG 是什么。一个坐在行动者下面的裁判。每一刻它看着局面的明白事实——附近有什么、什么在视野里、还有多少生命值和弹药、出口在哪里——然后写下行动者此刻被允许做的短短一列事情。行动者只能从这列里选,别的都不行。一个人可以用说话来缩短这个列表:别开火、只用霰弹枪、原地待命。裁判从不因为一条命令而凭空发明什么;它只能拿走选项。如果一条命令无法执行——没有霰弹枪时的只用霰弹枪——它会说出来,每一刻都大声说,直到可以执行为止。

为什么用电子游戏。DOOM 和德军总部 3D 是便宜、快速、毫不留情的世界,有门、钥匙、敌人、弹药,没有怜悯。我们可以把它们跑上几千次,故意把裁判弄坏,然后测量一切。这里没有任何东西是为游戏本身:游戏是风洞。

我们想要什么。(1)证明一个没有神经网络、由裁判管着的行动者可以玩一个困难的游戏,并解释它采取的每一个动作。(2)让一个人能指挥它,并确信一条命令就是一条保证。(3)给它从世界本身学来的感官——一只眼睛,因为世界告诉它门在哪里,所以它学会了门长什么样;以及对自己速度的感觉,于是它知道东西有多远不只是以米计,也以秒计。(4)让它像人一样从卡死中恢复:朝你看得见的开阔处转身,走多远取决于那片空间有多深。(5)诚实地测量,把失败和成功并排公开。

这会走向哪里。同一个裁判,放到机器人、车辆或无人机下面:规则会变,契约不变。我们早先的工作把这个裁判放在驾驶仿真器下面;这篇论文是有了自己的感官、有一个人拿着话筒的版本。

它不是什么。不是产品,不是经过认证的系统,也不是行动者玩得好的主张。它死得很多。论文准确地说出在哪里、为什么。

1 · 引言

本组早先的两份报告研究了自主控制器之下的准入控制:在光真实仿真器中,由复合不变量构成的无状态护盾置于良性、敌意与前沿模型驾驶者之下 [1],以及它所实例化的可容许运动的形式化论述 [2]。在两者中,控制器负责提议,一个确定性的运行时决定什么可以到达执行器。那个运行时是无状态的,不变量固定,感知来自仿真器的地面真值,而且运行时没有人可以对它说话。

本文在保持契约不变的前提下逐一去掉这四个限制,并测量每一次去除的代价。结果就是 VDSG:一个运行时,它(i)从可容许集合上的固定优先级规则策略中选择目标而不是钳制一个标量;(ii)接受操作员用日常语言下达的常备指令,并把它们当作对该集合的约束;(iii)从自身证据中学习,但只在集合内部;(iv)拥有两种感官——眼睛与里程计——它针对世界校准它们而不是假设它们;(v)以方向和长度都来自这些感官的脱出动作从卡死中恢复。

我们有意选择 DOOM 与德军总部 3D 引擎作为试验台。给定种子它们是确定的,运行速度比车辆仿真器快数千倍,暴露出地面真值(物体列表、逐像素标签、深度缓冲区、扇区几何),使每一个学到的估计都能对照教师检查,而且毫不留情:一个在墙前原地转了 1,300 次决策的驾驶员会死,记录会这么写。引擎是真的——ViZDoom [3] 之下 id Software 1993 年的共享版 IWAD,以及打了探针的 ECWolf [4] 之下 1992 年的 WL6 数据——不是简化的重新实现。

贡献

  1. 带有已证明指令语义的受指挥准入契约(第 2 节):指令只收窄,学习者受收窄后的集合约束,无法满足的指令被带理由地拒绝。证明很短;这些性质正是操作员需要为真的那些。
  2. 由世界教出来的眼睛(第 3 节):一个逐列颜色统计标签器和一个图像空间测距估计器,后者唯一的常数来自光线投射的投影定律,并由引擎自己的距离学得。我们给出估计器、校准过程、ViZDoom 深度缓冲区的实测尺度,以及估计器在两个引擎上的误差——包括它表现差的情形与原因。
  3. 里程计与带定尺脱出的已校准卡死规则(第 4–5 节):从命令产生的结果测出步速与转向率;"没有向前移动"以期望位移为准;脱出的转向角来自可见的最深开阔处,长度来自实测步速。校准暴露了一个每八次决策就制造一次误判的单位错误。
  4. 在引擎自身几何上的导航与获取(第 6–7 节):由扇区数据生成的栅格,带单向台阶、门、升降台和带钥匙的门;德军总部上与引擎完全一致的门协议;以及带放弃记忆的"去拿枪"行为,第二关的死因是测出来的而不是猜的。
  5. 测量,含负面结果(第 9 节):什么通了、什么没通,以及四个必须测量而不能假设的引擎事实。

我们对范围直言不讳。这是仿真中的研究原型。其中没有任何东西经过使用鉴定,驾驶员的能力也不是主张。

2 · 契约,以及什么是一条指令

2.1 · 事实、目标与可容许集合

令 \(s_t\) 为第 \(t\) 次决策时引擎的状态,\(F(s_t)\) 为态势报告:对事实的结构化、不经神经网络的抽取——敌人及其方位、距离、是否在视野内;拾取物;生命值、护甲、弹药与手中武器;位置与朝向;最近是否被击中;身后是否有可退守的地面。\(F\) 是唯一与领域相关的阶段。其后的一切在各引擎间完全相同。

令 \(G = \{\mathrm{HEAL}, \mathrm{DODGE}, \mathrm{RETREAT}, \mathrm{ATTACK}, \mathrm{SEARCH}, \mathrm{RESUPPLY}, \mathrm{EXPLORE}\}\) 为目标集。可适用函数 \(A : F(s) \mapsto 2^{G}\) 返回当前局面下能够执行的目标:只有当目标的对象存在时它才可容许——ATTACK 需要视野内有敌人,HEAL 需要视野内有治疗品,RESUPPLY 需要雷达上有弹药或想要的武器,RETREAT 需要身后有地面。三个目标——DODGE、SEARCH、EXPLORE——总是可容许的。规则策略 \(\pi_R\) 按固定优先级(生存、其次自卫、其次交战、其次推进)从 \(A(s)\) 中选出一个目标;它没有状态,也没有任何被拟合的参数。

证据记忆 \(M\) 可以推翻 \(\pi_R\):它按从驾驶员自身过去学到的剩余回报与失败概率估计给目标排序,但只在提供给它的目标之中。最后,执行器 \(\alpha\) 把选定目标变成按键向量,引擎推进 \(k\) 个 tic(DOOM 上 \(k = 4\),35 tic/秒;德军总部上 \(k = 8\),70 tic/秒;两者都约为每秒九次决策)。

2.2 · 指令

常备指令 \(O\) 是操作员用语言施加给驾驶员的约束。我们不把它定义为文本,而是定义为其效果:从局面到目标子集的映射,加上一组按键级限制,

\[ O = (\,\Gamma_O,\; \beta_O,\; w_O\,), \qquad \Gamma_O : F(s) \mapsto 2^{G},\quad \beta_O \subseteq \mathcal{B},\quad w_O \in \{\bot\} \cup \mathcal{W}, \]

其中 \(\Gamma_O(s)\) 是指令仍然允许的目标集合,\(\beta_O\) 是指令移除的一组按键(扳机、所有移动键),\(w_O\) 是指令点名的武器或无。从文本产生 \(O\) 的解析器是一套带显式否定的固定短语词表。它不是模型:它不认识的文字会被拒绝,从不猜测。指令之下的可容许集合是

\[ A_O(s) \;=\; A(s) \cap \Gamma_O(s), \]

当交集为空时,运行时退回到 \(A(s) \setminus \{\mathrm{ATTACK}\}\):一条无法满足的指令永远不会把驾驶员推入它本来不会进入的交战。当指令的前提在 \(s\) 中成立时(例如点名的武器已携带)指令生效,否则被拒绝;两种情况下每次决策都会发出一张说明理由的回执。

命题 1(指令只收窄)。对任意局面 \(s\) 与任意指令 \(O\),\(A_O(s) \subseteq A(s)\)。在任何指令下,\(A(s)\) 之外的目标都不会被执行。
证明。按交集定义 \(A_O(s) = A(s) \cap \Gamma_O(s) \subseteq A(s)\),退回集合 \(A(s)\setminus\{\mathrm{ATTACK}\}\) 同样是 \(A(s)\) 的子集。按键级限制 \(\beta_O\) 只能清除按键;指令唯一可能设置的按键——武器 \(w_O\)——只在 \(w_O\) 已携带时设置,而这已是 \(A(s)\) 允许换武器的前提。\(\square\)
命题 2(学习者受约束)。令 \(g_t\) 为记忆 \(M\) 激活时第 \(t\) 次决策执行的目标。则对所有 \(t\),\(g_t \in A_O(s_t)\)(当 \(A_O(s_t)=\varnothing\) 时属于退回集合),无论 \(M\) 学到了什么。
证明。\(M\) 的定义域就是收窄后的集合:当它推翻时 \(g_t = \arg\max_{g \in A_O(s_t)} U_M(s_t, g)\),否则 \(g_t = \pi_R(s_t)\) 限制在 \(A_O(s_t)\) 上。两个分支中都没有定义域之外的目标进入最大化。执行器接收 \(g_t\) 后在送往引擎之前再次应用 \(\beta_O\),所以一个忘记了指令的分支仍然无法泄漏被移除的按键。\(\square\)
命题 3(拒绝是可靠且完备的)。一条指令在第 \(t\) 次决策被报告为生效,当且仅当其前提在 \(F(s_t)\) 中成立;被拒绝的指令不改变任何按键;指令在其前提首次成立的那次决策生效,无需操作员的任何动作。
证明。回执仅由 \(F(s_t)\) 计算,每次决策一次,使用的谓词与门控指令对向量作用的谓词相同,因此两者不可能不一致;被拒绝的指令既不贡献 \(\Gamma_O\),也不贡献 \(\beta_O\),也不设置 \(w_O\)。由于回执每次决策都从当前事实重新计算,满足条件在其成立的首次决策即被检测到。\(\square\)

这些不是深刻的结果。它们是让一条指令值得下达的性质。我们把它们写出来,是因为它们排除的失败模式在运行时强制执行之前全部在开发中被观察到过:被否定的武器被反向执行、逗号分隔的子句被合并成一句、无法满足的目标指令被悄悄放宽为 ATTACK——全部由一次对抗性审查抓出,如今全部由构造排除,并由逐位点回归测试钉住。

有一个推论值得说明。由于指令约束记忆(命题 2),学习不能撤销指令:一个已经学到 ATTACK 有回报的驾驶员,在操作员按住扳机时,不可能被自己的证据说服去攻击。证据记忆只在剩下的范围内排序。

3 · 眼睛:由世界教出来的感知

运行时对世界的第一证人是引擎自身的状态——物体列表、给每个渲染精灵命名的标签缓冲区、深度缓冲区、扇区几何。第二证人有两个用处:它可以对照第一证人检查,于是运行时能报告自己看得多好;而且当第一证人缺席时它是仅剩的——德军总部引擎不暴露深度缓冲区,物理平台上也会如此。

3.1 · 工作图像与颜色

渲染画面通过最近邻采样缩到 \(W \times H = 64 \times 40\),每个像素被量化到颜色桶 \(q(r,g,b) \in \{0,\dots,B-1\}\),\(B = 512\):每通道八级中的三级,级阈值非均匀地偏向暗端。这个选择是被测量逼出来的:早先每通道两位的量化器(\(B=64\))把一条有照明的 DOOM 走廊约 80% 的像素放进了同一个桶,随着更多类别开始投票,眼睛与教师的一致率跌到 28%。

3.2 · 类别模型与列标签

对每个类别 \(c \in C = \{\text{天花板},\text{地板},\text{墙},\text{门},\text{敌人},\text{拾取物}\}\),眼睛保存一张颜色桶直方图 \(H_c\),总计数 \(N_c\),以及拉普拉斯平滑的似然

\[ P(b \mid c) \;=\; \frac{H_c(b) + \alpha}{N_c + B\alpha}, \qquad \alpha = 1. \]

工作图像的第 \(x\) 列由最能解释它所占行的"物"类别贴标签,

\[ \ell(x) \;=\; \arg\max_{c \in \{\text{墙},\text{门},\text{敌人},\text{拾取物}\}} \;\sum_{j \in R(x)} \log P\big(q_{j,x} \mid c\big), \]

其中 \(R(x)\) 是该列中物的行范围(第 3.4 节),一个类别只有在 \(N_c \ge N_{\min}\) 后才能投票。置信度是最优与次优类别对数似然差 \(\Delta\) 的函数 \(1 - e^{-\Delta/\kappa}\)。标签相同的相邻列构成一张卡片:类别、主色名、方位 \(\theta = (\bar{x}/W - \tfrac12)\,\Phi\)(水平视场 \(\Phi = 90^\circ\))、置信度,以及——一旦眼睛能测距——距离。直方图超过上限后会减半,于是新关卡的光照是被学会的,而不是被争辩的。

3.3 · 教师

眼睛是被教的,不是被训练的。驾驶员游戏时,引擎为每一列提供一个类别和一个距离:在 DOOM 上,标签缓冲区说出一列之下的精灵(按类型分为敌人或拾取物),导航器的栅格说出在深度表明射线停下之前该列射线上是否有门,深度缓冲区给出距离;在德军总部上,每列一条穿过瓦片地图的射线给出第一堵墙或关着的门及其距离,雷达上的精灵在更近时覆盖它们所占的列。每次观看把该列像素加入被教类别的直方图;天花板与地板从物的上方与下方的行学得。一致率在每次观看时按被标记列中与教师相符的比例计分。

三个教师错误必须被发现并去除,每一个都靠测量:DOOM 画面底部的状态栏(640×480 下第 404–479 行,深度 0、标签 0)被当作地板教了;画在底部中央、带着玩家自身标签的驾驶员自己的武器被当作地板教了;触及顶部和底部边缘行的近墙被当作天花板和地板教了。每一个都污染了测距估计器(下文)所依赖的模型。

3.4 · 由视高测距

光线投射引擎把世界高度为 \(H_w\)、垂直距离为 \(d_\perp\) 的竖直表面画成屏幕高度 \(h\),遵循针孔投影定律,

\[ h \;=\; \frac{f\,H_w}{d_\perp} \quad\Longrightarrow\quad h\,d_\perp \;=\; f H_w \;\equiv\; k, \]

因此视高与距离之积对每一类表面是常数 \(k\),且 \(\hat d_\perp = \hat k / h\)。眼睛把 \(h\) 测为地平线周围看起来更像物、而不像上方天花板或下方地板的连续行数,带两行滞后,以免把一条暗纹理带误认为天花板。它把 \(\hat k\) 学为教师提供的样本 \(h_i \cdot d_{\perp,i}\) 的中位数,按类别、在最少样本数之后;在教师自己能测出真实范围的地方(DOOM 的深度缓冲区对每一墙列只有一个深度值,于是墙恰是具有该深度的连续行),样本使用真实高度,\(\hat k\) 对该类别成为精确值。沿列射线的欧氏距离为 \(\hat d = \hat d_\perp / \cos\theta\)。报告的误差是眼睛自己的估计相对教师距离的相对误差中位数 \(\varepsilon = \operatorname{median}\, |\hat d_\perp - d_\perp| / d_\perp\),它与一致率并排显示在控制台上。

在德军总部上每堵墙都是一格(64 单位)高;320×200 的渲染缩到 40 行时,定律预测 \(k = 32\) 行·格。眼睛学到 \(\hat k = 33\)。

3.5 · 深度缓冲区的尺度,实测

ViZDoom 的深度缓冲区是一幅 8 位图像,其与距离的关系并未为测量目的编入文档。我们对照地图自身的几何来校准它:对某一列,沿该列射线上最近的任何种类的线必须是单面墙——这样就不会有双面的东西(台阶、窗、抬高的地板)夹在中间——然后把地平线行上的深度对该墙的垂直距离做回归。在 E1M1、640×480 下的 1,336 个这样的列上,

\[ \text{depth} \;=\; 0.1309\, d_\perp \;-\; 1.04 \quad (\text{墙;残差中位数 } 0.9 \text{ 级}), \]
\[ \text{depth} \;=\; 0.1360\, d_\perp \;-\; 0.82 \quad (\text{精灵;} 367 \text{ 个样本;残差中位数 } 0.2), \]

即墙每级 7.64 地图单位、精灵 7.35,在 255 处饱和(约 61 米)。这与渲染器源码一致:墙的深度由列的逆尺度导出、精灵的深度由精灵的逆尺度导出,常数不同。线性关系是对垂直距离而非欧氏距离的——这正是逐列缩放的渲染器所产生的,也正是眼睛的投影定律所需要的。

3.6 · 两个证人

凡是引擎提供深度的地方,驾驶员的卡片以引擎的距离为第一证人,把眼睛自己的估计放在旁边("眼睛估计 3.8 米");引擎不提供的地方,眼睛的估计就是驾驶员所有的一切。为脱出定尺的距离剖面(第 5 节)遵循同一规则。因此眼睛从不推翻地图:它是第二证人,其分歧是操作员可以读到的一个数字。

3.7 · 结果

量DOOM E1M1德军总部 MAP01说明
与教师的一致率78–92%79%120 秒运行;四个类别投票
测距常数 \(\hat k\) 与理论值4,166–7,753(变动)33 对 32DOOM 扇区高度各异;德军总部墙高单一
自行测距误差 \(\varepsilon\)±25–65%±7%DOOM:暗调色板下远处地板与墙颜色相同
一次观看的开销中位 18 毫秒中位 15 毫秒每两次决策一次

两个负面发现是结构性的,不是调参问题。第一,在 DOOM 上墙高 \(H_w\) 随扇区变化(72、128、256 单位的房间),因此 \(k\) 不是一个常数,中位数只是典型的墙;建立在投影定律上的估计器若不知道某列属于哪个扇区就无法做得更好——而地图知道,这正是地图作为第一证人的原因。第二,在 DOOM 的暗调色板里,远处的地板与墙落入相同的颜色桶,仅凭颜色的边缘扫描找不到远墙的底部。眼睛的数字如实说明这一点;我们没有把它调没。

4 · 里程计:实测的步速

距离只有配上步速才对驾驶员有用。运行时不假设引擎的运动常数,而是从每条命令产生的结果中测出它们。令 \(u_t \in [-1,1]\) 为第 \(t\) 次决策发出的前进命令,\(\sigma_t\) 为侧移命令,\(\Delta x_t = \lVert x_{t+1} - x_t \rVert\) 为它产生的位移。干净样本指 \(|u_t| \ge \tfrac12\) 且 \(\sigma_t = 0\) 的样本。步速是近期窗口内归一化干净样本的第 80 百分位,

\[ \hat p \;=\; Q_{0.8}\!\left\{ \frac{\Delta x_t}{|u_t|} \;:\; t \text{ 为干净样本} \right\}, \]

取百分位而非均值,是因为撞墙或贴墙滑行时采到的样本接近零,不能拉低对驾驶员畅行时速度的估计。转向增益以同样方式从转向命令下的朝向变化测得。于是一条命令的期望位移为 \(E_t = \hat p\,|u_t|\),到任意距离 \(d\) 的时间为 \(\text{ETA}(d) = (d/\hat p)\,\Delta t\),\(\Delta t\) 为决策周期。

实测:DOOM 全速前进时每次决策 47 地图单位——按引擎每米 32 单位的约定为 12.8 米/秒——八个干净样本后估计即稳定,约两秒;德军总部每次决策 0.7 格。此后眼睛产生的每张卡片都带上了时间:门 · 灰 · 右 12° · 4.2 米 · 0.4 秒可达。

5 · 卡死规则:已校准、已定尺

一条约束每个会移动的目标的规则:驾驶员没有向前移动就转身;同样的移动反复出现也是卡死,它脱出而不是重新规划回循环里。它是在被测出缺失之后设立的:在 E1M1 一堵墙前连续转了 1,300 次决策;在 E1M2 7% 的区域里绕圈直到 686 秒超时。

5.1 · 两条规则

规则 1(没有向前移动)。令 \(m_t = \lVert x_t - x_{t-1} \rVert\)。当 \(m_t < \tau_t\) 时驾驶员在第 \(t\) 次决策静止;当它在要求移动的情况下连续 \(n_1\) 次决策静止时即为卡死。未校准时 \(\tau_t = \tau_0\) 是一条固定线。由里程计校准后,

\[ \tau_t \;=\; \max\!\big(\tau_0,\; a\,E_{t-1}\big), \qquad E_{t-1} = \hat p\,|u_{t-1}|,\; a = 0.3, \]

于是一条本应移动 47 单位却只移动了 8 单位的命令被判为静止,不管固定的 5 单位线怎么说。驾驶员选择不移动的决策(为射击而原地不动)不计入:那不是卡死。

规则 2(同样的移动反复出现)。在 \(n_2\) 次决策的窗口内净位移 \(\lVert x_t - x_{t-n_2} \rVert < \delta\)。这有意采用净位移而不是"同一动作重复":沿走廊直走每次决策都重复同一动作,那恰恰是卡死的反面。循环是哪儿也去不了的移动。

阈值使用引擎自身的单位。这句话是付出代价换来的:德军总部赛道用 DOOM 的常数跑了一天——以每次决策五格作为"移动"的界线——记录了 1,014 次决策中 150 次卡死,每八次一次,因为没有哪个德军总部驾驶员每次决策能走五格。换成格:9 次。校准工作找到了它,这正是校准的用处。

5.2 · 脱出

任一规则触发时,导航器把它试图进入的格子学为阻塞,忘掉路线,并承诺一次脱出:转身,然后走出,然后重新规划。脱出曾经是固定的——约 96° 与七次决策,左右交替。现在它按眼睛所见与驾驶员的速度定尺。令 \(\beta^\ast\) 为眼睛距离剖面(逐列欧氏深度,五列平滑)中最深开阔处的方位,\(d^\ast\) 为该深度。若 \(|\beta^\ast| \ge \beta_{\text{ahead}}\),转向角及其时长为

\[ \theta = \operatorname{clip}\!\big(|\beta^\ast|,\, \theta_{\min},\, \theta_{\max}\big), \qquad n_{\text{pivot}} = \Big\lceil \frac{\theta}{\omega\, g} \Big\rceil, \]

其中 \(\omega\) 为引擎每次决策的全速转向率,\(g\) 为实测转向增益,走出的长度为

\[ n_{\text{walk}} = \operatorname{clip}\!\left( \Big\lceil \frac{\operatorname{clip}(\tfrac12 d^\ast,\, d_{\min},\, d_{\max})}{\hat p} \Big\rceil,\; n_{\min},\; n_{\max} \right), \]

即以实测步速走出所见深度的一半。若最深处就在正前方(\(|\beta^\ast| < \beta_{\text{ahead}}\}\))而驾驶员却动不了,那么挡住它的是眼睛看不见的东西——一道台阶、一具尸体——于是像以前一样左右交替。每一次脱出都在控制台上陈述理由:"最深开阔处在右 42°(14.7 米)——右转 45°(1 次决策),走出 5 次决策"。常数(\(\theta_{\min}=45^\circ\)、\(\theta_{\max}=150^\circ\)、\(n_{\min}=3\)、\(n_{\max}=20\))限定脱出的范围;范围之内的方向与长度是世界给的。

6 · 在引擎自身几何上的导航

训练竞技场不需要导航;关卡需要。运行时把引擎的扇区几何栅格化为占据栅格(DOOM 上 16 单位一格),并在其上做广度优先搜索规划。栅格知道什么,每个事实来自哪里:

规划优先级为:想要的拾取物、出口、出口需要的钥匙、最近的未访问格,然后是覆盖圈。控制台上的每一个决定都是关于此的一句话:去出口开关、在黄门前而没有黄钥匙、捡到了红钥匙。

在德军总部上地图是 64×64 的瓦片栅格,门协议必须做到与引擎完全一致。引擎的 USE 恰好作用于一格——玩家所在格在面向基本方向上的相邻格——并且会切换门的状态:对一扇正在打开的门按 USE 会让它反向。一个顶着半开的门、每 0.7 秒按一次 USE 的驾驶员,于是一直在关上它想打开的门。此前实测:1,275 次决策中 583 次耗在门前,在其中一扇门处来回摆动九格。现在 USE 只在面向的相邻格是关着的门时按一次,在门打开过程中不按:下一次运行中 1,184 次决策中 371 次在门前。

7 · 想要一把枪,以及驾驶员是怎么死的

DOOM 第二关每次尝试都杀死了驾驶员,记录说明了原因:它曾从链枪 8.8 米、霰弹枪 16.7 米处走过,两者都从未进入视野——在隔断后面、在台座上——最后拿着手枪在十六次击杀后死去。现在,雷达知道的枪在它能射击(武器槽三及以上)、未被携带且在触及范围内时被列为想要:想要集合 \(\mathcal{W}(s)\) 按最近优先排列,RESUPPLY 随之可容许并在栅格上规划前往。地图无法规划到达的、在 150 次决策的耐心内未到达的、或驾驶员在旁边站了 20 次决策仍未拿到的拾取物,被记为不可达,该局内不再想要。耐心按每个拾取物计数,并且能挺过打断——中途一场战斗不会把它归零——因为第一版在每次 ATTACK 时归零,每次尝试花 281–514 次决策想要一把拿不到的链枪。

之后:每次尝试都在 10–20 秒拿到霰弹枪,每次尝试都持有出口需要的红钥匙,驾驶员仍在 112–207 秒死亡,16–18 次击杀。我们测量了死亡而不是猜测。在一次完整尝试的 177 点伤害中,全部来自 Zombieman;其中 144 点来自 15 米之外;每一次被击中时射手都不在视野内,目标都是 SEARCH——朝最近的雷达敌人转身,而它站在一堵墙后面,与此同时 30 米外另一方向的一个 Zombieman 在开枪。由此产生两条规则。SEARCH 现在朝最可能负责的敌人(面对驾驶员、在射程内)转身,而不是最近的;这是对错误的纠正,予以保留。第二条——受伤且身后有地面时被看不见的东西击中的驾驶员,先 RETREAT 切断视线再搜索——是一个假设,而它测出来更差:三次尝试平均存活 123 秒(112、125、133),而此前四次为 187 秒(167–207)。它被撤销了,记录保留这个数字。在这样的样本量下方差很大;诚实的说法是,切断视线本身在这一关上不是一条生存规则,那里的生存问题仍未解决。

8 · 无神经网络的学习

契约内部有两个学习者,都受命题 2 约束。第一个是街机工作 [5] 中的证据记忆:按局面签名与目标,一个剩余回报估计与一个失败率,以规则策略为先验,可以在陈述原因后推翻它。在训练竞技场上结果是持平而非胜出——32 个种子上平均回报随机 3.2、规则 17.9、规则加记忆 20.3,配对 \(t = 0.78\)——我们就这样保留这个数字。第二个是类型化证据瓦片的轨迹,每个遭遇一张(在一个局面下以一个目标的连续片段,而不是每帧一张——那曾产生 79,000 张比率全部接近零的卡片),从中通过对局面的抽象拓宽出"此目标在……时有害"形式的规则,只有当其有害率以一定裕度超过基础率时才被接纳。六条这样的规则中有四条在留出的局次上复现。轨迹及其接纳门的机制见 Peel 报告 [6];本文只是使用它。

有一个归因缺陷值得记录,因为它颠倒了一个标题数字。引擎的击杀计数器是地图的:它把互相残杀的怪物也算进去。一个被命令永不开火的驾驶员——已核实,八局零次扳机——仍被记了 55 次击杀。在同样的种子上分解:不开火只移动占了回报的大部分,射击再多一点,在噪声之内。规则"五倍于随机"主要是运动。控制台的标题计数器是造成的伤害与命中数,驾驶员不开火时它们恰为零。

9 · 实测

项目实测出处
随机 / 规则 / 规则 + 记忆32 个种子上回报 3.2 / 17.9 / 20.3 —— 持平(配对 \(t = 0.78\))Freedoom 竞技场
击杀归因永不开火的驾驶员被记 55 次击杀;造成的伤害才是诚实的数字缺陷,已公开
E1M1,第三难度通关:52 秒到出口开关,4 次击杀DOOM1.WAD
E1M1,第五难度(Nightmare)8 次尝试未通关;23–37 秒死亡DOOM1.WAD
E1M2,第三难度10–20 秒拿到霰弹枪,持有红钥匙;112–207 秒死亡,16–18 次击杀;177 点伤害中 144 点来自 15 米外看不见的射击型敌人DOOM1.WAD
深度缓冲区尺度墙每级 7.64 单位,精灵 7.35;1,336 + 367 个样本;残差 0.9 / 0.2 级ViZDoom 1.3,640×480
眼睛一致率78–92%(DOOM),79%(德军总部)120 秒运行
眼睛测距±7%(德军总部,\(\hat k = 33\) 对 32);±25–65%(DOOM,自行估计)120 秒运行
步速每次决策 47 单位 = 12.8 米/秒(DOOM);0.7 格(德军总部);8 个样本后稳定里程计
单位错误的卡死规则每约 1,000 次决策 150 → 9 次德军总部 MAP01
德军总部的门583/1,275 → 371/1,184 次决策在门前;只按一次、门关着时、按在引擎的那一格MAP01
德军总部进展150 秒内到电梯的路线从 126 格缩短到 25 格;尚未到达电梯;3 次死亡(重生)MAP01

每个数字都在录制公开回放的同一台机器上自行测得;负面结果一并列出。尝试次数很小(四到八次),并如实报告;除了 32 种子的竞技场结果(一个零结果)之外,这里没有任何统计功效充足的比较。

10 · 我们学到了什么

  1. 测量引擎;不要假设它。深度缓冲区的尺度、USE 作用的那一格、门的切换、地图的击杀计数器、阈值的单位——每一个都曾被假设过、后来被测量过,每一个假设都在记录里留下了代价。奏效的方法始终一样:找到引擎答案毋庸置疑的情形(中间空无一物的单面墙),大量收集,回归,保留残差。
  2. 第一证人是精确的;第二证人在学习。有地面真值的地方,运行时使用它,并把学到的估计连同其误差放在旁边。没有的地方,学到的估计就是全部,而它的误差在能测的地方都测了。这是把一种学习得来的感官引入一个必须自我解释的运行时的诚实方式。
  3. 只能收窄的指令是通向学习者的安全接口。命题 2 只有一行,而正是这一行让操作员能信任一个会学习的系统。
  4. 校准会找到 bug。阈值是常数时单位错误看不见;阈值变成实测步速的一个比例的那一刻,它变得显而易见。
  5. 耐心必须挺过打断。任何在上下文切换时归零的放弃计数器都不是放弃计数器。
  6. 规则主要是运动。规则驾驶员超过随机的回报大部分来自"动起来"本身;记忆的贡献在这个规模下处于噪声之内。照实说。
  7. 单靠规避失败学不会耦合的目标。街机发现 [5]——同一机制在一个游戏上获益、在风险与目标耦合的另一个游戏上受损——在这里同样是开放问题。驾驶员必须通过战斗才能推进的 DOOM 第二关,正是测量它的地方。
  8. 公开死亡。只有把失败写进去的记录,操作员才用得上。

11 · 边界与下一步

驾驶员没有通过 DOOM 第二关,在第五难度也没有通过第一关。出于前述两个结构性原因,它在 DOOM 上的自行测距很差。它没有垂直视场,除了它走进来时的轨迹之外没有掩体的概念。德军总部驾驶员尚未到达电梯,在协议修正之后仍有三分之一的决策耗在门前,这说明剩下的代价在别处且尚未测量。指令词表被有意设计得固定而小;这既是要点,也是限制。所有这些都未经使用鉴定。

下一步:以测量死亡的方式测量第二关的生存;电梯;把同一运行时放到物理平台之下,那里眼睛是唯一的证人、里程计就是车轮报告的东西;以及耦合目标问题——这里的任何工程都没有推动它。

12 · 相关工作

运行时保障。Simplex 架构 [7] 与面向学习控制器的护盾 [8] 把一个经过验证的组件放在高性能组件旁边或下面。VDSG 的不同在于它位于规划器之前(规划器从未看到完整的动作空间),在于它在目标之间选择而不是钳制一个控制量,以及在于它把操作员的约束作为具有已证明语义的一等输入接受。确定性游戏智能体。面向目标的动作规划 [9] 与行为树给游戏智能体提供了可解释的结构;VDSG 的规则策略更接近固定优先级选择器,它的新意不在选择器本身,而在它周围的东西——可容许集合、指令、受约束的学习者与被教出来的感官。学习型 Doom 智能体。ViZDoom [3] 承载了十年的强化学习智能体,以及最近被交予结构化状态的语言模型驾驶员;VDSG 使用同一状态契约,但不用神经网络,并配有能解释、能被指挥的运行时。颜色统计感知。基于颜色直方图的逐列分类是有意选择的能奏效的最小方案;它在此处的角色是可检查的第二证人,而不是作为记录的视觉系统。引擎。DOOM 与德军总部 3D 的渲染器在 [10, 11] 中有详尽描述;它们的投影定律正是第 3.4 节所用。

13 · 结论

VDSG 是一个运行时,不是一个玩家。它根据事实上的规则决定智能体可以做什么;它可以用语言收窄,而收窄是一种保证;它只在被允许的范围内学习;它通过针对世界校准、并报告自身误差的感官来感知。在两个毫不留情的引擎上掌舵测量,它通过了一关、死在下一关,而记录准确地说出了在哪里、为什么,以及哪些本该测量却被假设了的东西。那份记录——而不是分数——才是产品。

参考文献

  1. Perslis Research. Runtime Admission Control on a Photoreal Driving Simulator: Hostile and Frontier-Model Controllers Under One Verification Floor. 2026. research.perslis.com/carla-admission.html
  2. Perslis Research. Admissible Motion. 2026. research.perslis.com/motion.html
  3. M. Kempka, M. Wydmuch, G. Runc, J. Toczek, W. Jaśkowski. ViZDoom: A Doom-based AI Research Platform for Visual Reinforcement Learning. IEEE Conference on Computational Intelligence and Games, 2016.
  4. ECWolf,德军总部 3D 的源码移植(GPL)。maniacsvault.net/ecwolf
  5. Perslis Research. The Arcade Floor: symbolic failure memory on real Atari ROMs(Space Invaders +32%,Freeway −12%,代码相同)。2026. perslis.com/defense/evidence
  6. Perslis Research. Peel: a typed evidence floor with a functional hard veto. 2026. research.perslis.com/peel.html
  7. L. Sha. Using Simplicity to Control Complexity. IEEE Software 18(4), 2001.
  8. M. Alshiekh, R. Bloem, R. Ehlers, B. Könighofer, S. Niekum, U. Topcu. Safe Reinforcement Learning via Shielding. AAAI, 2018.
  9. J. Orkin. Three States and a Plan: The A.I. of F.E.A.R. Game Developers Conference, 2006.
  10. F. Sanglard. Game Engine Black Book: Wolfenstein 3D. 2017.
  11. F. Sanglard. Game Engine Black Book: DOOM. 2018.

如何引用

@techreport{perslis2026vdsg,
  title       = {VDSG: A Commanded Admission-Control Runtime for Autonomous Agents},
  author      = {{Perslis Research}},
  institution = {Perslis Research},
  year        = {2026},
  month       = {9},
  note        = {Systems paper with measurements; research prototype (simulation).},
  url         = {https://research.perslis.com/vdsg.html}
}