7.3 KiB
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/。
uv sync # 安装主包与 referee(可编辑挂载)
2. 运行程序(问题三 / 问题四闭环)
队号不在代码中固化:登录标识属身份信息,一律在运行时通过 --robot-id 传入,
代码、测试、示例与日志中只出现与赛事无关的中性占位符(如 TEAM-0001)。
# 对接官方模拟器(先在界面确认测试已开始、接口就绪)
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(仅自检生效)。
问题一 / 问题二
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 协议对接;论文正文的演练数据即由它产生。
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 局以便复核。
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)。
需要重新采集演练局时
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. 复现论文插图
uv run python scripts/plot_paper_figures.py # 生成 docs/figures/*.png
脚本只读 docs/paper/data/ 下的复算结果与第四问覆盖计划,不手抄任何数字;
图内文字与图注数据均来自同一次复算。插图清单、数据来源与生成命令见
docs/figures/README.md 与 docs/figures/manifest.json。
6. 编译论文
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。
7. 单文件核心代码与测试
uv run pytest # 全部测试(本包 + referee)
python scripts/build_core_notebook.py # 由 src/mcm26b 生成单文件核心代码
python scripts/run_notebook_cells.py # 顺序执行 notebook 全部代码单元(零依赖自检)
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 记录论文各轮修订与验证过程(含数据重采与问题修复)。