179 lines
8.8 KiB
Markdown
179 lines
8.8 KiB
Markdown
# 总体思路与流程图
|
||
|
||
> 插图:[`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 |
|
||
|
||

|
||
|
||
---
|
||
|
||
## 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)。
|