Files
mcm-26-b/docs/paper/REWRITE_NOTES.md
2026-09-13 18:43:25 +08:00

255 lines
17 KiB
Markdown
Raw Permalink 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.
# 本次修订与验证
## 目录清理、去敏与文档合并(本轮)
### 身份信息去敏(队号改为运行期参数)
队号属身份信息,不再出现在代码、测试、示例与文档中:
- `src/mcm26b/cli.py`:`sim-check` 的 `--robot-id` 默认值由真实队号改为与赛事无关的
`SIMCHECK`;`run` 子命令本就 `required=True`。**对接官方模拟器的队号一律由命令行传入**。
- `src/mcm26b/harness/simulator.py`、`referee/src/referee/simulator.py`:
`robot_id` 由带默认值改为**必填**,杜绝把队号固化进可提交代码。
- `scripts/run_practice_episodes.py`:`--robot-id` 改为必填。
- `scripts/build_core_notebook.py` 及重新生成的 `mcm26b-核心代码.ipynb`:
离线自检单元用中性标识 `OFFLINE`;命令示例同步为 `python -m mcm26b.cli run`。
- 测试、`README.md`、`referee/README.md`、referee WebUI 提示文本:
真实队号统一替换为中性占位符 `TEAM-0001`。
- `referee-data/` 与 `examples/replay/` 下的演练/正式日志(共 110 个文件):
`robot_id` 字段统一为中性占位符,**位置、示向度、时间等证据字段原样未动**;
改后复算结果完全一致(44 局全清、计时偏差仍为 0.000000 s)。
### 清理无用文件
- 删除本机工作区 `tmp/`(43 MB,含历史留档、截图与中间草稿)、`.zcode/`;
- 删除论文不再使用的 MATLAB 出图链路:`scripts/matlab/`(17 个文件)、
`scripts/build_figure_data.py`、`scripts/render_q1_figures.py`;
论文插图现全部由 `scripts/plot_paper_figures.py` 生成;
- 删除 LaTeX 陈旧产物(`main-updated.pdf`、`main-check.*`、`main copy.*`)与
未被引用的 `docs/paper/sections/comparison.tex`;
- 删除 `docs/figures/flow-overall-architecture.png` 及其生成函数:
对应的四层主线图已从论文中移除,不再有插图引用它。
### 优化 .gitignore
按"只跟踪可复现结果所需的最小集合"重写,补齐 Python/构建/编辑器/操作系统条目,
新增忽略 `docs/paper/support-materials.zip`(脚本产物)、`.piptmp/`、`uv-temp/`、`pip-temp/`、
`.idea/`、`.zcode/`;保留 `referee-data/` 的版本控制并注明其身份信息已去敏。
### 文档合并到 README
论文已完整给出四问的模型、推导与结果分析,故删除 13 份算法与设计说明文档
(`docs/algo-*.md`、两份优化方案、示意图册、总体思路、执行时间、协议规则表、
最优与基线对比、论文列表),只保留复现所必需的说明:
- 根 `README.md` 重写为单一操作手册:环境 → 运行程序 → 自建模拟器 →
复现论文数据 → 复现插图 → 编译论文 → 单文件核心代码与测试 → 目录结构;
- `docs/README.md` 改为最小索引;
- `docs/paper/README.md` 与 `docs/figures/README.md` 同步更新(数据分工、重算与编译步骤、
插图清单与来源)。
- 源码/测试/脚本中原先指向被删文档的注释,统一改为指向论文对应章节,不留悬空引用。
### 验证
- `uv run pytest tests referee/tests`:**263 passed, 5 skipped**
(5 项为需要 `output/q1/practice` 官方演练采集的可选夹具,缺失时按 skip 处理);
- `python scripts/build_practice_data.py`:44 局复算,计时偏差 0.000000 s;
- `scripts/build_paper_support.py --package`:278 个文件、3.6 MB,未超 20 MB;
- `latexmk -xelatex -outdir=build`:56 页,无未解析引用、无超宽表格;
- 绘图脚本无告警,`docs/figures/` 只保留论文实际引用的 10 张 PNG。
## VS Code 配方与图 2 箭头(前轮)
- **LaTeX Workshop 默认配方换成与本项目编译口令一致的配方**:
`.vscode/settings.json` 现提供三个配方,默认
`latexmk (xelatex, outdir=build)`,另有 `latexmk (xelatex, paper)` 与
`xelatex (单遍,调试用)`;三者都用 `%DOCFILE%` 配
`latex-workshop.latex.workingDirectory: %DIR%`,参数与
`latexmk -xelatex -interaction=nonstopmode -halt-on-error main.tex` 对齐。
两条 latexmk 配方均已实测:多遍编译后均为 57 页、无未解析引用。
- **默认写 `build/` 的真实原因**:Windows 下 PDF 预览会锁住已打开的
`docs/paper/main.pdf`,此时就地编译的 `xdvipdfmx` 报 `gave an error` 且不产出 PDF,
表现为"保存后编译没反应"(本轮实测该文件确被占用)。
写到 `build/` 后预览读 `docs/paper/build/main.pdf`,与源码目录互不抢占,
`autoBuild.run: onSave` 才能稳定工作;需就地产出时切换配方并先关闭预览。
该目录已在 `.gitignore` 中。
- **图 1 箭头重叠**:原来四条 L2→L3 的箭头收在同一个点上,箭头头部挤成一团。
现改为先接到 L3 上方的一条汇流线,再由单个箭头进入 L3;线不交叉、箭头不重叠。
- **图 2 箭头穿框**:原来四条箭头从 L2 框的顶边出发、并在框内斜穿,
终点又都落在一起。现改为从框的底边出发汇入一条水平汇流线,
再由单箭头落到 L3 顶边;闭环回路的四个箭头也改为严格从框边到框边。
同时删去与文本框重叠的"闭环"标注,并把画布裁到内容外沿。
- 复算:`latexmk -xelatex` 通过,57 页,无未解析引用、无超宽表格;绘图脚本无告警。
## 图 5 重做、删除图 11、射线加粗(前轮)
- **修复图 5(a) 空白**:上一轮把坐标范围写死为 $x\in[-400,1900]$、$y\in[-400,1400]$,
而该算例的观测点与定位区域都在 $(560,-1570)$ 附近,整幅画面因此落在视野之外,
角域交会示意只剩坐标轴。现改为**由观测点与定位区域的外包框自动确定视野**,
并保留足够边距,两者同时入画。
- **图 5 三幅等高**:把原"交会+放大"两幅图与独立的等边三角形反例合并为一张三幅图
(`geo-q1-geometry.png`),三幅统一取 $1.15$ 的高宽比与相同宽度,
轴框尺寸完全一致,版面高度严格相等;正文引用宽度改为整栏。
合并后省去一次浮动与一个图注,原来的两张 PNG 与 `fig_q1_counterexample` 一并删除。
- **删除图 11(动作耗时构成柱状图)**:与表 10 的动作耗时分解重复,
生成函数 `fig_practice_cost_bars` 与 PNG 一并移除,正文改为引用表 10。
- **图 9、图 10 射线加粗**:示向度射线由 $0.5$ pt、透明度 $0.5$ 提高到 $1.1$ pt、透明度 $0.75$
并改实心端帽;检测点标记同步放大(圆点 $16$、菱形 $18$、叉号 $12$),
轨迹线 $1.0\to1.4$ pt;两图在正文中由 $0.85$ 放大到 $0.94$ 栏宽。
- 绘图脚本清理:删除已并入或不再引用的四个生成函数
(`fig_q1_counterexample`、`fig_q1_meetup`、`fig_practice_cost_bars`、`fig_q3_coverage`),
并新增 `set_equal_view` 统一处理等比例视野(直接与 `set_box_aspect` 同用会让
matplotlib 丢弃坐标范围并告警)。
- 复算:`latexmk -xelatex` 通过,57 页,无未解析引用、无超宽表格;绘图脚本无告警。
## 版面精简与可读性(前轮)
- **摘要压缩**:删除"结论:1.2.3."与全部定量数字,只说明本文针对四问各做了什么工作,
结尾一句交代数据分工,整页容下摘要与关键词。
- **图 1、图 2 紧凑化**:两张流程图的画布分别由 $8.0\times4.8$ 与 $5.8\times4.2$ 英寸
收紧到 $7.6\times4.9$ 与 $7.6\times5.3$,并按最终缩放比例重设字号;
正文引用宽度改为 $0.74$ 与 $0.62$,不再各占近半页。
- **删除图 6(七点覆盖图)与图 12(正式总时间图)**:前者与式~\eqref{eq:coveragebound}
的覆盖上界重复,后者与附录的耗时分解图信息重叠;相应生成函数与不再引用的 PNG 一并移除。
- **图 9、图 10 射线加粗**:示向度射线由 $0.5$ pt、透明度 $0.5$ 提高到 $1.1$ pt、透明度 $0.75$
并改为实心端帽;检测点标记同步放大(圆点 $16$、菱形 $18$、叉号 $12$),
轨迹线由 $1.0$ pt 加粗到 $1.4$ pt;两图在正文中由 $0.85$ 放大到 $0.94$ 栏宽。
- **删除"未来工作"与"模型推广"**:`evaluation.tex` 只保留"模型的有效性"与
"参数影响的解析讨论";q4 中指向未来工作的小节引用同步删除。
- **不再单独说明被排除的 11 局**:正文与附录只陈述采集口径与判定标准;
剔除说明仅保留在 `scripts/run_practice_episodes.py`、本文档与
`referee-data/rejected-sessions/`(原日志仍保留,可复核)。
- 复算:`latexmk -xelatex` 通过,57 页,无未解析引用、未定义文献与超宽表格。
## 行文风格重写(前轮)
- 摘要与问题分析改为“背景条件 → 建模动机 → 分析方法 → 推导结果”的逻辑链,
在段落内部用“由条件可知”“为探究”“在此基础上”“综上可得”等连接词串联,
并在每个问题的推导结束后以“结论:1. 2. 3.”提炼核心发现。
- 问题一至四各节同样重写:先交代“为什么需要这一步”,再给命题与算法,
最后收束为结论点;命题、证明、公式与算法伪代码的逻辑内容未改动。
- 清理重复论述:模型假设项中的换行、未来工作中重复出现的“样本量有限”一段已合并。
## 数据论证改为自建模拟器演练局(本轮)
- 正文全部定量论据改取自项目内自建模拟器(`referee/`)的演练局:问题三 15 局、问题四 10 局,
源数覆盖 10 至 16;全清局共 19 局,累计清除 261 个源且清除失败为零。
- 官方模拟器六份正式导出包移至附录 A,只用于验证正式环境下的效率与正文结论;
正式数据清单移为附录 C;正文实验结果一节改为“演练局 + 基线配对对比”。
- 新增 `scripts/build_practice_data.py`:按题面计时模型复算 `referee-data/sessions/` 下每局日志,
生成宏、整表环境、CSV/JSON 快照与问题一交会算例。
复算累计虚拟时间与评测机日志记录的最大偏差为 0.000000 s。
- 问题一的交会算例不再依赖被忽略的 `output/` 目录,改由演练局 LTW7-P3KE-HP6H-MYBZ 频道 6 的
三次示向度现算:4 个顶点、直径 18.837 m、直径圆超出 0.872 m、最小包围圆半径 9.462 m,
仍保持“直径圆不覆盖、最小包围圆可清除”这一关键对比。
- 新增插图 `practice-virtual-time.png`、`practice-cost-bars.png`;
正式测试的两张图移入附录。
## 排版与工程修正(本轮)
- 全部图注与表题改为中文,并补齐“图/表 + 编号”的引用一致性。
- 修复 `data/*.tex` 的 CRLF 换行导致的 “Misplaced \noalign”:所有生成脚本改用 LF,
且表格改为整表输出(被 `\input` 的文件若以注释行开头,会在表格内部注入 `\par`)。
- 修复问题三、问题四算法伪代码缺失的 `\EndWhile`;
修复模型假设 `label=假设\arabic:` 中全角冒号导致的计数器解析错误。
- 修复 `scripts/build_paper_support.py` 读正式快照时缺少 `virtual_time_s` 等 CSV 字段的问题,
以及支撑包未收录自建模拟器与演练日志的问题。
- 复算:`latexmk -xelatex` 通过,59 页,无未解析引用、未定义文献与超宽表格。
## 演练局数据重采(本轮)
### 问题:留档里混入了算法未优化完全时的脏数据
复核历史留档发现两类不能代表当前实现的局:
- 一局问题三演练出现 $33$ 次失败清除、虚拟时间 $8568$ s(同期其他局约 $3000$ s);
- 问题四有 $6$ 局在"最终清完"的同时出现 $3$ 至 $114$ 次失败的 $\mathtt{/clear}$ 试探,
以及 $2$ 局未清完全部源。
它们的共同特征是定位长期无法收缩、后备清除反复打空,
总虚拟时间与检测次数被无效试探撑大,因此不能作为性能证据。
### 重采方式
新增 `scripts/run_practice_episodes.py`:启动评测机 `referee`、按固定种子
`judge.start("q3_practice"|"q4_practice", seed=...)` 开始一局演练,
再用与 `mcm26b.cli run` 相同的生产策略对接 HTTP 接口。
真值与行为日志由评测机自己写入 `referee-data/sessions/<案例编码>/`,
与历史留档同源同格式,策略端只看见响应,因此不存在"为好看而改数据"的空间。
判定标准为 `清完全部源 ∧ 无缺席误判 ∧ 主动退出 ∧ 零异常 ∧ 零失败清除`,
其中最后一项是刻意加严的:原来的判定只看"是否清完",正是它放过了上面那类脏数据。
### 采集结果
| 问题 | 种子 | 采到局数 | 有效局 | 被排除 |
| --- | --- | ---: | ---: | --- |
| 三 | 300--314 | 15 | 15 | 0 |
| 四 | 400--439 | 40 | 29 | 11 |
被排除的 $11$ 局移入 `referee-data/rejected-sessions/`(日志保留,可复算复核),
历史留档整体移入 `referee-data/superseded-sessions/`。
论文只引用声明的批次:`scripts/build_practice_data.py` 按案例编码白名单过滤,
批次外留档一律不进入统计。
新批次共 **$44$ 局,全部清完全部源且失败清除为零**,累计清除 $557$ 个源:
问题三 15 局平均总虚拟时间 $3261.579$ s,问题四 29 局平均 $8401.445$ s,
移动时间占比 $78.1\%$ 与 $75.8\%$,复算计时与日志记录的最大偏差仍为 $0.000000$ s。
### 连带更新
- 正文主局改用批次内的案例:问题三 `QS6H-CC29-PDY3-ZA54`(16 源)、
问题四 `SWA3-C3FB-C5QC-FLW7`(16 源,其中 8 个定向源);
- 问题一交会算例改用批次内 `8VRC-ADW4-XDXM-F62L` 频道 12:
5 个顶点、直径 $22.187$ m、直径圆超出 $4.140$ m、最小包围圆半径 $11.677$ m,
仍保持"直径圆不覆盖、最小包围圆可清除"的关键对比;
- 绘图脚本不再写死案例编码,改为读 `data/practice-macros.tex` 中的主局宏,
避免正文与插图口径分叉;
- 摘要、实验设置、结论与附录 B 的局数、均值、占比全部改为引用宏,不再手写数字。
## 插图可读性修正(前轮)
- 问题四的 31 点计划图原来把一枚前向半盘楔形压在站点云与轨迹附近,语义不明。
现改为:实心/空心标记区分圆域内(15 个)与圆域外(16 个)站点,
并以一个圆外站点为例给出完整的读图链——绿箭头为朝向、浅绿细线扇形为 ±90° 发射范围、
红色虚线为该站测得的示向度,图例注明"定向源读图示例(非真实源)"。
- 搜索路径图原来没有标出检测发起位置与检测结果。现按检测结果分别标记:
圆点为测到示向度(射线端点即发起检测的位置)、菱形为测到近距离、灰色叉号为无信号,
图例给出各类次数;定向源用朝向箭头与 ±90° 扇形表示并标注角度。
- 全向源局不再出现定向源图例文字,避免图上没有对应元素的说明。
- 图注同步改写,逐项说明图中符号与次数;docs/figures/manifest.json 补齐四张图的来源。
- 复核:latexmk -xelatex 通过,59 页,无未解析引用与超宽表格。
## 正式数据补充(前轮)
加入问题三第三次 UVUZ-B4MQ-XSUV-HQFP 和问题四第三次 K58B-V5VC-E4EF-CRTW。
两份文件均通过原始导出、结果侧文件和官方统计记录的对应校验。
| 案例 | 清除数 | 平均定位清除时间(s/个) | 程序运行时间(s) |
| --- | ---: | ---: | ---: |
| Q3-3 | 10 | 290.686 | 2.680 |
| Q4-3 | 14 | 614.884 | 6.051 |
六次累计清除 75 个源。问题三合计 38 个,问题四合计 37 个。
正式结果表、汇总公式、动作耗时图、数据清单与支撑包统一使用六份记录。
## 数学表述(前轮)
用“清除充分条件”“半径判据”替换“证书”;
用“检测状态矩阵”替换“账本”;
用“最近邻任务排序”替换“调度骨架”;
采用集合估计、关联矩阵、离散集合覆盖、网格候选集等已有概念。
实现扩展及评价限制集中于未来工作。数学证明中的必要条件、反例与适用假设保持明确。
## 模板与验证
mcm26b-paper.cls 保持与原仓库模板逐字节一致,文档沿用原模板的黑体标题及版式。
使用 latexmk 自动多遍编译并检查文献、公式、图表引用。
正式统计按官方整数微秒和毫秒计算,支撑包提供 SHA-256 清单供复核。
## 清理论文与源码附录
- 清除 7 个文件中已提交的 git 冲突标记,冲突块统一取 PNG 图版一侧。
- 附录不再逐字排版全部源码,改为“核心程序代码”:只列四问主线核心函数 32 个、约 1300 行,
每个附一句中文说明;数学符号在 main.tex 的 corecode 样式里统一映射。