2026-09-13 19:14:06 +08:00
123
2026-09-13 08:52:23 +08:00
2026-09-13 18:05:59 +08:00
2026-09-13 19:14:06 +08:00
123
2026-09-13 10:27:09 +08:00
2026-09-13 10:30:05 +08:00
2026-09-13 18:43:25 +08:00
2026-09-13 18:43:25 +08:00
2026-09-13 18:43:25 +08:00
2026-09-13 18:43:25 +08:00
2026-09-13 18:43:25 +08:00
2026-09-13 18:43:25 +08:00
2026-09-13 18:43:25 +08:00
2026-09-10 18:56:06 +08:00
2026-09-13 10:30:05 +08:00
2026-09-13 18:43:25 +08:00
2026-09-13 14:38:31 +08:00
2026-09-13 18:43:25 +08:00
2026-09-13 18:05:59 +08:00

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 记录论文各轮修订与验证过程(含数据重采与问题修复)。

S
Description
!?模模!?
Readme
155 MiB