8.8 KiB
总体思路与流程图
插图:
figures/flow-overall-architecture.png(总体思路与算法主线)、figures/steps-state-machine.png(执行步骤)、figures/timing-attachment-example-105-111-194-199.png(附件计时示例)。 复现:uv run python scripts/make_figures.py --only flow-overall-architecture,steps-state-machine,timing-attachment-example-105-111-194-199
本文给出四问的思路、端到端流程图、执行步骤与执行时间。
算法细节指向 algo-1.md~algo-4.md,
协议细节指向 协议规则表与状态机.md。
1. 主线
把题面约束写成可计算的几何集合和计时账本,四问共用一套「证据 — 决策 — 执行」结构, 每问都给出可验证的保证:
| 问 | 保证 |
|---|---|
| 1 | 直径由顶点对枚举给出;最小包围圆半径 \rho\le20 m 时存在可保证清除的点 |
| 2 | 第二检测点取在解析安全盘 $B(c,1000-a)$(半径 249.8858 m)内,必然收到信号 |
| 3 | 七点计划覆盖整个 Ω(解析上界 984.5391 m < 1000 m),据此可判定频道无源 |
| 4 | 31 点最小命中集在 15 m / 72 朝向档证书下缺口为 0 |
2. 四层结构
| 层 | 内容 | 作用 |
|---|---|---|
| L0 题面抽象 | Ω 半径 1800 m;移动 5 m/s、检测 5 s、换频 1 s、清除 5 s / 3 s;观测 direction/no_signal/near;源 10 |
后续推导只用这些量,不引入题面之外的信息 |
| L1 在线三层 | 证据层(候选集与粒子)、决策层(选点与任务表)、执行层(串行客户端) | 依赖单向向下,几何结论与调度启发式可分别测试 |
| L2 四问 | Q1 定位解算 → Q2 第二点选择 → Q3 全向搜索 → Q4 混合定向 | 后一问复用前一问的内核 |
| L3 三条闭环 | 发现、定位、清除 | 每环有明确的进入与退出条件 |
L0 的常量集中在 src/mcm26b/config.py,带 [题面] / [工程] 标注。
证据层只给出「可能在哪里」,决策层只读证据并产出动作,
执行层负责发送动作并维护虚拟时钟。
3. 四问思路
问题一
- 检测点
s_i与示向度\theta_i给出前向角域 $W_i={p:\angle(p-s_i)-\theta_i\in[-1°,+1°]}$,定位区域是半平面交 $P=\bigcap_i W_i$; - 直径
D(P)=\max_{i,j}\lVert v_i-v_j\rVert只需枚举顶点对(凸集上最远点必为顶点); - 直径圆能否覆盖 $P$:唯一候选圆心是最远顶点对的中点。若
a,b同在该圆内, 三角不等式两处同时取等,圆心只能是ab中点,因此只需在该点检查全部顶点; - 能否保证清除:最小包围圆半径
\rho\le20m 时,停在 MEC 圆心即可清除。 这是充分条件,不是必要条件。
结论:直径圆不一定覆盖定位区域,见 geo-q1-counterexample.png;
官方演练案例是「覆盖失败但 \rho=12.07 m \le20 m,可保证清除」。
问题二
候选集 $K_1=\Omega\cap W(s_1,\theta_1\pm\delta)\cap B(s_1,1500)$。
截断角域(扇形)的最小包围圆为 $B(c,a)$,a=R_{\max}/(2\cos\delta)=750.1142 m,
故安全盘 B(c,1000-a) 的半径为 249.8858 m,盘内任一点到扇形内任一点的距离
不超过 1000 m,即必然收到信号。在该盘内以最坏保守后验包围半径为主目标选点,
移动与检测成本作次目标,交会角只用于同分筛选。详见 algo-2.md。
问题三
发现保证用七点计划(原点 + 半径 a=1159.7 m 的六等分环):解析上界
D(a)=\max\{a/\sqrt3,\ \sqrt{R^2+a^2-\sqrt3Ra}\}=984.5391 m < 1000 m,
Ω 内任意位置的源都在某站点 1000 m 内。证据层按频道维护候选集与粒子幸存集,
负观测按 full_disk 语义排除 1000 m 圆盘;决策层用信息增益选点,
任务表包含检测、定位、清除三类任务,排序为开放路径问题;
所有频道销账即完成证明成立,立即 /exit。
问题四
定向源只向朝向 ±90° 的前向半球辐射,覆盖语义改为 forward_half_disk。
七点在该语义下有缺口,改用离线贪心得到的 31 点最小命中集(设计半径 965 m,
前向角裕量 5°),并以 15 m / 72 朝向档的运行期证书校核(325.62 万个采样格,缺口 0,
最坏命中 990.05 m)。负观测只约束朝向,因此维护位置 × 朝向联合信念,
信念坍缩到有限格时使用后备盲清。详见 algo-4.md。
4. 端到端流程
flowchart TD
S([开始:/enter 成功<br/>现实预算 1200 s 起算]) --> P0[读配置 ProblemConfig]
P0 --> PLAN{按问题选择覆盖计划}
PLAN -->|问题 3| S7[七点全向计划<br/>解析上界 984.54 m]
PLAN -->|问题 4| S31[31 点最小命中集<br/>forward_half_disk 证书]
S7 --> LOOP
S31 --> LOOP
subgraph LOOP[主循环:动作回合]
direction TB
NEXT[选下一个任务<br/>信息增益 / 最坏后验半径<br/>滚动 2-opt 排序] --> SEND[/发送动作/]
SEND --> RESP{accepted?}
RESP -->|false| FIX[不更新状态<br/>记录并重排任务]
RESP -->|true| CLK[更新虚拟时钟、位置、频道]
FIX --> NEXT
CLK --> OBS{观测类型}
OBS -->|direction| HIT[登记新源<br/>同频道安排第二点交会]
OBS -->|no_signal| NEG[负观测裁剪<br/>位置候选或朝向档]
OBS -->|near| SKIP[距离过近,换点重测]
HIT --> DONE{该频道 ρ ≤ 20 m?}
NEG --> DONE
SKIP --> DONE
DONE -->|是| CLR[/清除动作/]
DONE -->|否| NEXT
CLR --> LEDGER[覆盖账本销账]
LEDGER --> FIN{全部频道销账?}
FIN -->|否| NEXT
end
FIN -->|是| EXITQ[完成证明成立,立即 /exit]
EXITQ --> REP[日志复算与统计]
REP --> END([结束:虚拟时间即成绩])
classDef main fill:#dce6f1,stroke:#1f4e79,color:#1c2430
classDef acc fill:#f6dcd8,stroke:#b03a2e,color:#1c2430
classDef ok fill:#d8ece5,stroke:#1e7a5f,color:#1c2430
class NEXT,SEND,RESP,CLK,OBS main
class CLR,FIN,EXITQ acc
class LEDGER,REP ok
会话状态机与单次动作回合见 figures/steps-state-machine.png,
逐步计时示例见 figures/timing-attachment-example-105-111-194-199.png。
5. 执行步骤与执行时间
一次动作回合:本地预校验 → 发送 → 等响应计时 → 按响应更新状态。
异常时同 request_id 同内容重发,400 与 409 立即失败。
| 动作 | 虚拟耗时 | 说明 |
|---|---|---|
/enter、/exit |
0 s | 不改变虚拟时刻,/exit 不切频道 |
| 移动 | 直线距离 / 5 m·s⁻¹ | 同点不动为 0 s |
| 换测向频道 | 1 s | 仅 /measure 触发,/clear 不切换 |
检测 /measure |
5 s | 与返回结果无关 |
清除 /clear |
5 s / 3 s | 成功 5 s,未发现 3 s |
实测样例(评测机日志 BBM9-HZG2-77N5-NKKC,问题三演练,10 源全清):
| 项 | 数值 |
|---|---|
| 总虚拟时间 | 3134.643 s |
| 移动(里程 11.9 km) | 2379.6 s |
| 检测与清除动作(119 + 10 次) | 645.0 s |
| 换频(110 次) | 110.0 s |
| 现实耗时 | 1.889 s |
三项之和等于响应中的 virtual_time_s,与 evaluation.recompute_virtual_time 口径一致。
分解图见 figures/timing-measured-q3-10-sources.png,
定向局(GM56-…,虚拟 8703.766 s,现实 3.397 s)与复现命令见
执行时间与执行步骤.md。
6. 交付物与验收锚点
| 问 | 算法文档 | 主要实现 | 锚点 |
|---|---|---|---|
| 1 | algo-1.md、问题一解答.md |
src/mcm26b/geometry/ |
演练复算 D=23.9967 m、\rho=12.0686 m、E=+0.6040 m |
| 2 | algo-2.md |
geometry/、belief/、planner/ |
安全盘半径 249.8858 m |
| 3 | algo-3.md、algo-3-bayes.md |
planner/bayes_loop.py、planner/seven.py |
七点上界 984.5391 m < 1000 m |
| 4 | algo-4.md |
planner/directional.py、belief/joint.py |
证书缺口 0,最坏命中 990.05 m |
| 1–4 | 最优与基线实现对比.md |
project/ |
uv run python -m project.run |
优化过程与未采用的改动见
第三四问架构优化与运行提速方案.md、
第三四问图论与动态规划优化方案.md。
