Files
mcm-26-b/docs/总体思路与流程图.md
T
2026-09-13 10:27:09 +08:00

179 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 总体思路与流程图
> 插图:[`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 成功<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/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)。