166 lines
7.3 KiB
Markdown
166 lines
7.3 KiB
Markdown
# mcm26b — CUMCM 2026 B 题:无线电干扰源的快速自动定位与清除
|
||
|
||
本仓库为参赛论文(`docs/paper/main.tex`)的可复现支撑材料:
|
||
提供四问的完整可运行程序、自建模拟器、论文全部数据与插图的生成脚本。
|
||
算法本身的推导、证明与结果分析见论文,本文件只说明**怎么跑、怎么复现**。
|
||
|
||
---
|
||
|
||
## 1. 环境
|
||
|
||
- Python ≥ 3.10;运行时依赖仅 `requests`,测试与自检另需 `pytest`、`numpy`。
|
||
- 自建模拟器 `referee/` 为零第三方依赖的独立包,`uv sync` 时作为开发依赖一并挂载。
|
||
- 复现论文 PDF 另需 TeX Live(XeLaTeX、ctex、TikZ),字体已随仓库提供于 `docs/paper/fonts/`。
|
||
|
||
```bash
|
||
uv sync # 安装主包与 referee(可编辑挂载)
|
||
```
|
||
|
||
---
|
||
|
||
## 2. 运行程序(问题三 / 问题四闭环)
|
||
|
||
**队号不在代码中固化**:登录标识属身份信息,一律在运行时通过 `--robot-id` 传入,
|
||
代码、测试、示例与日志中只出现与赛事无关的中性占位符(如 `TEAM-0001`)。
|
||
|
||
```bash
|
||
# 对接官方模拟器(先在界面确认测试已开始、接口就绪)
|
||
uv run python -m mcm26b.cli run --robot-id <队号> --problem 3
|
||
uv run python -m mcm26b.cli run --robot-id <队号> --problem 4
|
||
|
||
# 一键本地评测:自动起自建模拟器 → 开一局演练 → 跑完整闭环 → 汇总
|
||
uv run python -m mcm26b.cli run --robot-id <队号> --problem 3 --local-judge
|
||
|
||
# 不连任何模拟器的自检(随机场景,内存回环)
|
||
uv run python -m mcm26b.cli run --robot-id SELFCHECK --problem 3 --self-test
|
||
|
||
# 复现附件计时示例(期望 105/111/194/199 秒)
|
||
uv run python -m mcm26b.cli sim-check
|
||
```
|
||
|
||
主要开关:`--strategy {bayes,seven,grid}`(仅问题三,默认 `bayes`)、
|
||
`--base-url`、`--log <路径>`、`--real-budget-s`(仅自检生效)。
|
||
|
||
### 问题一 / 问题二
|
||
|
||
```bash
|
||
uv run python -m mcm26b.cli q1 examples/q1/normal.json -o output/q1/result.json
|
||
uv run python -m mcm26b.geometry examples/q1/triangle.json
|
||
```
|
||
|
||
`examples/q1/` 下的五个算例分别覆盖正常多边形、劣交会、零误差线段、不相容观测与直径圆反例。
|
||
|
||
仓库根的 `main.py` 只是转发到同一 CLI 的薄壳(`python main.py <子命令>`),
|
||
等价于 `python -m mcm26b.cli <子命令>`。
|
||
|
||
---
|
||
|
||
## 3. 自建模拟器(`referee/`)
|
||
|
||
按题面附件 1《模拟器使用说明》与附件 2《通信接口说明》实现,与参赛队代码零耦合,
|
||
只通过 HTTP 协议对接;论文正文的演练数据即由它产生。
|
||
|
||
```bash
|
||
uv run python -m referee # WebUI http://127.0.0.1:8026,接口 :2026
|
||
uv run python -m referee --data-dir referee-data
|
||
```
|
||
|
||
- WebUI 复现官方测试流程:四个模块(演练不限次 / 正式各 3 次)、确认→5 秒倒计时→
|
||
25 分钟窗口、指令与反馈流、中止需两次确认、结束原因、行为日志导出;
|
||
- "回放"页可用本局行为日志动画复现运动与扫描过程,也支持手动导入任意 JSONL;
|
||
- 自建差异(联网登录、官方校时、加密上传属官方服务器侧,本地不实现;
|
||
误差场与场景分布为测试假设)见 `referee/README.md`。
|
||
|
||
---
|
||
|
||
## 4. 复现论文数据(`referee-data/` → 宏与表格)
|
||
|
||
`referee-data/sessions/` 收录论文正文引用的 44 局演练日志(问题三 15 局、问题四 29 局),
|
||
`referee-data/rejected-sessions/` 保留同批采集中被判定为无效的 11 局以便复核。
|
||
|
||
```bash
|
||
python scripts/build_practice_data.py # 复算演练局 → 宏、整表、CSV/JSON 快照
|
||
python scripts/audit_paper_formal.py --snapshot docs/paper/data/formal-results.json
|
||
python scripts/build_paper_support.py # 附录正式数据表与支撑包
|
||
```
|
||
|
||
- 第一条按题面计时模型逐动作复算,输出 `docs/paper/data/practice-*.tex` 与
|
||
`practice-results.{json,csv}`;复算值与评测机记录的最大偏差应为 **0.000000 s**。
|
||
运行结束会打印局数、全清局数与平均虚拟时间,可直接与论文数字对照。
|
||
- 第二条校验官方六份正式导出包与统计快照的对应关系(来源匹配需原电脑的官方统计队列)。
|
||
- 第三条生成附录表格与 `support-materials.zip`(`--package`)。
|
||
|
||
### 需要重新采集演练局时
|
||
|
||
```bash
|
||
uv run python scripts/run_practice_episodes.py --problem 3 --robot-id <队号> \
|
||
--counts 10,13,16 --seeds 300-314
|
||
uv run python scripts/run_practice_episodes.py --problem 4 --robot-id <队号> \
|
||
--counts 10,13,16 --directional-cycle 3,6,8 --seeds 400-439
|
||
```
|
||
|
||
脚本启动评测机并调用生产策略对接接口,真值与行为日志由评测机写入
|
||
`referee-data/sessions/`。判定标准为
|
||
`清完全部源 ∧ 无缺席误判 ∧ 主动退出 ∧ 零异常 ∧ 零失败清除`;
|
||
只看"是否清完"会放过"清完了但中途大量 `/clear` 打空"的无效局。
|
||
|
||
---
|
||
|
||
## 5. 复现论文插图
|
||
|
||
```bash
|
||
uv run python scripts/plot_paper_figures.py # 生成 docs/figures/*.png
|
||
```
|
||
|
||
脚本只读 `docs/paper/data/` 下的复算结果与第四问覆盖计划,不手抄任何数字;
|
||
图内文字与图注数据均来自同一次复算。插图清单、数据来源与生成命令见
|
||
[`docs/figures/README.md`](docs/figures/README.md) 与 `docs/figures/manifest.json`。
|
||
|
||
---
|
||
|
||
## 6. 编译论文
|
||
|
||
```bash
|
||
cd docs/paper
|
||
latexmk -xelatex -interaction=nonstopmode -halt-on-error -outdir=build main.tex # 产物 build/main.pdf
|
||
latexmk -xelatex -interaction=nonstopmode -halt-on-error main.tex # 产物 main.pdf
|
||
```
|
||
|
||
两条口令都完成交叉引用所需的多遍编译。VS Code 的 LaTeX Workshop 配置见
|
||
`.vscode/settings.json`(默认配方为前者)。细节与注意事项见
|
||
[`docs/paper/README.md`](docs/paper/README.md)。
|
||
|
||
---
|
||
|
||
## 7. 单文件核心代码与测试
|
||
|
||
```bash
|
||
uv run pytest # 全部测试(本包 + referee)
|
||
python scripts/build_core_notebook.py # 由 src/mcm26b 生成单文件核心代码
|
||
python scripts/run_notebook_cells.py # 顺序执行 notebook 全部代码单元(零依赖自检)
|
||
```
|
||
|
||
[`mcm26b-核心代码.ipynb`](mcm26b-核心代码.ipynb) 是四问生产实现的单文件版本
|
||
(约 5000 行),不含评测机、命令行外壳、采集/绘图脚本与测试;
|
||
`src/mcm26b/` 保留与之逐字对应的模块化版本。
|
||
|
||
---
|
||
|
||
## 8. 目录结构
|
||
|
||
```
|
||
src/mcm26b/ 四问求解实现:config / protocol / geometry / belief / coverage /
|
||
guarantee / planner / particles / routing / evaluation / harness
|
||
referee/ 自建模拟器(独立包,零第三方依赖,不依赖本队代码)
|
||
referee-data/ 论文数据来源:演练日志(sessions / rejected-sessions)、正式统计快照
|
||
tests/ 本包测试(含运行时零导入 referee 的解耦守卫)
|
||
docs/paper/ 论文 LaTeX 源、数据与宏、编译说明
|
||
docs/figures/ 论文插图(PNG)与来源清单
|
||
examples/ 问题一算例与回放归档
|
||
scripts/ 复现脚本:数据复算、插图绘制、正式数据核对、采集与基准
|
||
project/ 四问"最优实现 / 基线实现"配对对比框架(论文对比表的来源)
|
||
issue/ 赛题、附件与格式规范(原始材料)
|
||
```
|
||
|
||
`docs/paper/REWRITE_NOTES.md` 记录论文各轮修订与验证过程(含数据重采与问题修复)。
|