Files
mcm-26-b/README.md
T
2026-09-13 19:16:47 +08:00

198 lines
9.0 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.
# 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/`,
该目录约 150 MB、**已在 `.gitignore` 中排除、不入库**;缺失时按
`docs/paper/mcm26b-paper.cls` 中的「若未携带 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. AIGC 使用合规记录
竞赛要求如实记录 AI 使用情况。本项目使用的 AI 编程助手(ChatGPT/Codex 桌面版、
DeepSeek Harness)在本目录内的全部会话,已从本机客户端存储中提取并汇编为一份合规记录:
| 文件 | 说明 |
| --- | --- |
| [`docs/aigc-compliance-record.tex`](docs/aigc-compliance-record.tex) | LaTeX 源文件(58 页):编制说明、使用总览、环境与权限配置、逐会话逐轮次详细记录、合规性说明、附录 |
| [`docs/aigc-compliance-record.pdf`](docs/aigc-compliance-record.pdf) | 编译成品 |
记录覆盖 **11 个会话 / 34 个工作轮次 / 31 条人工提示词 / 1508 次工具调用**,
跨 2026-09-10 20:52 至 2026-09-13 18:51(UTC+8)。每条目给出该轮次的
**发生时间、执行环境与上下文(含提示词全文)、大模型实际操作概要**(工具调用分类、
写入文件、代表性命令、模型对外结论)。
编译(需 ctex / longtable / booktabs):
```bash
cd docs
latexmk -xelatex -interaction=nonstopmode aigc-compliance-record.tex
```
> 记录由审计脚本从 `~/.codex/sessions/`、`~/.codex/state_5.sqlite`、`~/.dsh/sessions/`
> 中**工作目录等于本仓库**的会话自动提取生成,原始记录未经改写;提取与统计脚本
> 存于 `tmp/aigc/`(该目录按 `.gitignore` 不入库)。会话如何归属本项目、
> 哪些存储被核查后排除,见记录第 1 节与附录 A.4。
---
## 9. 目录结构
```
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)与来源清单
docs/ AIGC 使用合规记录(aigc-compliance-record.tex / .pdf)与本目录索引
examples/ 问题一算例与回放归档
scripts/ 复现脚本:数据复算、插图绘制、正式数据核对、采集与基准
project/ 四问"最优实现 / 基线实现"配对对比框架(论文对比表的来源)
issue/ 赛题、附件与格式规范(原始材料)
```
`docs/paper/REWRITE_NOTES.md` 记录论文各轮修订与验证过程(含数据重采与问题修复)。