Files
mcm-26-b/project/README.md
T
2026-09-12 16:58:25 +08:00

125 lines
7.7 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.
# 1-4 问「最优实现 / 基线实现」对比框架
本目录**不是**比赛运行时代码,而是把四问的生产实现与独立基线放在同一口径下
配对对比、生成可写进论文的"算法对比"证据。运行时代码仍只有 `src/mcm26b`,
`project/` 只依赖它和测试侧内存回环,不反向污染求解入口。
## 1. 设计原则
| 角色 | 含义 | 约束 |
| --- | --- | --- |
| **最优实现** | 复用 `src/mcm26b` 中已由测试固化的生产实现 | 不复制算法,只做 I/O 适配 |
| **基线实现** | 同题下更朴素、但能独立跑通的对照 | 不得共享最优实现的关键步骤 |
| **独立参考** | 与分析算法正交的数值/枚举标准 | 用于判定谁对谁错,而非自证 |
- 第三、四问走 `LocalSimulator` 内存回环,与官方 HTTP 协议同一边界;
真值只在评测机侧,策略端只看响应,因此"全清率/缺席误判"是可信的。
- 闭环有效性判定沿用项目口径:**全清 ∧ 无缺席误判 ∧ 正常 `/exit` ∧ 零异常
∧ 逐微秒计时复算一致**,任何一项不满足该局记为无效,失败不静默丢样本。
- 所有对比都按 `scene_id` 配对,汇总同时给均值、中位、最大与相对基线的
配对变化,避免"均值好看但逐局更差"。
## 2. 目录结构与职责
```text
project/
├── README.md 本文件
├── common.py 公共层:方法描述、指标聚合、结果落盘、闭环装配
├── run.py 统一入口:一次跑完四问并生成 results/
├── results/ 自动生成:q1.md/json … q4.md/json + summary.md
├── q1/ 问题一:交会定位区域直径与直径圆覆盖
│ ├── optimal.py 最优:半平面交 + 顶点对精确直径 + Welzl MEC + 覆盖反例
│ ├── baseline.py 基线:网格采样 + 轴对齐包围盒对角线代理
│ ├── reference.py 参考:大框 Sutherland–Hodgman 半平面裁剪 + 精确直径/MEC
│ ├── cases.py 固定示例(examples/q1)+ 随机交会算例
│ └── compare.py 同案配对:状态/直径/覆盖/耗时
├── q2/ 问题二:第二检测点选择
│ ├── optimal.py 最优:保证接收盘内最小最坏后验半径(生产选点器)
│ ├── baseline.py 基线:垂直 1000 m 最大交会角 / 候选集 MEC 圆心
│ ├── reference.py 参考:保证接收盘内稠密网格枚举
│ ├── region.py K1 = Ω ∩ 角域 ∩ B(s,1500) 统一构造
│ ├── cases.py 随机首次示向度算例
│ └── compare.py 统一评估器:保证接收、最坏后验、移动代价
├── q3/ 问题三:全向源闭环
│ ├── optimal.py 最优:bayes(粒子滤波 + 信息增益 + 滚动 2-opt)
│ ├── baseline.py 基线:grid(49 点网格)/ seven(七点批量)
│ └── compare.py 冻结基准集 core 配对对比
└── q4/ 问题四:含定向源闭环
├── optimal.py 最优:directional(联合信念 + 后备清除 + 定向覆盖计划)
├── baseline.py 基线:把问题三策略直接搬用(bayes / grid)
└── compare.py 冻结基准集 core+boundary 配对对比
```
## 3. 各问对比设计
### 问题一(`q1/`)
- **最优**:`mcm26b.geometry.localization.solve`,半平面交求凸多边形,顶点对
枚举直径,Welzl 最小包围圆,并输出直径圆覆盖判断、圆外顶点与最大超出距离。
- **基线**:固定大框网格采样,直径取**包围盒对角线**、覆盖取"包围盒中心 +
代理直径圆"。它在斜/细长区域上系统性高估直径,并对任意包围盒都几乎恒判覆盖。
- **参考**:从 ±1e7 m 大框出发逐半平面 Sutherland–Hodgman 裁剪,独立实现
直径暴力枚举与 1/2/3 点支撑圆暴力最小包围圆。与最优实现共享 0 个内部步骤。
- 指标:状态判定、直径绝对误差、直径圆覆盖准确率、运行耗时。
### 问题二(`q2/`)
- 候选集 `K1 = Ω ∩ W(s,θ±δ_eff) ∩ B(s,1500)`,三个方法共用同一次构造。
- **最优**:保证接收盘 `B(MEC 圆心, 1000−ρ)` 内环形采样,最小化"目标边界点 ×
读数区间端点"的最坏后验半径,移动时间同分决胜;保证接收严格,采样是启发式。
- **基线**:① 垂直首次示向度 1000 m 的"90° 交会点"——忽略接收保证,真源在
角域远端时必然 `no_signal`;② 候选集 MEC 圆心——保证接收但交会角可能最差。
- **参考**:保证接收盘内 9×9 网格枚举同一目标函数,检验生产采样接近网格最优。
- 指标:保证接收率、最坏后验包围半径、收缩量、移动时间。
### 问题三(`q3/`)
- **最优** `bayes`:网格粒子滤波幸存集 + 期望信息增益选点 + 滚动 2-opt 任务排序。
- **基线** `grid`:49 点(700 m 步长)网格发现 + 就近服务;`seven`:七点解析
覆盖 + 同站批量扫频,作为"覆盖证明 + 批量调度"的中间对照。
- 冻结基准集 `harness.suites`(种子/源数版本化),逐局校验全清与计时复算。
- 指标:全清率、均值/中位/最大虚拟时间、检测数、请求数、位移、墙钟。
### 问题四(`q4/`)
- **最优** `directional`:31 点定向覆盖计划 + 朝向遮挡推理 + (位置×朝向) 联合
信念 + ≤20 m 有限圆盘后备清除。
- **基线**:把问题三策略原样搬用——`bayes` 的七站全向缺席证明会把朝外定向源
误判为 ABSENT("快而错");`grid` 的 49 点覆盖对定向源发现完备,但无后备清除,
定位停滞只能停在 DETECTED("稳而不全")。
- 冻结基准集 `core+boundary`,其中 `boundary` 场景全部为背离圆心发射的边界定向
源,是最不利工况。
- 指标:全清率、缺席误判数、虚拟时间、后备清除次数、墙钟。
## 4. 运行方式
```bash
uv run python -m project.run # 四问全部,写入 project/results/
uv run python -m project.run --question 1 # 只跑问题一
uv run python -m project.run --quick # 缩小随机算例/基准集规模
```
> `project/` 用到 `numpy`(网格参考解)。它随 dev 依赖组(optuna)安装;
> 只跑正式求解入口 `mcm26b` 不需要它。
## 5. 结果文件
| 文件 | 内容 |
| --- | --- |
| `results/q1.md` / `q1.json` | 固定示例 + 随机算例的逐案明细与汇总 |
| `results/q2.md` / `q2.json` | 逐案第二点位置、保证接收、最坏后验与汇总 |
| `results/q3.md` / `q3.json` | 冻结基准集逐场景明细、逐方法汇总、配对变化 |
| `results/q4.md` / `q4.json` | core+boundary 逐场景明细与汇总 |
| `results/summary.md` | 四问核心指标总览 + 方法映射 + 目录结构 |
## 6. 口径与边界(写论文时必须一并声明)
- 问题一参考解与最优实现都是精确算法;固定示例的解析期望另有
`tests/test_geometry*.py` 固化,本框架在其上补齐"朴素基线错在哪"。
- 问题二"最坏后验半径"是**对候选集外包多边形的启发式评估**,不是连续问题
的全局最优证明;生产实现与参考网格共享该目标函数,只比较搜索质量。
- 问题三、四的随机分布(源位置均匀、误差场逐点固定等)是**测试假设**,
题面未规定;正式成绩以官方模拟器演练/正式测试为准。
- 基线不是稻草人:`q2` 的 MEC 圆心、`q3` 的 `seven`、`q4` 的 `grid` 都是
能独立跑通、在部分场景有效的真实方法;它们暴露的是"缺了哪一步"。