# 总体思路与流程图 > 插图:[`figures/flow-overall-architecture.png`](figures/flow-overall-architecture.png)(总体思路与算法主线)、 > [`figures/steps-state-machine.png`](figures/steps-state-machine.png)(执行步骤)、 > [`figures/timing-attachment-example-105-111-194-199.png`](figures/timing-attachment-example-105-111-194-199.png)(附件计时示例)。 > 复现:`uv run python scripts/build_figure_data.py --only flow-overall-architecture,steps-state-machine,timing-attachment-example-105-111-194-199` 本文给出四问的思路、端到端流程图、执行步骤与执行时间。 算法细节指向 [`algo-1.md`](algo-1.md)~[`algo-4.md`](algo-4.md), 协议细节指向 [`协议规则表与状态机.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 | ![总体思路与算法主线](figures/flow-overall-architecture.png) --- ## 2. 四层结构 | 层 | 内容 | 作用 | | --- | --- | --- | | L0 题面抽象 | Ω 半径 1800 m;移动 5 m/s、检测 5 s、换频 1 s、清除 5 s / 3 s;观测 `direction/no_signal/near`;源 10~16 个,频道 1~20,定向源覆盖 ±90° | 后续推导只用这些量,不引入题面之外的信息 | | L1 在线三层 | 证据层(候选集与粒子)、决策层(选点与任务表)、执行层(串行客户端) | 依赖单向向下,几何结论与调度启发式可分别测试 | | L2 四问 | Q1 定位解算 → Q2 第二点选择 → Q3 全向搜索 → Q4 混合定向 | 后一问复用前一问的内核 | | L3 三条闭环 | 发现、定位、清除 | 每环有明确的进入与退出条件 | L0 的常量集中在 `src/mcm26b/config.py`,带 `[题面]` / `[工程]` 标注。 证据层只给出「可能在哪里」,决策层只读证据并产出动作, 执行层负责发送动作并维护虚拟时钟。 --- ## 3. 四问思路 ### 问题一 1. 检测点 $s_i$ 与示向度 $\theta_i$ 给出前向角域 $W_i=\{p:\angle(p-s_i)-\theta_i\in[-1°,+1°]\}$,定位区域是半平面交 $P=\bigcap_i W_i$; 2. 直径 $D(P)=\max_{i,j}\lVert v_i-v_j\rVert$ 只需枚举顶点对(凸集上最远点必为顶点); 3. 直径圆能否覆盖 $P$:唯一候选圆心是最远顶点对的中点。若 $a,b$ 同在该圆内, 三角不等式两处同时取等,圆心只能是 $ab$ 中点,因此只需在该点检查全部顶点; 4. 能否保证清除:最小包围圆半径 $\rho\le20$ m 时,停在 MEC 圆心即可清除。 这是充分条件,不是必要条件。 结论:直径圆不一定覆盖定位区域,见 [`geo-q1-counterexample.png`](figures/geo-q1-diameter-circle-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`](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`](algo-4.md)。 --- ## 4. 端到端流程 ```mermaid flowchart TD S([开始:/enter 成功
现实预算 1200 s 起算]) --> P0[读配置 ProblemConfig] P0 --> PLAN{按问题选择覆盖计划} PLAN -->|问题 3| S7[七点全向计划
解析上界 984.54 m] PLAN -->|问题 4| S31[31 点最小命中集
forward_half_disk 证书] S7 --> LOOP S31 --> LOOP subgraph LOOP[主循环:动作回合] direction TB NEXT[选下一个任务
信息增益 / 最坏后验半径
滚动 2-opt 排序] --> SEND[/发送动作/] SEND --> RESP{accepted?} RESP -->|false| FIX[不更新状态
记录并重排任务] RESP -->|true| CLK[更新虚拟时钟、位置、频道] FIX --> NEXT CLK --> OBS{观测类型} OBS -->|direction| HIT[登记新源
同频道安排第二点交会] OBS -->|no_signal| NEG[负观测裁剪
位置候选或朝向档] 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/steps-state-machine.png), 逐步计时示例见 [`figures/timing-attachment-example-105-111-194-199.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`](figures/timing-measured-q3-10-sources.png), 定向局(`GM56-…`,虚拟 8703.766 s,现实 3.397 s)与复现命令见 [`执行时间与执行步骤.md`](执行时间与执行步骤.md)。 --- ## 6. 交付物与验收锚点 | 问 | 算法文档 | 主要实现 | 锚点 | | --- | --- | --- | --- | | 1 | [`algo-1.md`](algo-1.md)、[`问题一解答.md`](问题一解答.md) | `src/mcm26b/geometry/` | 演练复算 $D=23.9967$ m、$\rho=12.0686$ m、$E=+0.6040$ m | | 2 | [`algo-2.md`](algo-2.md) | `geometry/`、`belief/`、`planner/` | 安全盘半径 249.8858 m | | 3 | [`algo-3.md`](algo-3.md)、[`algo-3-bayes.md`](algo-3-bayes.md) | `planner/bayes_loop.py`、`planner/seven.py` | 七点上界 984.5391 m < 1000 m | | 4 | [`algo-4.md`](algo-4.md) | `planner/directional.py`、`belief/joint.py` | 证书缺口 0,最坏命中 990.05 m | | 1–4 | [`最优与基线实现对比.md`](最优与基线实现对比.md) | `project/` | `uv run python -m project.run` | 优化过程与未采用的改动见 [`第三四问架构优化与运行提速方案.md`](第三四问架构优化与运行提速方案.md)、 [`第三四问图论与动态规划优化方案.md`](第三四问图论与动态规划优化方案.md)。