7.7 KiB
7.7 KiB
1-4 问「最优实现 / 基线实现」对比框架
本目录不是比赛运行时代码,而是把四问的生产实现与独立基线放在同一口径下
配对对比、生成可写进论文的"算法对比"证据。运行时代码仍只有 src/mcm26b,
project/ 只依赖它和测试侧内存回环,不反向污染求解入口。
1. 设计原则
| 角色 | 含义 | 约束 |
|---|---|---|
| 最优实现 | 复用 src/mcm26b 中已由测试固化的生产实现 |
不复制算法,只做 I/O 适配 |
| 基线实现 | 同题下更朴素、但能独立跑通的对照 | 不得共享最优实现的关键步骤 |
| 独立参考 | 与分析算法正交的数值/枚举标准 | 用于判定谁对谁错,而非自证 |
- 第三、四问走
LocalSimulator内存回环,与官方 HTTP 协议同一边界; 真值只在评测机侧,策略端只看响应,因此"全清率/缺席误判"是可信的。 - 闭环有效性判定沿用项目口径:全清 ∧ 无缺席误判 ∧ 正常
/exit∧ 零异常 ∧ 逐微秒计时复算一致,任何一项不满足该局记为无效,失败不静默丢样本。 - 所有对比都按
scene_id配对,汇总同时给均值、中位、最大与相对基线的 配对变化,避免"均值好看但逐局更差"。
2. 目录结构与职责
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. 运行方式
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都是 能独立跑通、在部分场景有效的真实方法;它们暴露的是"缺了哪一步"。