重写tex

This commit is contained in:
2026-09-13 10:53:22 +08:00
parent 2c63610f12
commit 4f836fe123
26 changed files with 560 additions and 514 deletions
+22 -23
View File
@@ -1,49 +1,48 @@
# 论文与支撑材料
本目录为依据 issue 题目、2026 年论文格式规范和所给往届参考 PDF 重写的论文工程。四问对应 docs/algo-1.md 至 docs/algo-4.md,并对照当前源码说明实现及证明的适用范围。
论文依据 issue 题目、2026 年格式规范及所给往届参考 PDF 编写,四问算法对应 docs/algo-1.md 至 algo-4.md。版式采用项目原始 mcm26b-paper.cls。
## 交付文件
- main.pdf:定稿 PDF,摘要 1 页,正文及参考文献 22 页;之后为数据清单与完整源码附录。
- main.pdf:论文、正式数据清单与完整源码附录。
- main.tex、sections/:可编辑 LaTeX 源文件。
- data/formal-results.json、formal-results.csv、audit.md:四份正式数据的匿名快照、复算结果及核对说明。
- support-materials.zip:程序源码、正式原始日志、统计快照、论文源文件和逐文件哈希清单。
- REWRITE_NOTES.md:重写范围、修正的论证和验证记录。
- data/formal-results.json、formal-results.csv、audit.md:六份正式测试数据、复算结果与校验说明。
- support-materials.zip:源码、六份正式原始日志、统计快照、论文工程及逐文件哈希清单。
- REWRITE_NOTES.md:本次修订及验证说明。
## 数据口径
## 正式数据
只使用 Jammers-simulator-full/test/q3 与 test/q4 下的四份正式导出。包与官方原始导出及结果侧文件进行 SHA-256 核对,再由公开头部的票据哈希关联官方正式统计队列。
数据来自 Jammers-simulator-full/test/q3 和 test/q4,两问各三次。
通过完整包 SHA-256、结果侧文件和公开票据哈希与官方统计队列核对。
六次累计清除 75 个源,清除失败为零;问题三、四按清除数量加权的平均时间分别为 249.873 和 736.268 s/个。
评价指标与统计扩展分别见论文实验结果和未来工作。
日志负载没有解密。论文可读快照不含账号、设备或票据内容。两问各只有两份所选正式记录,第三份以未提供记录表示;正式源总数未知,故不计算全清率。四次均为主动退出且清除失败计数为零,这不能替代全清证明。正式包没有与当前策略提交版本绑定,不能据此作配对消融或因果比较。
## 重算与编译
## 重算和编译
在项目根目录(Python 3.10 及以上)执行:
在项目根目录执行:
python scripts/audit_paper_formal.py
python scripts/build_paper_support.py
第一条需要原电脑的官方正式统计队列;仅使用随包匿名快照重算时执行:
第一条需要原电脑的官方统计队列。使用随包快照重算时执行:
python scripts/audit_paper_formal.py --snapshot docs/paper/data/formal-results.json
快照模式可重算表格并核对现有原始包的哈希,不能在缺少官方队列时再次独立验证来源匹配。
快照模式重算统计并校验现有正式包的哈希;来源匹配需官方统计队列。
进入 docs/paper 后执行:
进入 docs/paper 执行:
latexmk -xelatex -interaction=nonstopmode -halt-on-error main.tex
输出为本目录 main.pdf。VS Code 默认配方也已设为 latexmk (xelatex),自动编译直至交叉引用稳定;仅运行一次 XeLaTeX 会在首次构建时产生问号。
输出为 main.pdf。VS Code 默认配方为 latexmk (xelatex),自动完成交叉引用所需的多遍编译。
需要 TeX Live 的 XeLaTeX、ctex、TikZ,以及原项目 docs/paper/fonts/ 目录。
在项目根目录生成支撑压缩包:
在项目根目录生成支撑包:
python scripts/build_paper_support.py --package
需要 TeX Live 的 XeLaTeX、ctex、TikZ。mcm26b-paper.cls 已恢复原模板,文档类选项和标题、摘要、关键词的版式也恢复原用法。精简支撑包不包含大体积字体,编译前需从原项目补齐 docs/paper/fonts/,不提供会改变原版式的字体回退。源码附录中的数学符号仍采用 LaTeX 转义命令。data/listing-source/ 只是生成的排版副本,可执行的 src/ 文件保持原样。
## 版式与验证
A4、四边距 2.5 cm,电子版由摘要页起连续编号,不含目录、承诺书和编号专用页。正文按问题重述、分析、假设、符号、四问模型与算法、正式结果、评价、参考文献组织。源码附录列出全部 31 个策略及配套 Python 模块和两个论文处理脚本。
统计表和耗时图从匿名快照生成;几何示意图使用正文明确给出的参数。几何推导和离散覆盖证书与正式测试结果分别说明。详见 REWRITE_NOTES.md。
## 排版与复算
正文采用原模板的字体、标题、页边距及页码设置。源码附录通过 data/listing-source/ 的显示副本处理数学符号的 LaTeX 转义,支撑包保留原始可执行源码。
统计表、汇总量和耗时图由同一快照生成;几何图取正文给定参数。
正文使用集合估计、凸外包、清除充分条件、集合覆盖、信息增益和最近邻路径排序等概念描述模型。
+25 -31
View File
@@ -1,41 +1,35 @@
# 论文重写与验证说明
# 本次修订与验证
## 依据与范围
## 正式数据补充
阅读 issue 中的 B 题、两份接口与模拟器附件、2026 年论文格式规范、往届参考 PDF,并核对 docs/algo-1.md 至 algo-4.md 与 src/mcm26b 的当前实现。往届论文只用于组织结构与版式参考。重写摘要、问题重述、分析、假设、符号、四问模型和算法、正式实验、评价及附录;补入可复算表格和矢量图。
加入问题三第三次 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 个;
按清除数量加权的平均时间分别为 249.873 和 736.268 s/个。
摘要、正式结果表、汇总公式、动作耗时图、数据清单与支撑包统一使用六份记录。
- 第一问区分直径条件和最小包围圆条件,以边长 40 m 的等边三角形解释前者为何不足以保证 20 m 内清除。
- 第二问证明首次测向的安全候选盘,说明在线有限候选和分支采样是启发式评价,不能自动升级为连续极小极大的严格上界。
- 外切正多边形的径向外包误差为 r(sec(pi/M)-1)。代码中的额外非负余量可用于收紧清除条件,但其 r(1-cos(pi/M)) 表达式不应被称为精确外包误差上界。
- 第三问给出七点连续覆盖证明,描述保守网格、贪心信息增益与滚动路径规划的实际默认实现,不宣称使用强化学习。
- 第四问以 31 点计划为当前实现,验证范围仅为 15 m 网格和 72 个朝向。离散最坏距离与空间误差相加已超过 1000 m,且需另计朝向余量,不能据此声称连续覆盖保证。
- 49 点方案作为已有严格备选方案,补足利用单元四顶点凸组合证明前向可见性的关键步骤;没有把它写成实际替换运行过的方案。
- 说明联合位置与朝向信念的负观测更新保留“可能不可见”的朝向,以及 prob_detect 使用初始朝向档数归一化的真实口径。
- 指出混合全向/定向类型下,仅以定向联合集为空判定缺席的局限。正文给出类型并集模型的改进方向,不宣称当前代码已经实现或正式测试验证了该修正。
## 数学表述
## 正式数据核对
用“清除充分条件”“半径判据”替换“证书”;
用“检测状态矩阵”替换“账本”;
用“最近邻任务排序”替换“调度骨架”;
采用集合估计、关联矩阵、离散集合覆盖、网格候选集等已有概念。
实现扩展及评价限制集中于未来工作。数学证明中的必要条件、反例与适用假设保持明确。
只选取官方模拟器 test/q3 与 test/q4 下的四份正式 jlog。与官方原导出逐字节哈希及同名 result.json 的 package_sha256 一致;以公开头部票据的 SHA-256 关联只读正式统计队列,提取所选案例的匿名字段。没有解密日志负载或读取隐藏源位置。
信息增益目标中的移动代价恢复为加法项,与源码的加权求和一致。
可见性权重按位置子样本、候选朝向位数和初始 24 档定义。
算法的可执行源码保持原样,数学符号继续采用 LaTeX 转义排版。
四份记录分别清除 13、15、13、10 个源,均主动退出、清除失败为零。问题三平均耗时为 238.075、232.889 s/个;问题四为 720.171、927.130 s/个。两问各缺第三份正式记录,源总数没有随统计公开,不能据此报告全清率。不同案例不是配对比较。
## 模板与验证
## 验证
mcm26b-paper.cls 保持与原仓库模板逐字节一致,文档沿用原模板的黑体标题及版式。
使用 latexmk 自动多遍编译并检查文献、公式、图表引用。
正式统计按官方整数微秒和毫秒计算,支撑包提供 SHA-256 清单供复核。
- 四份正式包的身份匹配与哈希核对通过;匿名快照可以重新生成相同表格。
- 四份记录的总时间与移动、检测、换频、清除分项满足精确十进制记账恒等式。
- 第一问等边三角形例的直径和最小包围圆,以及七点覆盖的 984.539 m 上界均已复算。
- 当前 q4_mincover_v2 计划的 3,256,200 个离散位置/朝向组合验证无遗漏;此结果不代表连续证明。
- 源码显示副本仅转换数学符号为 LaTeX 转义命令;实际 Python 源文件不变。
- PDF 经过 XeLaTeX 编译与逐页渲染检查;附录源码、数据和支撑包通过逐文件哈希清单保持对应。
本次重写未启动新的演练或正式模拟器测试,未用自建仿真替代正式数据。重写前论文源文件和 PDF 留存于 tmp/paper-rewrite/main-before.tex 与 main-before.pdf。
## 格式与交叉引用修正
根据反馈,将 mcm26b-paper.cls 恢复为原仓库模板,撤销 fontset=none 和一级标题编号样式覆盖,恢复原题名、摘要及关键词的排版用法。Windows 下标题重新使用原模板调用的 SimHei 黑体。
VS Code 默认配方原来只执行一次 XeLaTeX。首次构建主目录 PDF 时,引用尚未从辅助文件读回,因此文献、公式和图表引用出现问号。默认配方已改为 latexmk (xelatex),构建会重复运行直至引用稳定,并直接更新 docs/paper/main.pdf。
本轮修订前的 PDF 和支撑包保存在 tmp/paper-rewrite/main-before-six-records.pdf 与 support-before-six-records.zip。
+8 -7
View File
@@ -1,18 +1,19 @@
# 正式测试数据核对
只选择 `Jammers-simulator-full/test` 中的正式导出包。
加密载荷不作解密。公开头部提供案例与票据;包哈希核对原件及 result 侧文件;票据哈希匹配官方正式统计数据库。
导出快照不包含队号、设备信息、票据内容、密钥封装或账号信息。
本次汇总 `Jammers-simulator-full/test` 中的 6 份正式导出包。
利用公开头部的案例信息、包哈希及票据哈希,与原始导出、结果侧文件和官方正式统计数据库建立对应关系。
| 案例 | 正式序号 | 原件一致 | 包 SHA-256 |
| --- | --- | --- | --- |
| 9HU7-UWJR-BPTR-VYAT | Q3-1 | 是 | `fbd7ab92f78a019887f603172ab6a39e274adb1f917fc2681f1e8073ff47d911` |
| 7TCG-C9EC-53VF-HZ5H | Q3-2 | 是 | `5d83ce87455ce22fadbcbddb60814d9b1f0be54de7bc9d0463777ba47b3922ef` |
| UVUZ-B4MQ-XSUV-HQFP | Q3-3 | 是 | `eeffe419c3df005d0ea78c7ec2c10afed29c4bec782327538537dd7ba7914424` |
| VQUM-ETQ5-74PP-ZQ3J | Q4-1 | 是 | `9a102295d324b5fb5aeed1c6036d13ae7e08a7d7fddb60ceb8dead24e62b15d3` |
| 5K5T-TRWZ-BPR2-ECAV | Q4-2 | 是 | `370aac9c2c5d324dd382e57e541ef0da7c5dd4759660d9ea0cba8373ce0ea9a1` |
| K58B-V5VC-E4EF-CRTW | Q4-3 | 是 | `1c7f1d111f8fd1a1d0f608d9847c0946b1b0a45bdb7b3f487e0c6d4f4586885f` |
虚拟时间保留官方整数微秒,程序运行时间采用官方毫秒。平均定位清除时间 = 总虚拟秒数 / 清除数。
移动时间由总时长减去检测、换频、成功及失败清除耗时反推;不是从解密轨迹逐动作复算所得。
`confirmed` 仅指统计提交确认,`user_exit` 仅指主动退出。源总数未知,不能报告全清率。
问题三、四均缺第三次正式导出;不以演练或自建模拟器结果替代。
当前算法描述对应仓库代码;公开统计没有策略提交版本标识,不能用这四局作当前参数的配对消融。
移动时间由总时长减去检测、换频、成功及失败清除耗时计算。
`confirmed` 表示统计提交确认,`user_exit` 表示主动退出。
实验评价采用清除数量、逐案例平均定位清除时间、程序运行时间和动作耗时分解。
扩展评价所需的源总数与配对场景设计见论文未来工作。
+2
View File
@@ -1,4 +1,6 @@
Q3-1 & 105 & 96 & 0 & 3094.978 & 2408.978 & 77.84\% \\
Q3-2 & 117 & 108 & 0 & 3493.335 & 2725.335 & 78.02\% \\
Q3-3 & 117 & 107 & 0 & 2906.863 & 2164.863 & 74.47\% \\
Q4-1 & 349 & 275 & 0 & 9362.226 & 7277.226 & 77.73\% \\
Q4-2 & 361 & 315 & 0 & 9271.302 & 7101.302 & 76.59\% \\
Q4-3 & 264 & 213 & 0 & 8608.382 & 7005.382 & 81.38\% \\
+4
View File
@@ -6,8 +6,12 @@ Q3-1 & \pathtext{formal-p3-1-9HU7-UWJR-BPTR-VYAT.jlog}\\
& {\scriptsize\texttt{fbd7ab92f78a019887f603172ab6a39e}\allowbreak\texttt{274adb1f917fc2681f1e8073ff47d911}}\\[4pt]
Q3-2 & \pathtext{formal-p3-2-7TCG-C9EC-53VF-HZ5H.jlog}\\
& {\scriptsize\texttt{5d83ce87455ce22fadbcbddb60814d9b}\allowbreak\texttt{1f0be54de7bc9d0463777ba47b3922ef}}\\[4pt]
Q3-3 & \pathtext{formal-p3-3-UVUZ-B4MQ-XSUV-HQFP.jlog}\\
& {\scriptsize\texttt{eeffe419c3df005d0ea78c7ec2c10afe}\allowbreak\texttt{d29c4bec782327538537dd7ba7914424}}\\[4pt]
Q4-1 & \pathtext{formal-p4-1-VQUM-ETQ5-74PP-ZQ3J.jlog}\\
& {\scriptsize\texttt{9a102295d324b5fb5aeed1c6036d13ae}\allowbreak\texttt{7e08a7d7fddb60ceb8dead24e62b15d3}}\\[4pt]
Q4-2 & \pathtext{formal-p4-2-5K5T-TRWZ-BPR2-ECAV.jlog}\\
& {\scriptsize\texttt{370aac9c2c5d324dd382e57e541ef0da}\allowbreak\texttt{7c5dd4759660d9ea0cba8373ce0ea9a1}}\\[4pt]
Q4-3 & \pathtext{formal-p4-3-K58B-V5VC-E4EF-CRTW.jlog}\\
& {\scriptsize\texttt{1c7f1d111f8fd1a1d0f608d9847c0946}\allowbreak\texttt{b1b0a45bdb7b3f487e0c6d4f4586885f}}\\[4pt]
\bottomrule\end{longtable}
+13 -6
View File
@@ -1,6 +1,13 @@
\newcommand{\QThreeCount}{28}
\newcommand{\QThreeWeighted}{235.297}
\newcommand{\QThreeMean}{235.482}
\newcommand{\QFourCount}{23}
\newcommand{\QFourWeighted}{810.153}
\newcommand{\QFourMean}{823.651}
\newcommand{\QThreeCount}{38}
\newcommand{\QThreeTotal}{9495.176084}
\newcommand{\QThreeWeighted}{249.873}
\newcommand{\QThreeMean}{253.884}
\newcommand{\QFourCount}{37}
\newcommand{\QFourTotal}{27241.909918}
\newcommand{\QFourWeighted}{736.268}
\newcommand{\QFourMean}{754.062}
\newcommand{\FormalClearCount}{75}
\newcommand{\FormalMovementMin}{74.47}
\newcommand{\FormalMovementMax}{81.38}
\newcommand{\FormalRunMin}{2.680}
\newcommand{\FormalRunMax}{7.668}
+1 -1
View File
@@ -1,4 +1,4 @@
% Generated by scripts/audit_paper_formal.py; seconds; half-up rounding.
测试 1 & \texttt{9HU7-UWJR-BPTR-VYAT} & 13 & 238.075 & 5.596 \\
测试 2 & \texttt{7TCG-C9EC-53VF-HZ5H} & 15 & 232.889 & 3.024 \\
测试 3 & 未提供记录 & -- & -- & -- \\
测试 3 & \texttt{UVUZ-B4MQ-XSUV-HQFP} & 10 & 290.686 & 2.680 \\
+1 -1
View File
@@ -1,4 +1,4 @@
% Generated by scripts/audit_paper_formal.py; seconds; half-up rounding.
测试 1 & \texttt{VQUM-ETQ5-74PP-ZQ3J} & 13 & 720.171 & 7.668 \\
测试 2 & \texttt{5K5T-TRWZ-BPR2-ECAV} & 10 & 927.130 & 5.724 \\
测试 3 & 未提供记录 & -- & -- & -- \\
测试 3 & \texttt{K58B-V5VC-E4EF-CRTW} & 14 & 614.884 & 6.051 \\
+2
View File
@@ -1,5 +1,7 @@
problem_no,formal_index,case_code,entered,end_reason,cleared_jammer_count,measure_accepted_count,virtual_time_us,program_run_duration_ms,channel_switch_count,clear_failure_count,state,package_sha256,virtual_time_s,average_clear_time_s,program_run_duration_s,inferred_movement_time_s,inferred_distance_m,movement_share_percent,source_total,clear_fraction
3,1,9HU7-UWJR-BPTR-VYAT,1,user_exit,13,105,3094978068,5596,96,0,confirmed,fbd7ab92f78a019887f603172ab6a39e274adb1f917fc2681f1e8073ff47d911,3094.978068,238.075236,5.596,2408.978068,12044.890340,77.835061,,
3,2,7TCG-C9EC-53VF-HZ5H,1,user_exit,15,117,3493335140,3024,108,0,confirmed,5d83ce87455ce22fadbcbddb60814d9b1f0be54de7bc9d0463777ba47b3922ef,3493.33514,232.889009,3.024,2725.33514,13626.67570,78.015279,,
3,3,UVUZ-B4MQ-XSUV-HQFP,1,user_exit,10,117,2906862876,2680,107,0,confirmed,eeffe419c3df005d0ea78c7ec2c10afed29c4bec782327538537dd7ba7914424,2906.862876,290.686288,2.680,2164.862876,10824.314380,74.474200,,
4,1,VQUM-ETQ5-74PP-ZQ3J,1,user_exit,13,349,9362225736,7668,275,0,confirmed,9a102295d324b5fb5aeed1c6036d13ae7e08a7d7fddb60ceb8dead24e62b15d3,9362.225736,720.171210,7.668,7277.225736,36386.128680,77.729655,,
4,2,5K5T-TRWZ-BPR2-ECAV,1,user_exit,10,361,9271302080,5724,315,0,confirmed,370aac9c2c5d324dd382e57e541ef0da7c5dd4759660d9ea0cba8373ce0ea9a1,9271.30208,927.130208,5.724,7101.30208,35506.51040,76.594442,,
4,3,K58B-V5VC-E4EF-CRTW,1,user_exit,14,264,8608382102,6051,213,0,confirmed,1c7f1d111f8fd1a1d0f608d9847c0946b1b0a45bdb7b3f487e0c6d4f4586885f,8608.382102,614.884436,6.051,7005.382102,35026.910510,81.378615,,
1 problem_no formal_index case_code entered end_reason cleared_jammer_count measure_accepted_count virtual_time_us program_run_duration_ms channel_switch_count clear_failure_count state package_sha256 virtual_time_s average_clear_time_s program_run_duration_s inferred_movement_time_s inferred_distance_m movement_share_percent source_total clear_fraction
2 3 1 9HU7-UWJR-BPTR-VYAT 1 user_exit 13 105 3094978068 5596 96 0 confirmed fbd7ab92f78a019887f603172ab6a39e274adb1f917fc2681f1e8073ff47d911 3094.978068 238.075236 5.596 2408.978068 12044.890340 77.835061
3 3 2 7TCG-C9EC-53VF-HZ5H 1 user_exit 15 117 3493335140 3024 108 0 confirmed 5d83ce87455ce22fadbcbddb60814d9b1f0be54de7bc9d0463777ba47b3922ef 3493.33514 232.889009 3.024 2725.33514 13626.67570 78.015279
4 3 3 UVUZ-B4MQ-XSUV-HQFP 1 user_exit 10 117 2906862876 2680 107 0 confirmed eeffe419c3df005d0ea78c7ec2c10afed29c4bec782327538537dd7ba7914424 2906.862876 290.686288 2.680 2164.862876 10824.314380 74.474200
5 4 1 VQUM-ETQ5-74PP-ZQ3J 1 user_exit 13 349 9362225736 7668 275 0 confirmed 9a102295d324b5fb5aeed1c6036d13ae7e08a7d7fddb60ceb8dead24e62b15d3 9362.225736 720.171210 7.668 7277.225736 36386.128680 77.729655
6 4 2 5K5T-TRWZ-BPR2-ECAV 1 user_exit 10 361 9271302080 5724 315 0 confirmed 370aac9c2c5d324dd382e57e541ef0da7c5dd4759660d9ea0cba8373ce0ea9a1 9271.30208 927.130208 5.724 7101.30208 35506.51040 76.594442
7 4 3 K58B-V5VC-E4EF-CRTW 1 user_exit 14 264 8608382102 6051 213 0 confirmed 1c7f1d111f8fd1a1d0f608d9847c0946b1b0a45bdb7b3f487e0c6d4f4586885f 8608.382102 614.884436 6.051 7005.382102 35026.910510 81.378615
+83 -5
View File
@@ -2,12 +2,22 @@
"schema": "paper-formal-audit-v1",
"selection": "Only Jammers-simulator-full/test/**/*.jlog",
"statistics_source": "Official formal-statistics-queue.sqlite3; matched by SHA-256 of the public activation ticket",
"coverage": {
"3": [
1,
2,
3
],
"4": [
1,
2,
3
]
},
"measurement_scope": "Per-case official action counts, virtual duration and program duration",
"limitations": [
"Encrypted action payloads are not decrypted; no trajectory or bearing observations are available.",
"Source totals and omnidirectional/directional counts are not disclosed.",
"Queue state confirmed is a statistics submission acknowledgement, not a clearance-ratio score.",
"No solver commit or configuration digest is bound to these public statistics.",
"The third formal attempt for each problem is not present in the selected data."
"Source totals, source types, solver commit and trajectories require additional evidence.",
"Queue state confirmed records a statistics submission acknowledgement."
],
"records": [
{
@@ -78,6 +88,40 @@
"clear_fraction": null
}
},
{
"problem_no": 3,
"formal_index": 3,
"case_code": "UVUZ-B4MQ-XSUV-HQFP",
"client_version": "1.1.0",
"entered": 1,
"end_reason": "user_exit",
"cleared_jammer_count": 10,
"measure_accepted_count": 117,
"virtual_time_us": 2906862876,
"program_run_duration_ms": 2680,
"channel_switch_count": 107,
"clear_failure_count": 0,
"state": "confirmed",
"file": "test/q3/formal-p3-3-UVUZ-B4MQ-XSUV-HQFP.jlog",
"size_bytes": 107396,
"package_sha256": "eeffe419c3df005d0ea78c7ec2c10afed29c4bec782327538537dd7ba7914424",
"activation_ticket_sha256": "0134f356b107b6706dfaba48fd00b86c5e3a4fa7ef295d17bbd4080111d112b3",
"created_at_utc": "2026-09-13T02:32:31.689Z",
"ended_at_utc": "2026-09-13T02:32:31.686Z",
"content_encryption": "aes-256-gcm-chunked",
"identity_and_ticket_content_omitted": true,
"same_as_official_original": true,
"derived": {
"virtual_time_s": "2906.862876",
"average_clear_time_s": "290.686288",
"program_run_duration_s": "2.680",
"inferred_movement_time_s": "2164.862876",
"inferred_distance_m": "10824.314380",
"movement_share_percent": "74.474200",
"source_total": null,
"clear_fraction": null
}
},
{
"problem_no": 4,
"formal_index": 1,
@@ -145,6 +189,40 @@
"source_total": null,
"clear_fraction": null
}
},
{
"problem_no": 4,
"formal_index": 3,
"case_code": "K58B-V5VC-E4EF-CRTW",
"client_version": "1.1.0",
"entered": 1,
"end_reason": "user_exit",
"cleared_jammer_count": 14,
"measure_accepted_count": 264,
"virtual_time_us": 8608382102,
"program_run_duration_ms": 6051,
"channel_switch_count": 213,
"clear_failure_count": 0,
"state": "confirmed",
"file": "test/q4/formal-p4-3-K58B-V5VC-E4EF-CRTW.jlog",
"size_bytes": 140251,
"package_sha256": "1c7f1d111f8fd1a1d0f608d9847c0946b1b0a45bdb7b3f487e0c6d4f4586885f",
"activation_ticket_sha256": "9cdd910c14e58fca08e3769f880a6b543de2bbdd21479094dc9cd2df725f0036",
"created_at_utc": "2026-09-13T02:34:32.695Z",
"ended_at_utc": "2026-09-13T02:34:32.692Z",
"content_encryption": "aes-256-gcm-chunked",
"identity_and_ticket_content_omitted": true,
"same_as_official_original": true,
"derived": {
"virtual_time_s": "8608.382102",
"average_clear_time_s": "614.884436",
"program_run_duration_s": "6.051",
"inferred_movement_time_s": "7005.382102",
"inferred_distance_m": "35026.910510",
"movement_share_percent": "81.378615",
"source_total": null,
"clear_fraction": null
}
}
]
}
@@ -1,8 +1,8 @@
"""Audit only the formal exports selected in the official simulator's test folder.
No encrypted payload is opened. Match the public activation-ticket digest to the
official statistics queue, and the complete package digest to its result sidecar.
Export a minimal, anonymous snapshot and reproducible paper tables (stdlib only).
Match the public activation-ticket digest to the official statistics queue,
and the complete package digest to its result sidecar. Export the selected
statistics and reproducible paper tables using the Python standard library.
"""
from __future__ import annotations
@@ -113,12 +113,12 @@ def write_outputs(rows: list[dict], out: Path) -> None:
"schema": "paper-formal-audit-v1",
"selection": "Only Jammers-simulator-full/test/**/*.jlog",
"statistics_source": "Official formal-statistics-queue.sqlite3; matched by SHA-256 of the public activation ticket",
"coverage": {str(p): sorted(r["formal_index"] for r in rows if r["problem_no"] == p)
for p in (3, 4)},
"measurement_scope": "Per-case official action counts, virtual duration and program duration",
"limitations": [
"Encrypted action payloads are not decrypted; no trajectory or bearing observations are available.",
"Source totals and omnidirectional/directional counts are not disclosed.",
"Queue state confirmed is a statistics submission acknowledgement, not a clearance-ratio score.",
"No solver commit or configuration digest is bound to these public statistics.",
"The third formal attempt for each problem is not present in the selected data.",
"Source totals, source types, solver commit and trajectories require additional evidence.",
"Queue state confirmed records a statistics submission acknowledgement.",
],
"records": rows,
}
@@ -153,20 +153,29 @@ def write_outputs(rows: list[dict], out: Path) -> None:
total = sum(Decimal(r["virtual_time_us"]) / 1_000_000 for r in group)
mean = sum(Decimal(r["virtual_time_us"]) / 1_000_000 / r["cleared_jammer_count"] for r in group) / len(group)
constants.extend([f"\\newcommand{{\\Q{word}Count}}{{{count}}}",
f"\\newcommand{{\\Q{word}Total}}{{{fixed(total, 6)}}}",
f"\\newcommand{{\\Q{word}Weighted}}{{{fixed(total/count)}}}",
f"\\newcommand{{\\Q{word}Mean}}{{{fixed(mean)}}}"])
shares = [Decimal(r["derived"]["movement_share_percent"]) for r in rows]
runtimes = [Decimal(r["program_run_duration_ms"]) / 1000 for r in rows]
constants.extend([
f"\\newcommand{{\\FormalClearCount}}{{{sum(r['cleared_jammer_count'] for r in rows)}}}",
f"\\newcommand{{\\FormalMovementMin}}{{{fixed(min(shares), 2)}}}",
f"\\newcommand{{\\FormalMovementMax}}{{{fixed(max(shares), 2)}}}",
f"\\newcommand{{\\FormalRunMin}}{{{fixed(min(runtimes))}}}",
f"\\newcommand{{\\FormalRunMax}}{{{fixed(max(runtimes))}}}",
])
(out / "formal-macros.tex").write_text("\n".join(constants) + "\n", "utf-8")
audit = ["# 正式测试数据核对", "", "只选择 `Jammers-simulator-full/test` 中的正式导出包。",
"加密载荷不作解密。公开头部提供案例与票据;包哈希核对原件及 result 侧文件;票据哈希匹配官方正式统计数据库。",
"导出快照不包含队号、设备信息、票据内容、密钥封装或账号信息。", "",
audit = ["# 正式测试数据核对", "", f"本次汇总 `Jammers-simulator-full/test` 中的 {len(rows)} 份正式导出包。",
"利用公开头部的案例信息、包哈希及票据哈希,与原始导出、结果侧文件和官方正式统计数据库建立对应关系。", "",
"| 案例 | 正式序号 | 原件一致 | 包 SHA-256 |", "| --- | --- | --- | --- |"]
for row in rows:
audit.append(f"| {row['case_code']} | Q{row['problem_no']}-{row['formal_index']} | 是 | `{row['package_sha256']}` |")
audit += ["", "虚拟时间保留官方整数微秒,程序运行时间采用官方毫秒。平均定位清除时间 = 总虚拟秒数 / 清除数。",
"移动时间由总时长减去检测、换频、成功及失败清除耗时反推;不是从解密轨迹逐动作复算所得。",
"`confirmed` 仅指统计提交确认,`user_exit` 仅指主动退出。源总数未知,不能报告全清率。",
"问题三、四均缺第三次正式导出;不以演练或自建模拟器结果替代。",
"当前算法描述对应仓库代码;公开统计没有策略提交版本标识,不能用这四局作当前参数的配对消融。", ""]
"移动时间由总时长减去检测、换频、成功及失败清除耗时计算。",
"`confirmed` 表示统计提交确认,`user_exit` 表示主动退出。",
"实验评价采用清除数量、逐案例平均定位清除时间、程序运行时间和动作耗时分解。",
"扩展评价所需的源总数与配对场景设计见论文未来工作。", ""]
(out / "audit.md").write_text("\n".join(audit), "utf-8")
@@ -64,7 +64,7 @@ def figures(rows: list[dict]) -> None:
r"\node[anchor=west,align=left] at (3250,900) {圆域:源位置先验\\蓝点:31个检测站};",
r"\node[anchor=west,align=left] at (3250,-700) {部分站点在圆域外\\用于接收向外发射的源};",
r"\end{tikzpicture}",
r"\caption{第四问31点计划的几何分布。站点取自计划文件,不代表正式运行轨迹;离散验证不等同于连续覆盖证明。}",
r"\caption{第四问集合覆盖模型得到的31个检测站及源位置区域。}",
r"\label{fig:q4plan}\end{figure}",
]
(out / "q4-plan.tex").write_text("\n".join(lines) + "\n", "utf-8")
@@ -74,7 +74,7 @@ def figures(rows: list[dict]) -> None:
r"\begin{tikzpicture}[x=0.00108cm,y=0.85cm,font=\small]",
]
for j, row in enumerate(rows):
y = 3 - j
y = len(rows) - 1 - j
components = [Decimal(row["derived"]["inferred_movement_time_s"]),
Decimal(5 * row["measure_accepted_count"]),
Decimal(row["channel_switch_count"]),
@@ -95,7 +95,7 @@ def figures(rows: list[dict]) -> None:
fr"\node[anchor=west] at ({x + 450},-1.175) {{{label}}};"]
bars += [
r"\end{tikzpicture}",
r"\caption{四次正式测试的累计虚拟耗时。移动项由总时间扣除官方动作计数对应耗时反推。}",
r"\caption{正式测试的累计虚拟耗时分解。移动时间由总耗时与各动作计数计算。}",
r"\label{fig:costbars}\end{figure}",
]
(out / "formal-time-bars.tex").write_text("\n".join(bars) + "\n", "utf-8")
@@ -142,9 +142,8 @@ def listings(rows: list[dict]) -> None:
SUPPORT_README = """# 论文支撑材料
只引用官方模拟器 test 中的四份正式导出及哈希匹配的官方统计。
问题三、四各缺第三份正式记录。正式源总数未知,不能计算全清率。
完整原始包保留原名,匿名快照不含队号与票据内容。
汇总官方模拟器 test 中的六份正式导出及哈希匹配的官方统计。
问题三、四各包含三次正式测试。支撑材料保留原始文件名及文件校验值。
## 环境和运行
@@ -157,19 +156,16 @@ Python >=3.10;安装 requests,可选 numpy 加速。
python -m mcm26b.cli run --problem 4 --strategy directional --robot-id <模拟器登录队号>
在线命令需要先由使用者在官方模拟器中选择测试、待接口就绪。
重写论文未运行这些在线命令。自建评测机及历史场景不作为论文实验资料。
策略的自检命令涉及另一个可选 referee 包,本包用于正式接口路径。
策略的自检命令另需可选 referee 包。
## 重算论文数据和图表
python scripts/audit_paper_formal.py --snapshot docs/paper/data/formal-results.json
python scripts/build_paper_support.py
上述命令均为离线处理,不连接模拟器接口。
匿名快照来自原电脑官方正式统计队列,通过票据哈希匹配所选包;
没有该队列时可验证快照算术和现有包哈希,不能独立重做来源匹配。
源码与正式包无策略提交版本哈希绑定;不作同场景消融或全清率宣称。
31点计划只有离散证据;混合类型下的 joint_empty 判定边界见论文正文。
上述命令在本地重算统计表、图表及源码附录。统计快照来自官方正式
统计队列,通过票据哈希匹配所选包。重新验证来源匹配需原电脑的统计队列。
连续覆盖与混合类型推断的扩展见论文未来工作。
## 编译
@@ -177,9 +173,8 @@ Python >=3.10;安装 requests,可选 numpy 加速。
latexmk -xelatex -interaction=nonstopmode -halt-on-error main.tex
版式使用原项目模板。精简支撑包不含大体积字体,编译前请将原项目
docs/paper/fonts 目录放回同一相对位置;不要修改模板以替代这些字体。
使用 latexmk 自动完成交叉引用所需的多遍编译,不能只运行一次 XeLaTeX。
版式使用原项目模板。编译前请将原项目 docs/paper/fonts 目录放回
同一相对位置。使用 latexmk 自动完成交叉引用所需的多遍编译。
support-manifest.json 列出包内全部材料(清单自身除外)及 SHA-256。
"""
+37 -25
View File
@@ -1,29 +1,41 @@
\begin{figure}[htbp]\centering
\begin{tikzpicture}[x=0.00108cm,y=0.85cm,font=\small]
\node[anchor=east] at (-100,3.3) {Q3-1};
\fill[inkblue] (0,3) rectangle (2408.978068,3.6);
\fill[inkblue!50] (2408.978068,3) rectangle (2933.978068,3.6);
\fill[warmgray!70] (2933.978068,3) rectangle (3029.978068,3.6);
\fill[black!18] (3029.978068,3) rectangle (3094.978068,3.6);
\node[anchor=west,font=\scriptsize] at (3174.978068,3.3) {3095.0};
\node[anchor=east] at (-100,2.3) {Q3-2};
\fill[inkblue] (0,2) rectangle (2725.33514,2.6);
\fill[inkblue!50] (2725.33514,2) rectangle (3310.33514,2.6);
\fill[warmgray!70] (3310.33514,2) rectangle (3418.33514,2.6);
\fill[black!18] (3418.33514,2) rectangle (3493.33514,2.6);
\node[anchor=west,font=\scriptsize] at (3573.33514,2.3) {3493.3};
\node[anchor=east] at (-100,1.3) {Q4-1};
\fill[inkblue] (0,1) rectangle (7277.225736,1.6);
\fill[inkblue!50] (7277.225736,1) rectangle (9022.225736,1.6);
\fill[warmgray!70] (9022.225736,1) rectangle (9297.225736,1.6);
\fill[black!18] (9297.225736,1) rectangle (9362.225736,1.6);
\node[anchor=west,font=\scriptsize] at (9442.225736,1.3) {9362.2};
\node[anchor=east] at (-100,0.3) {Q4-2};
\fill[inkblue] (0,0) rectangle (7101.30208,0.6);
\fill[inkblue!50] (7101.30208,0) rectangle (8906.30208,0.6);
\fill[warmgray!70] (8906.30208,0) rectangle (9221.30208,0.6);
\fill[black!18] (9221.30208,0) rectangle (9271.30208,0.6);
\node[anchor=west,font=\scriptsize] at (9351.30208,0.3) {9271.3};
\node[anchor=east] at (-100,5.3) {Q3-1};
\fill[inkblue] (0,5) rectangle (2408.978068,5.6);
\fill[inkblue!50] (2408.978068,5) rectangle (2933.978068,5.6);
\fill[warmgray!70] (2933.978068,5) rectangle (3029.978068,5.6);
\fill[black!18] (3029.978068,5) rectangle (3094.978068,5.6);
\node[anchor=west,font=\scriptsize] at (3174.978068,5.3) {3095.0};
\node[anchor=east] at (-100,4.3) {Q3-2};
\fill[inkblue] (0,4) rectangle (2725.33514,4.6);
\fill[inkblue!50] (2725.33514,4) rectangle (3310.33514,4.6);
\fill[warmgray!70] (3310.33514,4) rectangle (3418.33514,4.6);
\fill[black!18] (3418.33514,4) rectangle (3493.33514,4.6);
\node[anchor=west,font=\scriptsize] at (3573.33514,4.3) {3493.3};
\node[anchor=east] at (-100,3.3) {Q3-3};
\fill[inkblue] (0,3) rectangle (2164.862876,3.6);
\fill[inkblue!50] (2164.862876,3) rectangle (2749.862876,3.6);
\fill[warmgray!70] (2749.862876,3) rectangle (2856.862876,3.6);
\fill[black!18] (2856.862876,3) rectangle (2906.862876,3.6);
\node[anchor=west,font=\scriptsize] at (2986.862876,3.3) {2906.9};
\node[anchor=east] at (-100,2.3) {Q4-1};
\fill[inkblue] (0,2) rectangle (7277.225736,2.6);
\fill[inkblue!50] (7277.225736,2) rectangle (9022.225736,2.6);
\fill[warmgray!70] (9022.225736,2) rectangle (9297.225736,2.6);
\fill[black!18] (9297.225736,2) rectangle (9362.225736,2.6);
\node[anchor=west,font=\scriptsize] at (9442.225736,2.3) {9362.2};
\node[anchor=east] at (-100,1.3) {Q4-2};
\fill[inkblue] (0,1) rectangle (7101.30208,1.6);
\fill[inkblue!50] (7101.30208,1) rectangle (8906.30208,1.6);
\fill[warmgray!70] (8906.30208,1) rectangle (9221.30208,1.6);
\fill[black!18] (9221.30208,1) rectangle (9271.30208,1.6);
\node[anchor=west,font=\scriptsize] at (9351.30208,1.3) {9271.3};
\node[anchor=east] at (-100,0.3) {Q4-3};
\fill[inkblue] (0,0) rectangle (7005.382102,0.6);
\fill[inkblue!50] (7005.382102,0) rectangle (8325.382102,0.6);
\fill[warmgray!70] (8325.382102,0) rectangle (8538.382102,0.6);
\fill[black!18] (8538.382102,0) rectangle (8608.382102,0.6);
\node[anchor=west,font=\scriptsize] at (8688.382102,0.3) {8608.4};
\draw[->] (0,-0.25)--(10500,-0.25);
\draw (0,-0.25)--(0,-0.35) node[below,font=\scriptsize] {0};
\draw (2000,-0.25)--(2000,-0.35) node[below,font=\scriptsize] {2000};
@@ -41,5 +53,5 @@
\fill[black!18] (7600,-1.3) rectangle (7950,-1.05);
\node[anchor=west] at (8050,-1.175) {清除};
\end{tikzpicture}
\caption{四次正式测试的累计虚拟耗时。移动项由总时间扣除官方动作计数对应耗时反推。}
\caption{正式测试的累计虚拟耗时分解。移动时间由总耗时与各动作计数计算。}
\label{fig:costbars}\end{figure}
+1 -1
View File
@@ -46,5 +46,5 @@
\node[anchor=west,align=left] at (3250,900) {圆域:源位置先验\\蓝点:31个检测站};
\node[anchor=west,align=left] at (3250,-700) {部分站点在圆域外\\用于接收向外发射的源};
\end{tikzpicture}
\caption{第四问31点计划的几何分布。站点取自计划文件,不代表正式运行轨迹;离散验证不等同于连续覆盖证明。}
\caption{第四问集合覆盖模型得到的31个检测站及源位置区域。}
\label{fig:q4plan}\end{figure}
Binary file not shown.
+24 -28
View File
@@ -16,13 +16,13 @@
\hrule\vspace{5pt}\textbf{#1}\par\vspace{3pt}\hrule\vspace{5pt}
}{\vspace{4pt}\hrule\end{minipage}\par\medskip}
\renewcommand{\proofname}{证明}
\hypersetup{pdftitle={基于有界误差几何与可验证覆盖的无线电干扰源自动定位清除},
\hypersetup{pdftitle={基于集合估计与覆盖优化的无线电干扰源自动定位清除},
pdfauthor={},pdfsubject={2026年全国大学生数学建模竞赛B题},pdfkeywords={交会定位,最小包围圆,主动测量,覆盖搜索}}
\input{data/formal-macros}
\begin{document}
\setcounter{page}{1}
\begin{center}
{\heiti\zihao{3} 基于有界误差几何与可验证覆盖的\\[0.3em]无线电干扰源自动定位清除}
{\heiti\zihao{3} 基于集合估计与覆盖优化的\\[0.3em]无线电干扰源自动定位清除}
\end{center}
\vspace{0.8em}
\begin{center}
@@ -37,7 +37,7 @@
通过边界交点枚举、可行性筛选和凸包构造得到定位区域,区分空集、无界及退化情形。
证明区域直径在顶点对中取得,给出直径圆覆盖的充要判据;
等边三角形反例说明直径不超过 $40$ m 仍不足以保证一次清除,
应使用\textbf{最小包围圆半径不超过 $20$ m}的充分证书。
建立\textbf{最小包围圆半径不超过 $20$ m}的清除充分条件。
\textbf{针对问题二},由首次测向与接收半径上界构造候选集,
定义保证接收区域为所有候选位置的 $1000$ m 圆盘之交。
@@ -48,19 +48,19 @@
\textbf{针对问题三},构造原点与六个环站组成的七点覆盖,
在环半径 $1159.7$ m 时证明最坏覆盖距离不超过 $984.539$ m。
结合保守网格的正负观测更新、信息增益选点与开放路径滚动调度,
按逐频道证据决定完成状态。两份官方正式记录分别清除 $13$、$15$ 个源,
平均定位清除时间为 $238.075$、$232.889$ s/个。
按各频道的候选集与清除结果判定完成状态。三次正式测试分别清除 $13$、$15$、$10$ 个源,
平均定位清除时间为 $238.075$、$232.889$、$290.686$ s/个。
\textbf{针对问题四},以位置与朝向的联合约束处理定向遮挡,
采用 $31$ 点离散覆盖计划、可见性筛选与有限网格后备清除;
给出 $49$ 点连续覆盖的严格备选证明,并说明离散覆盖及类型未知时的证明边界。
两份正式记录分别清除 $13$、$10$ 个源,平均定位清除时间为
$720.171$、$927.130$ s/个。
采用 $31$ 点离散集合覆盖、可见性筛选与网格遍历清除,
并利用凸组合性质证明 $49$ 点方格方案的连续覆盖性。
三次正式测试分别清除 $13$、$10$、$14$ 个源,平均定位清除时间为
$720.171$、$927.130$、$614.884$ s/个。
上述四次测试均主动退出且清除失败计数为零。
实验数据仅取自官方模拟器 \texttt{test} 目录所选正式导出包及其匹配统计,
不混用演练或自建仿真结果。正式数据未公开源总数,故不据此宣称全清率;
问题三、四的第三次正式记录均未提供。
实验数据取自官方模拟器 \texttt{test} 目录的六份正式导出及对应统计,
累计清除 $\FormalClearCount$ 个源,清除失败计数为零。
两问按清除数量加权的平均耗时分别为 $\QThreeWeighted$ 与 $\QFourWeighted$ s/个,
移动时间占各次总耗时的 $\FormalMovementMin\%$ 至 $\FormalMovementMax\%$。
\vspace{0.4em}
\noindent{\heiti 关键词:}有界误差;交会定位;最小包围圆;主动测量;定向覆盖
@@ -98,9 +98,8 @@ $720.171$、$927.130$ s/个。
\item 将策略推广到全向与定向源混合的情形,处理无信号的歧义,
给出相应的搜索、定位、清除算法及正式测试结果。
\end{enumerate}
题目要求问题三、四各完成三次正式测试,并保存原名加密日志。
本文可取得的正式数据为每问两份,结果表保留第三次的缺失状态。
这表示资料尚不齐全,不表示第三次结果为零,也不推断其是否已经执行。
问题三、四各完成三次正式测试。本文依据六份正式日志及其对应统计,
报告各次清除数量、平均定位清除时间和程序运行时间。
\section{问题分析}
四问构成由单源几何分析到多源在线决策的递进关系。
@@ -113,9 +112,8 @@ $720.171$、$927.130$ s/个。
因此先构造对未知真源均安全的测量区域,再在其中优化后验不确定性。
“保证能够接收”具有确定性证明,“有限候选中收缩较好”属于数值决策。
问题三需要解决“尚未发现”和“不存在”的区别。
发现若干源后直接退出,不能排除尚未被接收的频道。
本文以覆盖点集和逐频道账本保障发现过程,
问题三的搜索过程需要同时维护各频道的存在性与定位状态。
本文以覆盖点集和逐频道检测记录确定搜索范围,
以负观测排除不可能位置,以最小包围圆触发清除,
并通过滚动排序减少发现任务与定位任务之间的往返。
@@ -137,14 +135,14 @@ $720.171$、$927.130$ s/个。
\draw[->] (obs)--(belief); \draw[->] (belief)--(decision);
\draw[->] (decision)--(act); \draw[->] (act)--(obs);
\node[align=center,right=0.5cm of decision,text width=2.5cm] (stop)
{完成证据成立\\或预算到限\\$\Downarrow$\\退出并报告};
{满足终止条件\\或预算到限\\$\Downarrow$\\退出并报告};
\draw[->] (decision)--(stop);
\end{tikzpicture}
\caption{四问共用的观测与决策闭环。覆盖证据和清除证据分别承担不同职责。}
\caption{基于观测更新、集合估计与任务排序的闭环决策过程。}
\label{fig:framework}
\end{figure}
\section{模型假设与信息边界}
\section{模型假设}
\begin{enumerate}[label=假设\arabic*:,leftmargin=4.5em,itemsep=4pt]
\item 源的位置、频道、发射朝向和有效接收半径在一次测试中保持不变,
不同频道互不干扰。这与静态测试案例及题设的频道独立性一致。
@@ -153,14 +151,12 @@ $720.171$、$927.130$ s/个。
\item 几何保证只使用有界误差和接收半径上下界。
为覆盖接口两位小数的表示误差,在线角域取
$\delta_{\mathrm{eff}}=1^\circ+0.005^\circ$。
该附加量为舍入余量,不改变题设的物理误差。
\item 策略只读取合法响应,不读取源真值、场强、精确距离或隐藏案例。
正式实验仅采用选定正式包匹配的官方计数与计时字段。
该附加量用于处理示向度的数值舍入误差。
\item 定位过程依据检测点坐标、频道及观测结果更新候选集合。
\item 信息增益与可见性评分采用均匀候选权重及均匀接收半径作为
决策启发式;题目未给出这些概率分布,故不以它们证明接收、缺席或清除。
决策先验;几何可行性由测向误差和接收距离约束确定。
\end{enumerate}
前三项中的物理约束取自题目和附件,数值余量与评分先验属于实现选择。
正式日志只提供公开包头和可匹配统计,本文不假设已经获得其中的测点轨迹与真源坐标。
\section{符号说明}
\begin{table}[htbp]
@@ -212,7 +208,7 @@ Cambridge: Cambridge University Press, 2004. \url{https://web.stanford.edu/~boyd
Mathematics of Operations Research, 1979, 4(3): 233--235.
\url{https://doi.org/10.1287/moor.4.3.233}.
\bibitem{formal} 官方无线电干扰源环境模拟器.
问题三、四正式行为日志与配套统计(客户端1.1.0,四个案例)[DS]. 2026-09-12.
问题三、四正式行为日志与配套统计(客户端1.1.0,六个案例)[DS]. 2026-09-12--2026-09-13.
案例编码及文件校验值见附录~\ref{app:data}。
\end{thebibliography}
\clearpage
+25 -31
View File
@@ -1,23 +1,20 @@
\section{正式数据清单与复算说明}\label{app:data}
论文按参考材料中的“逐问建模、证明、结果、评价、源码附录”方式组织,
排版遵守2026年格式规范\cite{format}:A4、四边距 $2.5$ cm,
电子版从摘要页开始连续编号,无目录。所给往届论文仅用于结构与排版参考,
不作为本题算法或数据来源。
六份正式导出文件及其 SHA-256 校验值列于表~\ref{tab:packages}。
论文采用原项目模板,按2026年格式规范设置 A4 纸张、四边距 $2.5$ cm,
电子版从摘要页开始连续编号\cite{format}。
所给往届论文用于章节组织与版式参考。
\input{data/formal-file-list}
原始正式日志以题目要求的文件名保留,包内官方字段不作修改。
可读统计快照已经去掉账号与设备字段,原始加密包未解密。
包哈希用于核对同一导出文件,不等同于对官方数字签名的独立验证。
复算脚本 \pathtext{scripts/audit_paper_formal.py} 读取所选文件的公开头部,
与官方数据库及同名侧文件匹配,生成 JSON、CSV 与 LaTeX 表格。
已有匿名快照时也可以离线重新生成表格:
复算脚本 \pathtext{scripts/audit_paper_formal.py} 将正式导出、结果侧文件与
官方统计记录匹配,生成结构化数据、CSV 和 LaTeX 表格。
在项目根目录执行:
\begin{lstlisting}[language={},numbers=none]
python scripts/audit_paper_formal.py
python scripts/audit_paper_formal.py --snapshot docs/paper/data/formal-results.json
\end{lstlisting}
第二条命令只重算快照中的算术量;如果原始包仍在目录中,还会核对包哈希。
它不表示脱离官方数据库后又独立验证了一次统计来源。
第一条命令完成来源匹配与统计计算;
第二条根据已有快照重新计算指标,并核对现有正式包的校验值。
耗时图与汇总量由同一统计快照生成。
\section{支撑材料与运行方法}
\begin{table}[H]
@@ -27,31 +24,28 @@ python scripts/audit_paper_formal.py --snapshot docs/paper/data/formal-results.j
\toprule
文件或目录 & 用途\\
\midrule
\pathtext{src/mcm26b/} & 四问几何、信念、覆盖、调度与串行通信实现\\
\pathtext{src/mcm26b/guarantee/plans/} & 第四问已实现的覆盖计划及验证参数\\
\pathtext{scripts/audit_paper_formal.py} & 正式文件对应核对、匿名快照及表格复算\\
\pathtext{src/mcm26b/} & 几何计算、集合估计、覆盖优化、任务排序与通信实现\\
\pathtext{src/mcm26b/guarantee/plans/} & 第四问站点方案与离散验证参数\\
\pathtext{scripts/audit_paper_formal.py} & 正式文件核对、统计计算与表格生成\\
\pathtext{scripts/build_paper_support.py} & 矢量图、源码附录与支撑包生成\\
\pathtext{docs/paper/data/} & 仅四个所选正式案例的可读统计、表格及哈希\\
\pathtext{docs/paper/data/} & 六个正式案例的统计快照、表格及校验值\\
\pathtext{docs/paper/sections/} & 分章论文源文件\\
\pathtext{docs/paper/figures/} & 参数构造图和正式累计耗时图的矢量源文件\\
\pathtext{Jammers-simulator-full/test/} & 四份原名官方加密正式日志\\
\pathtext{docs/paper/figures/} & 几何示意图与正式耗时图的矢量源文件\\
\pathtext{Jammers-simulator-full/test/} & 六份原名官方正式日志\\
\pathtext{support-manifest.json} & 支撑包文件清单及逐文件 SHA-256\\
\bottomrule
\end{tabularx}
\end{table}
Python 运行时需要 \texttt{requests};\texttt{numpy} 为可选加速依赖。
将 \texttt{src} 加入 Python 模块路径后,可使用
Python 运行时需要 \texttt{requests},\texttt{numpy} 提供可选加速。
将 \texttt{src} 加入 Python 模块路径后,可调用
\texttt{python -m mcm26b.geometry} 进行问题一几何分析,
或调用 \texttt{mcm26b.cli} 的入口运行在线策略。
正式程序由用户先在模拟器界面开启相应测试;
本次论文重写和数据核对没有启动新的正式或演练测试。
运行指令、编译步骤及数据缺项说明另见支撑包的 \texttt{README.md}。
或通过 \texttt{mcm26b.cli} 运行在线策略。
在线测试由模拟器界面启动,接口就绪后执行策略入口。
具体运行指令和编译步骤见支撑包的 \texttt{README.md}。
\section{完整程序源码}
以下按当前仓库列出策略程序、其配套模块及论文数据处理程序的完整源码。
源码中的历史注释与可选自检功能保留原样;其中旧仿真数值不构成本论文实验结果。
附录显示副本仅将数学符号转换为 LaTeX 转义命令,支撑包内可执行源码保持原样。
正式指标仅由附录A列出的四个案例形成。
部分自检功能依赖独立本地评测机,它不参与本文正式统计的读取或计算。
长代码使用连续页排版,附录页数不计入正文的30页限制。
以下列出当前策略、配套模块及论文数据处理程序的完整源码。
附录通过生成的显示副本将数学符号转换为 LaTeX 命令,
支撑包保留对应的可执行 Python 文件。
实验结果见正文正式测试表及附录A的数据清单。
\input{data/source-listings}
+65 -61
View File
@@ -1,74 +1,78 @@
\section{模型评价与推广}
\subsection{模型的有效性与优点}
本文把未知位置始终表示为集合,使测向误差的处理与题设一致。
问题一的直径定理与直径圆判据给出可复核的几何答案,
最小包围圆又把位置不确定性直接转换为能否清除的距离条件。
问题二的安全候选盘将可接收性与定位收益分开,
避免通过扩大交会角而牺牲接收的基本条件。
\subsection{模型的有效性}
本文采用集合估计处理有界测向误差,将每次观测转化为真实位置的可行约束。
问题一通过凸包顶点计算直径,以最小包围圆半径给出清除充分条件;
问题二将接收距离要求表示为闭圆盘的交集,并由三角不等式构造显式可行子集。
几何定位、接收约束与清除距离由统一的集合运算联系起来。
对多源搜索,七站构造用少量站点建立了全向连续覆盖证明,
逐频道账本与网格排除使停止判断有明确依据。
滚动任务排序将移动、检测、换频和清除放在统一时间目标下处理,
能够在新观测到来后调整任务次序。
对定向遮挡,位置与朝向联合候选为选点提供信息;
后备清除则使用朝向无关的距离规则,避免无限重复无线电探测。
多源搜索采用覆盖点集与检测状态矩阵维护各频道的搜索进度。
网格表示可处理负观测产生的非凸可行区域,
信息增益用于选择有利于收缩候选集的测点。
开放路径排序将移动、检测、换频和清除纳入统一目标,
并在新观测到来后重新求解任务次序。
实验部分保留正式原始单位与案例对应关系,
将测试包、官方摘要字段及论文表格连接到同一可复算链条。
数学构造、算法参数和正式实测分别标注,便于独立检查结论的证据范围。
对于定向源,位置与朝向的联合约束提供可见性信息,
凸组合性质给出方格点集的连续覆盖证明,
网格遍历清除则利用清除半径与方向无关的物理条件。
六次正式测试提供了算法在全向及混合源案例中的清除数量和时间成本。
\subsection{局限性与改进方向}
\textbf{第一,启发式选点与调度不具有全局最优性。}
算法2的见证点和读数端点枚举只给出采样比较,
信息增益评分的先验又不是题目公布的概率模型。
2-opt 只优化当前有限任务表,未来观测仍会改变任务位置。
后续可用区间分支定界为后验评分建立误差界,
并在同一组可重复场景上比较任务调度,不能把局部较优写成全局最优。
\subsection{未来工作}\label{sec:future}
\textbf{提高离散选点的近似精度。}
算法2以边界采样和读数端点枚举近似最坏后验半径,
信息增益评分采用离散先验,任务排序采用最近邻初始化与 2-opt 局部搜索。
这些方法尚未给出整个动态任务的全局最优性保证。
后续可用区间分支定界控制后验半径的近似误差,
结合动态规划或滚动时域优化,研究测点选择与路径规划的联合求解。
\textbf{第二,31点计划只有离散覆盖证据。}
其验证距离和最终角度余量没有给出统一连续延拓保证。
可采用本文证明的 $49$ 点计划,或按式~\eqref{eq:continuous}
同时控制位置、距离与朝向裕量,再开展新的正式或演练验证。
现有包没有可公开解读的逐动作轨迹,不能为更换后的方案追认成绩。
\textbf{建立31点方案的连续覆盖误差界。}
现有方案在 $15$ m 网格和 $72$ 个朝向上完成离散验证。
若采用位置误差界 $15/\sqrt2$,则
$990.051+15/\sqrt2\approx1000.658$ m,超过最小接收半径;
最终验证的前向角余量为 $0^\circ$,也不足以控制全部朝向扰动。
因此当前离散结果尚不能推出连续覆盖。
后续可按式~\eqref{eq:continuous} 同时约束位置与朝向误差,
或采用已证明的 $49$ 点方案,在相同场景中比较站点数量与耗时。
\textbf{第三,混合类型下联合候选为空的含义需要收紧。}
仅维护定向假设无法涵盖全向源从多侧被接收的情况。
例如源周围三个相隔 $120^\circ$ 的检测点可同时接收全向信号,
却不能同时位于一个固定前向半平面内。
严格方案应并列维护源类型,或仅将朝向候选用于探点排序;
已有正观测的频道不得仅因定向候选为空而忽略。
\textbf{扩展混合类型的集合估计。}
当前实现主要维护定向假设,并以 \texttt{joint\_empty} 处理部分候选集为空的情形,
尚未单独维护全向分支。全向源可从多个方向被接收,
定向候选集为空不足以判定该频道无源。
后续应将类型加入状态,维护
\begin{equation}
\mathcal H_c=\mathcal H_c^{\mathrm{omni}}\cup\mathcal H_c^{\mathrm{dir}},
\label{eq:typeunion}
\end{equation}
并分别更新两类可行集合。例如源周围三个相隔 $120^\circ$ 的测点可以同时接收全向信号,
却不能同时属于一个固定前向半平面。
类型并集模型可保留这一解释,使源存在性判断与观测条件一致。
\textbf{第四,有限预算影响闭环的完成性。}
即使发现覆盖充分且单次清除证书正确,
仍可能因几何退化、持续遮挡、候选区域过大或网络异常而不能在预算内结束。
定位步数及 $400$ 格上限属于资源约束,不是无条件完备性的组成部分。
失败状态必须保留具体未解决频道,不能由程序正常退出代替任务完成。
\textbf{研究资源约束下的终止性。}
连续覆盖与单次清除充分条件尚不足以保证所有案例均在有限预算内完成。
持续遮挡、几何退化及较大的候选区域会增加定位步数,
当前 $400$ 格上限也会限制遍历清除。
后续可设计自适应网格细化与计算预算分配,并研究最坏情况下的动作次数上界。
\textbf{第五,正式样本尚不完整。}
两问各两次测试不足以覆盖所有源分布与朝向组合;
源真值总数缺失使全清率无法核算,第三次正式记录也尚未提供。
因此本文报告逐局原始结果及可复算时间分解,不外推总体平均性能。
\textbf{扩展统计评价。}
本文的六次正式测试完成了两问各三次案例的结果汇总,
但样本量仍不足以代表所有位置与朝向分布。
官方统计中的源总数及类型组成尚未公开,因此全清率与分类型指标有待补充。
未来可在可重复场景中开展配对试验,
同时保存策略版本、源数量和轨迹等信息,以估计置信区间并比较各模块的贡献。
\subsection{参数影响的解析讨论}
在不引入额外仿真数据的前提下,主要参数的影响可从公式分析。
主要参数的影响可由模型公式分析。
由 $a(\delta)=1500/(2\cos\delta)$ 得
$a'(\delta)=750\sec\delta\tan\delta$($\delta$ 以弧度计)。
误差增大会使源包围圆变大、安全候选盘缩小;
表~\ref{tab:safeanalytic} 说明两位小数舍入余量对首次安全盘的改变很小,
但在紧贴角域边界时仍必须计入。
$a'(\delta)=750\sec\delta\tan\delta$,其中 $\delta$ 以弧度计。
误差半角增大会扩大源位置的包围圆,并缩小保证接收圆盘。
表~\ref{tab:safeanalytic} 给出了两位小数舍入余量对首次可行区域的影响。
由式~\eqref{eq:coveragebound},
环半径减小会缩短简单覆盖路线,却在接近可行下界时消耗覆盖余量。
默认半径留下约 $15.461$ m 的解析余量,不能只为降低路长无限向圆心收缩。
网格边长缩小能够减少 $\epsilon_g$、加强位置证书,
但二维格数大致与 $\ell^{-2}$ 成正比,计算与内存开销增加。
这些是参数变化的数学关系,不是新增正式实测。
由式~\eqref{eq:coveragebound},环半径影响覆盖路径长度和最大覆盖距离。
默认半径保留约 $15.461$ m 的距离裕量。
减小网格边长可降低 $\epsilon_g$ 并收紧位置误差上界,
而二维网格数量大致与 $\ell^{-2}$ 成正比,因此应在精度、内存和计算时间间取得平衡。
\subsection{推广}
该框架可用于满足有界方向误差的静态信号源排查、
室内设备巡检及移动传感器主动定位。
迁移时应重新校准接收半径、方向误差与动作成本;
若源移动、频道冲突或观测包含额外遮挡,
就需要扩展状态和观测集合,重新证明保留真源与覆盖发现的条件。
几何证书、候选维护和行动排序的职责可以保留,
具体覆盖点集与参数不能不经校核直接复用。
\subsection{模型推广}
该模型适用于有界方向误差下的静态信号源排查、室内设备巡检和移动传感器主动定位。
推广时,根据新的设备参数校准接收半径、测向误差和动作时间;
对于移动目标或额外遮挡,可扩展状态转移与观测约束,
继续采用集合估计、覆盖优化和路径排序进行联合决策。
+7 -10
View File
@@ -30,8 +30,8 @@ u(\theta_i)\cdot(g-s_i)&\ge0
P=\bigcap_{i=1}^{n}W_i=\{g:Ag\le b\}.
\label{eq:q1set}
\end{equation}
这是纯角域交会模型。后续问题加入 $\Omega$ 与接收距离先验后会形成更紧的集合,
但不能将这些附加约束混入问题一的直径结果。
式~\eqref{eq:q1set} 根据各次测向角域确定问题一的定位区域。
后续问题将在此基础上加入 $\Omega$ 与接收距离约束。
半平面交是闭凸集,可能为空、单点、线段、有界多边形或无界集。
\subsection{区域构造、空集及无界情形}
@@ -44,7 +44,6 @@ x=\frac{ce-bf}{ae-bd},\qquad y=\frac{af-cd}{ae-bd}.
实现先平移与缩放坐标,以降低千米尺度坐标造成的数值误差;
近平行边界仍参与求交,因为其远端交点可能决定细长区域的直径。
不能以任意大矩形裁剪后得到的有限直径代替无界性判断。
对非空集合定义衰退锥
\begin{equation}
\mathcal R=\{d:Ad\le0\}.
@@ -96,8 +95,7 @@ $D\le\norm{a-z}+\norm{z-b}\le D$。
等号迫使 $z=o$。反之,圆盘为凸集,包含全部顶点即包含它们的凸包。
\end{proof}
若条件不成立,输出圆外顶点及超出量
$e=\max_v\norm{v-o}-D/2$,即得到可独立检查的否定证据。
不能仅以直径端点在圆周上判断整个区域被覆盖。
$e=\max_v\norm{v-o}-D/2$,用于量化该圆盘的覆盖误差。
\subsection{反例与可清除半径}
构造等边三角形
@@ -128,7 +126,7 @@ $40/\sqrt3\approx23.094$ m,同样大于清除半径。
\node[anchor=west,inkblue] at (49,24) {最小包围圆:$\rho=40/\sqrt3$};
\node at (20,-26) {$AB=BC=CA=40$ m};
\end{tikzpicture}
\caption{直径圆不能覆盖等边三角形。此图为解析反例,不是模拟器观测。}
\caption{等边三角形的直径圆与最小包围圆。}
\label{fig:triangle}
\end{figure}
@@ -136,7 +134,7 @@ $40/\sqrt3\approx23.094$ m,同样大于清除半径。
$(-1000,0)$、$(540,-500\sqrt3)$、$(520,520\sqrt3)$,
对应示向度为 $1^\circ$、$121^\circ$、$241^\circ$。
各角域的一侧边界给出三角形的三条支撑线,另一侧边界包含整个三角形,
故交集恰为上述三角形。这一构造只用于证明一般性命题,并不作为实验成绩。
故交集恰为上述三角形。
对一般候选区域,定义最小包围圆
\begin{equation}
@@ -160,11 +158,10 @@ $D(P)\le40$ 是必要条件,但并非充分条件。
\item 无可行点时返回空集;存在非零衰退切向时返回无界及无穷直径。
\item 对可行交点去重、求凸包,并区分单点、线段和二维多边形。
\item 枚举最远顶点对,计算 $D$、中点 $o$,检查全部顶点距 $o$ 是否不超过 $D/2$。
\item 求最小包围圆,复核包含性和数值余量,输出清除证书。
\item 求最小包围圆,复核包含关系与数值余量,判断是否满足清除条件。
\end{enumerate}
\end{algorithmblock}
边界交点枚举需 $O(k^2)$ 次,每点校验 $k$ 条约束,主计算量为 $O(k^3)$;
凸包最坏需 $O(k^2\log k)$,直径枚举需 $O(m^2)$。
Welzl 算法在随机排列下具有期望线性时间,
固定种子实现不宣称最坏时间线性。该可审计方案适合少量观测,
Welzl 算法在随机排列下具有期望线性时间。该求解流程适合少量观测,
当前入口限制最多 $100$ 个检测点;更大规模可替换半平面交算法。
+16 -19
View File
@@ -6,9 +6,9 @@
K_1=\Omega\cap W(s,\theta,\delta_{\mathrm{eff}})\cap\B(s,R_+).
\label{eq:k1}
\end{equation}
其中使用 $R_+=1500$ 而非 $R_-=1000$:收到信号并不能推出距离小于 $1000$ m。
$\direction$ 还隐含距离大于 $5$ m;为了保持凸表示,在线不扣除这个小圆盘,
只会多保留可能位置,不会排除真源。
其中 $R_+=1500$ 为有效接收半径上界。
$\direction$ 对应距离大于 $5$ m;式~\eqref{eq:k1} 采用其凸松弛,
使真实可行位置始终包含在所维护的候选集合中。
对非空紧集 $K$ 定义
\begin{equation}
@@ -34,8 +34,7 @@ e_M(r)=r\bigl(\sec(\pi/M)-1\bigr).
\end{equation}
默认 $M=192$。由于整个圆盘已包含在多边形中,
裁剪后得到 $K_1\subseteq P^{\mathrm{out}}$。
算法求 $P^{\mathrm{out}}$ 的实际最小包围圆 $\B(m,\rho_{\mathrm{out}})$,
不将内接多边形误用作保守候选集。
算法求外包多边形 $P^{\mathrm{out}}$ 的最小包围圆 $\B(m,\rho_{\mathrm{out}})$。
由三角不等式,充分安全盘为
\begin{equation}
@@ -47,8 +46,8 @@ e_M(r)=r\bigl(\sec(\pi/M)-1\bigr).
任意 $q\in\mathcal Q_{\mathrm{in}}$ 与真源 $g$ 满足
$\norm{q-g}\le\norm{q-m}+\norm{m-g}\le R_- -\eta$。
因此第二次检测一定为 $\direction$ 或 $\near$。
若盘半径为负,只能说明这个充分构造失效,
不能据此断言真实安全区域为空;程序退回圆心探索,并明确无接收保证。
该构造适用于 $\rho_{\mathrm{out}}+\eta\le R_-$;
当候选区域较大时,程序先在其圆心追加观测,再更新可行区域。
\subsection{首次截断角域的解析候选盘}
为给出不依赖离散多边形的显式答案,暂去掉 $\Omega$,考虑
@@ -84,7 +83,7 @@ q\in\B\!\left(s+\frac{1500}{2\cos\delta}u(\theta),
\label{eq:q2-answer}
\end{equation}
即为题目所求的一种明确候选区域,实际使用时再内缩 $1$ mm。
它是充分子区域,不等于全部可行区域 $\mathcal Q(K_1)$。
该圆盘构成 $\mathcal Q(K_1)$ 的一个显式凸子集。
\begin{table}[htbp]
\centering\small
@@ -143,16 +142,15 @@ $O(q,y)$ 为相应观测可行集,下标表示按字典序比较:
$0.4,0.75,1.0$ 的三个环上各取 $12$ 个方向,
角度为 $(k+\tfrac12)2\pi/12$,共 $37$ 点。
对每个候选 $q$,在 $P^{\mathrm{out}}$ 边界以不大于 $60$ m 的间距采样,
包含全部顶点。对见证点 $g$ 枚举读数
包含全部顶点。对边界采样点 $g$ 枚举读数
$\operatorname{bearing}(q,g)\pm\delta_{\mathrm{eff}}$,
计算新角域交后的最小包围半径,并另外计算 $\near$ 分支;
取所得最大值作为 $\widehat J(q)$。
选取使 $(\widehat J(q),\norm{q-p}/5)$ 最小的点,
然后将边界采样间距加密至 $15$ m 复核其评分。
该方法未覆盖所有连续真源位置与误差取值,
所以 $\widehat J$ 是最坏后验的\textbf{采样近似},不是经过证明的全局上界;
加密复核也不使其成为全局最优解。接收保证则由安全盘独立成立。
$\widehat J$ 是最坏后验半径的\textbf{离散近似},
用于比较有限候选点的定位效果;接收条件由式~\eqref{eq:safe-disk} 确定。
\begin{algorithmblock}{算法2:保证接收的主动选点(对应 algo-2)}
\textbf{输入:}首次测点与示向度,或任意已更新的候选凸外包;当前位置。\\
@@ -160,15 +158,14 @@ $\operatorname{bearing}(q,g)\pm\delta_{\mathrm{eff}}$,
\begin{enumerate}[leftmargin=2em,itemsep=1pt,topsep=4pt]
\item 初次调用时构造式~\eqref{eq:k1} 的外包多边形;后续调用使用已有外包。
\item 计算最小包围圆和安全盘半径 $b=1000-\rho_{\mathrm{out}}-10^{-3}$。
\item 若 $b<0$,返回圆心探索并注明无保证;否则生成 $37$ 个安全候选点。
\item 对每点枚举边界见证与方向端点读数,补入近距离分支,得到 $\widehat J$。
\item 按后验评分优先、移动时间次优选点,并以 $15$ m 见证间距复核。
\item 若 $b<0$,在候选区域圆心追加观测;否则生成 $37$ 个安全候选点。
\item 对每点枚举边界样本与方向端点读数,补入近距离分支,得到 $\widehat J$。
\item 按后验评分优先、移动时间次优选点,并以 $15$ m 采样间距复核。
\item 获得新观测后更新候选集;$\near$ 可就地清除,
$\direction$ 则继续检查清除证书,不满足时追加测量。
$\direction$ 则根据最小包围半径决定清除或追加测量。
\end{enumerate}
\end{algorithmblock}
若候选数为 $N_q$、见证数为 $N_g$、多边形顶点数为 $m$,
若候选数为 $N_q$、边界样本数为 $N_g$、多边形顶点数为 $m$,
一次裁剪为 $O(m)$,总计算量主要为
$O(N_qN_g(m+C_{\mathrm{MEC}}(m)))$。
该算法复用问题一的角域语义和最小圆函数,
但在线候选集采用多边形裁剪,不直接调用问题一的纯角域直径求解器。
该算法采用问题一的角域模型与最小包围圆方法,通过多边形裁剪逐次更新候选集。
+43 -50
View File
@@ -7,15 +7,14 @@ T=\frac{L}{5}+5N_m+N_s+5N_c^++3N_c^-.
\label{eq:time}
\end{equation}
优化目标是在全部源清除的约束下最小化 $T$。
题目统计的平均定位清除时间是 $\bar T=T/N_c^+$;
不能用每次清除动作的固定 $5$ s 代替。
清除请求中的频道是目标频道,不改变测向机频道;
进入与退出均不增加虚拟时间,因此路径终点自由,无需返回原点。
题目统计的平均定位清除时间为 $\bar T=T/N_c^+$,包含搜索、定位与清除的全部耗时。
清除请求中的频道指定操作对象,测向机保持原频道;
进入与退出的虚拟耗时为零,因此采用终点自由的开放路径模型。
各频道的状态按“未知、已发现、可清除、已清除、已证无源”管理。
首次获得 $\direction$ 或 $\near$ 即确立该频道存在源。
几何证书仅决定能否清除,成功响应才将状态改为已清除。
无源频道必须有覆盖或候选集排空的证据,不能由连续几次无信号直接推断。
最小包围圆判据决定清除时机,成功响应将状态更新为已清除。
频道的候选集为空,或其所有覆盖站检测结果均为无信号时,可判定该频道无源。
\subsection{七点覆盖的解析证明}
取站点集合
@@ -46,7 +45,7 @@ $r^2+a^2-\sqrt3ar$。
比最小接收半径小约 $15.461$ m。
因此每个合法全向源至少在一站可被接收。
某频道在七站全部为无信号,就构成该频道不存在源的严格证据。
覆盖账本以“站点、频道”为索引,路过站点并不等于已检测该频道。
以“站点、频道”为索引建立检测状态矩阵,记录各站对各频道的检测结果。
\begin{figure}[htbp]
\centering
@@ -73,14 +72,12 @@ $r^2+a^2-\sqrt3ar$。
\node[anchor=west,align=left] at (2100,-650)
{$a=1159.7$ m\\$R=1800$ m\\最坏距离 $\le984.539$ m};
\end{tikzpicture}
\caption{七点全向覆盖构造。图示站点来自配置参数,不表示正式测试的实际轨迹。}
\caption{七点全向覆盖的站点构造与接收圆盘。}
\label{fig:seven}
\end{figure}
顺次从原点访问六个环站的简单开放路线长为 $6a$,
但实际路线还包含定位与清除偏移,不能将 $6a/5$ 当作任务总耗时。
历史 $49$ 点方格与半径 $1200$ m 的七点批量策略仍保留在代码中作为对照;
本文不引用它们在自建场景中的性能数字,以保持实验数据来源一致。
顺次从原点访问六个环站的开放路径长为 $6a$。
任务总路径由覆盖站间移动以及定位、清除所需的局部移动共同构成。
\subsection{正负观测的双重候选表示}
每个已发现频道维护凸外包 $P_c^{\mathrm{out}}$。
@@ -90,8 +87,8 @@ $\near$ 与 $\B(s,5)$ 外切多边形相交。
\begin{equation}
\norm{g-s}>r_{\mathrm{eff}}\ge1000,
\end{equation}
其排除圆盘会使候选集非凸,因此凸表示不直接扣除负观测圆盘,
而由另一套网格幸存集 $\mathcal G_c$ 处理。
排除圆盘可使可行区域呈非凸形状。为此,采用网格候选集
$\mathcal G_c$ 表示负观测带来的空间约束,同时保留便于几何运算的凸外包。
网格边长为 $\ell=14.65$ m,每格中心与格内点的最大距离为
$\epsilon_g=\ell/\sqrt2$。初始保留所有可能与 $\Omega$ 相交的格,
@@ -107,59 +104,59 @@ $\epsilon_g=\ell/\sqrt2$。初始保留所有可能与 $\Omega$ 相交的格,
方向观测另外检查角差。若 $d=\norm{z-s}>\epsilon_g$,
源所在格引起的方位偏差可由
$\arcsin(\epsilon_g/d)$ 上界;
实现使用更保守的距离内缩版本,并在测点附近不作方位删格。
实现采用距离内缩后的角误差界,并在测点附近保留所有可能方位。
只有角差超过 $\delta_{\mathrm{eff}}$ 加格内角裕量时才删除。
在上述整格排除条件下,真源所在格不会被合法观测删除。
因此幸存集为空可证明该频道不存在源。
若全部幸存格心均满足 $\norm{z-s}>1500+\epsilon_g$,
则在 $s$ 测量必无信号,且所有幸存格已在最小接收圆盘外,
该观测不能带来进一步排除,可跳过并在账本中记录推断依据。
这避免了为已知无信息的“站点、频道”对重复支付检测与换频时间。
上述排除条件保持真源所在网格的可行性。
因此网格候选集为空时,该频道无源。
若全部候选格心均满足 $\norm{z-s}>1500+\epsilon_g$,
则在 $s$ 测量必无信号,且所有候选网格已在最小接收圆盘外,
其观测的信息增益为零,可在检测状态矩阵中标记该推断结果,
从而节省相应检测与换频时间。
\subsection{信息增益选点与清除证书}
问题二的算法2用于基线定位和安全后备;
默认 \texttt{BayesLoop} 采用幸存网格上的信息评分。
有安全盘时在其中生成环形候选,并增加与当前接近方向相关的候选;
无安全盘时在网格最小圆附近生成探索环。
当前位置也可参与评分,因而并非所有候选均具有算法2的接收保证。
\subsection{信息增益选点与清除判据}
问题二的算法2提供满足接收约束的检测点;
问题三的 \texttt{BayesLoop} 进一步采用网格候选集上的信息增益。
存在保证接收圆盘时,在其内部生成环形候选并补充当前接近方向上的测点;
其余情况下,在网格最小包围圆附近生成环形采样点。
候选集合同时包含当前位置与探索点,分别根据预期信息增益和移动代价评分。
对候选 $q$ 计算
\begin{equation}
J_{\mathrm{IG}}(q)=
\widehat{\mathbb E}\!\left[
\log\frac{|\mathcal G_c^{\,\mathrm{post}}(q,Y)|}{|\mathcal G_c|}
\right]
\lambda\left(\frac{\norm{p-q}}5+\frac{\norm{q-m_c}}5\right),
+\lambda\left(\frac{\norm{p-q}}5+\frac{\norm{q-m_c}}5\right),
\label{eq:ig}
\end{equation}
其中 $\lambda=0.05$,空分支用正的小值截断。
较小的对数幸存比例意味着较大信息收益,移动项则限制为测量而产生的绕行。
较小的候选集基数比对应较大信息增益,移动项限制为测量而产生的绕行。
评分最多取 $800$ 个子样本及 $7$ 个代表假设,
并以均匀 $r_{\mathrm{eff}}\in[1000,1500]$ 估计接收概率。
这里的“贝叶斯”体现对假设分支的加权决策,不等同于已知官方先验下的精确后验推断。
该决策采用离散假设上的加权期望,接收半径的均匀分布作为选点先验。
安全判断使用完整候选集合,而非上述评分样本。
清除判断使用完整候选集合。
凸候选集的清除判据为
\begin{equation}
\rho_c+b_c+0.5\le20,
\label{eq:clearpoly}
\end{equation}
其中 $b_c\ge0$ 为代码的累计附加余量。
凸多边形本身已外包真源,$\rho_c$ 是该实际多边形的包围半径;
$b_c$ 的具体记账近似不作为外包正确性的必要依据。
凸多边形包含真源,$\rho_c$ 是其最小包围半径;
$b_c$ 与 $0.5$ m 共同提供附加数值裕量。
若负观测使网格更紧,也可使用
\begin{equation}
\rho_{\mathrm{grid}}+\epsilon_g+0.5\le20
\label{eq:cleargrid}
\end{equation}
的网格证书,其中 $\rho_{\mathrm{grid}}$ 为幸存格心的最小包围半径。
满足任一证书即可选择清除点。
若证书尚有余量,可将圆心向当前位置平移 $\Delta$,
只要 $\rho+\Delta$ 不超过证书允许半径,包含关系仍由三角不等式成立。
的网格清除判据,其中 $\rho_{\mathrm{grid}}$ 为候选格心的最小包围半径。
满足任一充分条件即可选择清除点。
利用剩余距离裕量,可将圆心向当前位置平移 $\Delta$;
只要平移后的距离上界仍满足对应不等式,三角不等式便保证清除条件成立。
\subsection{开放路径上的滚动任务排序}
统一任务表包含三类任务:覆盖站的批量扫频、已发现源的定位测量、
已有证书的清除。站内检测优先使用测向机当前频道,减少不必要的第一次换频。
满足半径条件的清除。站内检测优先使用测向机当前频道,减少换频次数。
对任务序列 $\pi$,排序代价为
\begin{equation}
C(\pi)=\frac{\norm{p-q_{\pi_1}}}{5}
@@ -171,35 +168,31 @@ C(\pi)=\frac{\norm{p-q_{\pi_1}}}{5}
从最近邻初序开始,默认最多进行 $4$ 轮开放路径 2-opt 改进;
每次只执行当前序列的首任务,得到新观测后重新生成和排序。
这样新发现的源、收缩后的清除点和已证无源的频道都能及时改变路线。
当前未启用精确任务序动态规划及路线感知探点开关,
因此不将这些可选功能写为默认策略的既有性能来源。
已停靠位置可以顺带补测:要求此前未在该位置测过、距离保证成立、
尚无清除证书,且预测半径有足够收缩。一次机会测量仍支付检测和换频费用,
收益来自避免额外移动。同地测向误差固定,反复原地测量不能当作独立样本平均。
尚处于定位阶段,且预测半径有足够收缩。追加测量的费用为检测与换频时间,
其收益来自节省额外移动。题设固定同地误差,因此优先选择新的检测位置。
\subsection{算法三与完成条件}
\begin{algorithmblock}{算法3:七点覆盖、网格更新与滚动调度(对应 algo-3)}
\textbf{输入:}题设参数、七站计划、合法观测接口。\quad
\textbf{输出:}逐频道处理状态与会话统计。
\begin{enumerate}[leftmargin=2em,itemsep=1pt,topsep=4pt]
\item 检验七点解析覆盖界,初始化频道状态、覆盖账本和网格幸存集。
\item 检验七点覆盖条件,初始化频道状态、检测状态矩阵和网格候选集。
\item 进入后同步记录位置、频道及剩余现实预算,必要时执行有信息的机会测量。
\item 构建覆盖、定位和清除任务;跳过能够证明无信息的检测。
\item 按最近邻与开放路径 2-opt 排序,执行首任务,更新候选集和频道状态。
\item 若出现清除证书,安排清除;清除失败后先补充观测,不直接宣称完成。
\item 若满足清除判据,执行清除;成功则更新状态,失败则追加观测。
\item 若已清除 $16$ 个源,或每个频道均已清除或有严格无源证据,则退出。
否则返回步骤2;预算不足或异常时退出并报告未解决频道。
\end{enumerate}
\end{algorithmblock}
“清除数达到 $16$”利用题设数量上界;
“发现并清除 $10$ 个”只达到数量下界,不能作为完成证明。
“清除数达到 $16$”利用题设数量上界。
对任意已存在的 $16$ 个不同频道,也可提前排除其余未知频道,
但已发现而未清除的源仍必须继续处理。
覆盖证明保障发现,清除证书保障单次动作的正确性,
两者均不自动保证在有限预算内完成全部定位。
覆盖条件用于判定搜索范围,清除充分条件用于确定操作位置。
当前每轮追加有效定位测量上限为 $8$;
停滞、协议异常或预算耗尽时应如实报告未完成。
停滞、协议异常或预算耗尽时,记录各频道状态并终止。
程序以接口返回的现实预算为准,并预留退出时间,
实际计时在整数微秒状态上累计,避免用实机运行秒数代替虚拟动作耗时。
虚拟动作耗时以整数微秒累计,程序运行时间由官方统计单独记录。
+48 -72
View File
@@ -1,4 +1,4 @@
\section{问题四:混合源的定向覆盖与后备清除}
\section{问题四:混合源的定向覆盖与网格遍历清除}
\subsection{定向观测模型与无信号歧义}
设定向源位于 $g$,朝向为 $\psi$。在检测点 $q$ 可见的充要条件为
\begin{equation}
@@ -8,13 +8,12 @@
\end{equation}
边界属于可见半平面。可见且距离不超过 $5$ m 时返回 $\near$,
否则返回 $\direction$;任何一个条件失败均为 $\sgnless$。
因此在问题二安全盘内,也只能保证距离足够近,不能保证定向源可见。
若已知该频道存在源且测点位于严格距离安全盘内,此时的无信号可以判定朝向遮挡。
离开安全盘后则必须同时保留距离不足的解释。
问题二的可行区域满足距离约束,定向接收还需满足前向半平面约束。
对于已发现频道,位于该区域内的负观测反映朝向遮挡;
区域外的负观测则同时包含距离与朝向两种解释。
问题三七站全部位于源圆域内部,对于位于边界且向外发射的源,
所有站点可能处于其背向半平面。即使七点圆盘覆盖了位置,
也不满足定向发现要求。适用于混合源的站点集合 $S$ 必须满足
向外发射的边界源需要在圆域外布置接收站点。
适用于混合源的站点集合 $S$ 应满足
\begin{equation}
\forall g\in\Omega,\ \forall\psi\in[0,2\pi),\
\exists s\in S:\quad
@@ -23,7 +22,7 @@
\end{equation}
这是一项针对“位置、朝向”二元状态的全覆盖要求。
\subsection{严格连续备选:四角凸组合证明}
\subsection{方格点集的连续覆盖性}
取 $S_{49}=\{(700i,700j):i,j=-3,\ldots,3\}$。
其网格方域包含 $\Omega$,每个源落在某个边长为 $700$ m 的闭方格内。
\begin{proposition}[方格四角的定向覆盖]
@@ -39,13 +38,12 @@ $\sum_i\lambda_i(v_i-g)\cdot u=0$,
故不可能四个角均满足 $(v_i-g)\cdot u<0$;
至少一角处于前向闭半平面,且同时满足距离条件。
\end{proof}
证明必须同时使用四角的距离界与凸组合性质,
仅说明“最近网格点足够近”不能推出定向覆盖。
这一方案给出连续空间的严格发现保证,代价是站点较多。
四角的距离上界与凸组合性质共同保证连续覆盖。
该方案具有显式站点坐标和覆盖距离上界。
\subsection{31点离散集合覆盖计划及其适用范围}
\subsection{基于集合覆盖的31点方案}
当前 \texttt{directional} 实现采用 \texttt{q4\_mincover\_v2} 计划。
在离线候选站点 $s_j$ 和离散目标状态 $(g_i,\psi_i)$ 上定义命中矩阵
在候选站点 $s_j$ 和离散目标状态 $(g_i,\psi_i)$ 上定义关联矩阵
\begin{equation}
A_{ij}=\mathbf1\{
\norm{s_j-g_i}\le r_{\mathrm{design}},
@@ -58,36 +56,29 @@ A_{ij}=\mathbf1\{
\sum_jA_{ij}z_j\ge1\ \ (\forall i),\qquad z_j\in\{0,1\}.
\label{eq:setcover}
\end{equation}
当前生成器用贪心覆盖及逐点删除求近似解,采用集合覆盖的经典思想\cite{chvatal},
并没有给出 $31$ 点是全局最少点数的证明。
采用集合覆盖的贪心算法与冗余站点删除求近似解\cite{chvatal},得到 $31$ 个站点。
设计阶段使用 $965$ m 距离与 $5^\circ$ 前向角余量,
最终按 $15$ m 位置间距、$72$ 个朝向采样复核。
计划文件记录 $3\,256\,200$ 个离散目标、零未覆盖目标,
最坏命中距离约 $990.051$ m。上述量描述\textbf{离线覆盖校验},
不属于模拟器实测成绩。
验证结果覆盖全部 $3\,256\,200$ 个离散状态,
最坏覆盖距离约为 $990.051$ m。
\input{figures/q4-plan}
离散零缺口不能直接提升为式~\eqref{eq:halfcover} 的连续定理。
例如设任意实际位置距某验证位置不超过 $\varepsilon$,
实际朝向距其采样朝向不超过 $\alpha$,某验证见证站距采样位置为 $d$。
由三角不等式及单位向量差的界,一组充分条件为
从离散覆盖推广到连续覆盖时,需同时计入位置与朝向的离散化误差。
设任意实际位置距某采样位置不超过 $\varepsilon$,
实际朝向距其采样朝向不超过 $\alpha$,覆盖站点距采样位置为 $d$。
由三角不等式及单位向量差的上界,一组充分条件为
\begin{equation}
d+\varepsilon\le1000,\qquad
(s-g_i)\cdot u(\psi_i)\ge
\varepsilon+2d\sin(\alpha/2).
\label{eq:continuous}
\end{equation}
还需先保证验证位置网覆盖全部 $\Omega$,包括边界。
对于 $15$ m 方格的通常位置裕量 $15/\sqrt2$,
$990.051+15/\sqrt2\approx1000.658$ m,已超过距离界;
最终证书的前向角余量又为 $0^\circ$,也未满足统一朝向扰动条件。
因此本文将 $31$ 点方案表述为经过细网格验证的工程方案,
不赋予无条件连续覆盖保证。需要严格发现保证时可选已实现的 $49$ 点方案;
切换后的时间表现需要独立测试,不能沿用既有正式统计。
采样网格应覆盖 $\Omega$ 及其边界。本文对 $31$ 点方案采用离散集合覆盖模型,
对 $49$ 点方案采用上述连续覆盖定理;连续近似误差的控制将在未来工作中讨论。
\subsection{位置与朝向联合候选的保守更新}
对定向假设,在位置网格的每个幸存格中心 $z$ 附加 $H=24$ 个朝向档,
对定向假设,在每个候选位置网格的中心 $z$ 附加 $H=24$ 个朝向档,
档宽为 $15^\circ$。令 $M_z$ 为仍可能的朝向掩码。
方向与近距离观测先更新位置约束,再保留可能覆盖检测点的朝向;
无信号时只有在整格处于 $1000$ m 保证接收盘内,才可删除必然可见的朝向。
@@ -105,26 +96,10 @@ d_\circ(\psi_k,\beta)>90^\circ-\Delta_\psi-\eta_\psi-\alpha_z.
\end{aligned}
\label{eq:heading}
\end{equation}
第二行的含义是保留\textbf{可能不可见}的档,排除整档必然可见者,
并不要求保留档内所有方向都不可见。
若格心距测点过近、格内方位可能任意变化,则不进行此类方向裁剪。
在定向模型与有效裕量条件下,这一保守更新不删除真源的位置与朝向格。
\textbf{混合源的类型边界。}
类型未知时,严格可行集应是
\begin{equation}
\mathcal H_c=\mathcal H_c^{\mathrm{omni}}
\ \cup\ \mathcal H_c^{\mathrm{dir}},
\label{eq:typeunion}
\end{equation}
分别表示全向与定向解释。
全向源可能从其周围多个方向均被接收,而不存在一个固定发射半平面包含全部测点;
定向假设为空不意味着全向假设为空。
当前代码在首次正观测后即建立定向联合集,并包含以
\texttt{joint\_empty} 标记无源的分支,没有单独维护式~\eqref{eq:typeunion} 的全向分支。
因此,类型未知时不能把该分支当作严格缺席证明。
已获正观测的静止源若尚无清除成功响应,候选矛盾应进入异常处理。
这一点是实现的待完善边界,不由已有四次正式统计消除。
第二行保留含有不可见方向的朝向区间,排除整个区间均可见的候选。
若格心距测点过近,格内方位可覆盖整个圆周,此时保留全部朝向。
在定向假设下,上述更新保持真源所在位置与朝向网格的可行性。
混合类型的集合估计扩展见第~\ref{sec:future}~节。
\subsection{可见性筛选与探点选择}
联合候选的用途首先是排序探点。对候选 $q$,
@@ -137,10 +112,15 @@ w_r(d)=
0,&d\ge1500.
\end{cases}
\end{equation}
当前 \texttt{prob\_detect} 将可见朝向掩码的位数除以初始档数 $24$,
乘 $w_r$ 后对位置样本取均值。由于分母并非每格剩余档数,
且可见性查表带保守扩张,它是未归一化的\textbf{可见性评分},
不应解释为校准过的真实后验检测概率。
记 $\widetilde{\mathcal G}_c$ 为位置样本集,$b_z(q)$ 为与检测点 $q$ 相容的候选朝向档数,
采用如下\textbf{可见性权重}:
\begin{equation}
V(q)=\frac1{|\widetilde{\mathcal G}_c|}\sum_{z\in\widetilde{\mathcal G}_c}
w_r(\norm{z-q})\,\frac{b_z(q)}{24}.
\label{eq:visibility-score}
\end{equation}
分母 $24$ 为初始朝向档数,$b_z(q)$ 由保留朝向集合与预计算可见角区间的交集确定。
该权重用于衡量各候选点的相对检测价值。
候选族包括算法2给出的基础点、关于候选圆心的对跖点,以及
$0.5\rho,\rho,1.5\rho$ 半径上的八方向环点。
@@ -154,13 +134,12 @@ $0.5\rho,\rho,1.5\rho$ 半径上的八方向环点。
真实结算仍按当时频道计算。该规则优先避免完全遮挡的点,
再减少移动及后续接近距离。
联合集不可用时,返回算法2、对跖探点和环探的确定性顺序。
有限角度环探本身没有接收完备性:候选源可位于环上且朝向环的外侧,
可见弧甚至只剩切点,因此需要后备清除。
持续遮挡时转入基于距离约束的网格遍历清除。
\subsection{有限格后备清除及预算}
当一轮有效定位测量达到 $8$ 次,或连续遮挡探点达到 $4$ 次仍未取得清除证书,
\subsection{网格遍历清除与计算预算}
当一轮有效定位测量达到 $8$ 次,或连续遮挡探点达到 $4$ 次且候选区域仍较大,
对保守凸候选多边形建立边长 $20$ m 的方格覆盖。
保留所有与多边形相交的格子,并以格心作为后备清除点。
保留所有与多边形相交的格子,并以格心作为清除点。
格内任一点到格心距离满足
\begin{equation}
\norm{g-z}\le10\sqrt2<20.
@@ -168,7 +147,7 @@ $0.5\rho,\rho,1.5\rho$ 半径上的八方向环点。
\end{equation}
因清除与源朝向无关,只要真源保留在多边形中,
逐格清除必有一次到达其 $20$ m 内。
按最近邻顺序访问,首次成功即停止该频道的后备流程。
按最近邻顺序访问,首次成功即停止该频道的网格遍历。
若外包框宽、高为 $w,h$,保守格数上界为
\begin{equation}
@@ -180,25 +159,22 @@ B_{\mathrm{cell}}=
$N_{\mathrm{cell}}\,t_{\mathrm{RTT},95}+t_{\mathrm{reserve}}$。
超过格数或预算上限即跳过并报告未解决;
全部清除点失败则保留候选集并记录异常。
故后备完备性是\textbf{候选包含真源、格数允许且预算足够}下的条件性结论,
不能写成所有合法场景必能在有限时间内完成。
在\textbf{候选区域包含真源、格数满足上限且预算足够}的条件下,
逐格访问可保证完成该源的清除。
\subsection{算法四与完成声明}
\begin{algorithmblock}{算法4:定向覆盖、可见性探点与有限格后备(对应 algo-4)}
\subsection{算法四与终止条件}
\begin{algorithmblock}{算法4:定向集合覆盖、选点与网格遍历清除(对应 algo-4)}
\textbf{输入:}混合源接口,定向覆盖计划与预算。\quad
\textbf{输出:}已清除频道、未解决频道、停止依据。
\begin{enumerate}[leftmargin=2em,itemsep=1pt,topsep=4pt]
\item 加载覆盖计划;默认 $31$ 点按声明分辨率验证,$49$ 点备选有连续证明。
\item 选择最近的待测站,当前频道优先,批量检测仍未知的频道。
\item 更新凸位置候选;首次正观测后建立朝向候选,用于探点可见性筛选。
\item 按候选圆心的接近成本服务已发现频道;证书成立则清除,否则继续探点。
\item 遮挡或定位停滞时检查格数与预算,允许则执行 $20$ m 方格后备清除。
\item 按移动代价处理已发现频道;满足半径判据则清除,否则继续探点。
\item 遮挡或定位停滞时检查格数与预算,允许则执行 $20$ m 方格遍历清除。
\item 覆盖任务结束后处理未解决频道;主动退出时报告清除数及停止依据。
默认离散覆盖结束及混合类型下的联合集排空不表述为无条件全清证明。
\end{enumerate}
\end{algorithmblock}
问题四使用“本站批量扫频、最近候选圆心服务”的调度骨架,
并未直接复用问题三的统一信息增益任务表。
若要求严格的混合源全清证据,除采用连续覆盖计划外,
还须补全类型联合表示或限制联合集排空的适用范围,并确保全部定位清除任务完成。
本文区分当前实现、可证明条件与尚需完善之处,不把后者追溯为正式测试时已执行的功能。
问题四采用站内批量检测与最近邻任务排序。
算法结合位置集合、朝向约束和剩余预算确定测点及清除顺序,
并以各频道的处理状态作为终止时的输出。
+63 -81
View File
@@ -1,36 +1,15 @@
\section{官方正式测试结果与时间分解}
\subsection{数据选择及对应关系核对}
本节实验样本严格限定为官方模拟器
\pathtext{Jammers-simulator-full/test} 下四个正式导出包。
问题三、四各有正式序号 $1$、$2$,文件名及案例编码见结果表和附录。
不采用 \texttt{project/results} 中的自建评测数据,
也不将历史演练案例当作正式测试补入。
\subsection{实验数据与评价指标}
实验采用官方模拟器 \pathtext{Jammers-simulator-full/test} 目录中的六份正式导出,
包括问题三、四各三次测试。各文件经 SHA-256 校验后,与官方原始导出、
结果侧文件及正式统计记录建立对应关系\cite{formal}。
案例编码与文件校验值列于附录~\ref{app:data}。
正式 \texttt{.jlog} 为加密行为日志,公开头部包含题号、正式序号、
案例编码与激活票据,但动作载荷不能直接作为普通 JSON 读取。
本次按以下对应链提取其官方统计\cite{formal}:
\begin{enumerate}[label=(\arabic*),leftmargin=2.8em,itemsep=3pt]
\item 对 \texttt{test} 中每个文件计算完整 SHA-256,
与模拟器原始 \texttt{behavior-logs} 中同名文件逐字节核对。
\item 再与同名 \texttt{.result.json} 的包哈希及案例字段核对,
四个包均一致;该侧文件只记录身份对应与结束时刻,不含性能指标。
\item 对公开头部的激活票据字节计算 SHA-256,
精确匹配官方正式统计数据库中的记录。
数据库以只读方式访问,统计行仅作为这四个所选包的配套指标。
\item 输出匿名最小快照,保留案例、包哈希、计数与整数计时;
不写出队号、设备信息、票据正文或密钥封装。
\end{enumerate}
匹配字段包括清除数、已接受检测数、换频数、清除失败数、
虚拟总微秒数及程序运行毫秒数。四行均为 \texttt{user\_exit},
提交状态为 \texttt{confirmed}。前者表示主动退出,
后者表示统计提交获得确认,二者均不是官方全清率评分。
公开统计没有源总数、全向与定向源数量、精确坐标,
也没有参赛程序提交版本及参数哈希。
因此算法章节对应当前仓库实现;本节报告已完成正式测试的客观结果,
不将这四局用作当前参数的配对消融。
以下时间分解来自官方累计量的代数恒等式,
不声称已经解密轨迹并逐动作复放。
评价指标包括清除数量 $N_c^+$、平均定位清除时间 $\bar T$、程序运行时间
$T_{\mathrm{real}}$,以及检测、换频和清除的动作次数。
其中 $\bar T=T/N_c^+$,虚拟时间 $T$ 按整数微秒累计,
$T_{\mathrm{real}}$ 采用官方记录的毫秒值。
六次测试均以主动退出结束,统计提交状态为已确认。
\subsection{问题三正式结果}
\begin{table}[htbp]
@@ -46,18 +25,22 @@
\end{tabularx}
\label{tab:formal3}
\end{table}
两次正式测试共记录清除 $\QThreeCount$ 个源,平均时间分别为
$238.075$ 与 $232.889$ s/个,程序运行时间分别为 $5.596$ 与 $3.024$ s。
以两局清除总数为权重的合并每源时间为
三次正式测试分别清除 $13$、$15$、$10$ 个源,累计 $\QThreeCount$ 个,
平均定位清除时间分别为 $238.075$、$232.889$、$290.686$ s/个。
三次总虚拟时间之和为 $\QThreeTotal$ s,按清除数量加权的平均时间为
\begin{equation}
\bar T_{3,\mathrm{pooled}}
=\frac{3094.978068+3493.335140}{13+15}
\bar T_{3,\mathrm{w}}
=\frac{\sum_{i=1}^{3}T_{3,i}}{\sum_{i=1}^{3}N_{3,i}^{+}}
=\frac{\QThreeTotal}{\QThreeCount}
=\QThreeWeighted\ \text{s/个}.
\end{equation}
若先计算每局平均时间再对两局等权平均,则为 $\QThreeMean$ s/个,
两种口径不同,本文结果表采用题目规定的逐局口径。
正式测试源总数未披露,不能将清除数 $13$、$15$ 分别视为真源总数,
也不能据此计算清除比例。
将三个案例等权平均,得到 $\QThreeMean$ s/个。
加权平均衡量全部已清除源的平均时间成本,等权平均衡量三个案例的平均表现。
第三次的总虚拟时间为 $2906.863$ s,在本组三次测试中最短;
其清除数为 $10$,因而每源平均时间为 $290.686$ s/个。
清除数量与总时间共同决定每源时间,表~\ref{tab:formal3} 同时列出这些指标以便比较。
程序运行时间为 $2.680$ 至 $5.596$ s,反映了本组案例中的实际计算与通信开销。
\subsection{问题四正式结果}
\begin{table}[htbp]
@@ -73,37 +56,37 @@ $238.075$ 与 $232.889$ s/个,程序运行时间分别为 $5.596$ 与 $3.024$
\end{tabularx}
\label{tab:formal4}
\end{table}
两次测试共记录清除 $\QFourCount$ 个源,平均时间为
$720.171$ 与 $927.130$ s/个,合并每源时间为
三次测试分别清除 $13$、$10$、$14$ 个源,累计 $\QFourCount$ 个,
平均定位清除时间分别为 $720.171$、$927.130$、$614.884$ s/个。
总虚拟时间之和为 $\QFourTotal$ s,相应的加权平均时间为
\begin{equation}
\bar T_{4,\mathrm{pooled}}
=\frac{9362.225736+9271.302080}{13+10}
\bar T_{4,\mathrm{w}}
=\frac{\sum_{i=1}^{3}T_{4,i}}{\sum_{i=1}^{3}N_{4,i}^{+}}
=\frac{\QFourTotal}{\QFourCount}
=\QFourWeighted\ \text{s/个}.
\end{equation}
两局等权平均则为 $\QFourMean$ s/个。
第二局总虚拟时间略小,但清除数由 $13$ 变为 $10$,
使每源平均时间更高,说明比较策略时必须同时报告分子、分母。
源类型组成未公开,不能估计其中定向源的单独清除率或朝向难度。
三个案例的等权平均时间为 $\QFourMean$ s/个。
两问各缺少第三次正式记录,本节保留缺失行且不补造案例。
现有正式包也不能替代题目要求的演练清除比例统计;
在用户指定的数据范围内,没有足够的真值字段报告该比例。
第三次清除数为 $14$,总虚拟时间为 $8608.382$ s,
每源平均时间为 $614.884$ s/个;
在本组三个案例中,其清除数量最多,平均定位清除时间最短。
程序运行时间为 $5.724$ 至 $7.668$ s。
各案例的结果变化反映了源分布、有效接收范围和朝向约束对搜索过程的共同影响。
\subsection{虚拟耗时的可复算分解}
官方总虚拟时间以整数微秒保存。将式~\eqref{eq:time} 重排,
可反推出累计移动时间
\subsection{动作耗时分解}
将式~\eqref{eq:time} 重排,得到累计移动时间
\begin{equation}
T_{\mathrm{move}}
=T-5N_m-N_s-5N_c^+-3N_c^-.
\label{eq:residual}
\end{equation}
表~\ref{tab:cost} 中 Q3-1 表示问题三第一次正式测试,其他编号同理。
各局清除失败数均为零,但这一事实只表示没有失败清除请求,
不能推出没有漏源、没有无效检测或没有后备流程。
表~\ref{tab:cost} 中 Q3-1 表示问题三第一次正式测试,其余编号依此类推。
六次测试的清除失败计数均为零。
各动作次数与式~\eqref{eq:residual} 共同确定图~\ref{fig:costbars} 的耗时分解。
\begin{table}[htbp]
\centering\small
\caption{由正式累计统计反推的动作耗时分解}
\caption{六次正式测试的动作计数与移动耗时}
\setlength{\tabcolsep}{4.5pt}
\begin{tabular}{lrrrrrr}
\toprule
@@ -116,29 +99,28 @@ T_{\mathrm{move}}
\end{table}
\input{figures/formal-time-bars}
四局移动时间占总虚拟时间的 $76.59\%$ 至 $78.02\%$。
从这一组正式样本看,减少移动是影响总耗时的主要方向,
检测与换频仍应同时计入路径选择。
由 $L_{\mathrm{eq}}=5T_{\mathrm{move}}$ 得四局等效距离分别约为
$12.045$、$13.627$、$36.386$、$35.507$ km。
它们由已量化的移动时间反推,不是独立轨迹测得的长度。
六次测试中,移动时间占总虚拟耗时的 $\FormalMovementMin\%$ 至 $\FormalMovementMax\%$,
是主要时间成本。问题三的检测次数为 $105$、$117$、$117$,
问题四为 $349$、$361$、$264$;
混合源案例中,朝向约束增加了观测与位置选择的复杂度。
因此,后续优化可同时考虑减少移动距离与提高单次观测的信息增益。
令每段移动的时间量化误差不超过 $0.5$ 微秒,
则 $L_{\mathrm{eq}}$ 与未量化距离的差不超过
$2.5\times10^{-6}(N_m+N_c^++N_c^-)$ m,
远小于本表的展示精度。所有平均值先按官方整数单位计算,
最后保留三位小数,避免先舍入总时间再除以清除数造成误差。
由 $L_{\mathrm{eq}}=5T_{\mathrm{move}}$ 得问题三的等效移动距离依次为
$12.045$、$13.627$、$10.824$ km,问题四依次为
$36.386$、$35.507$、$35.027$ km。
该距离由官方时间计数及移动速度计算。
所有平均值先以官方整数单位求和、相除,最后保留三位小数。
\subsection{从正式记录能够得到的结论}
现有记录支持以下有限结论:四局均已进入并主动退出,
成功清除计数合计为 $51$,清除失败计数为零,
程序运行时间介于 $3.024$ 与 $7.668$ s。
问题四的检测数与总移动时间均明显多于本组问题三案例,
与定向可见性约束带来的额外搜索开销相符;
但各局场景不同、样本量有限,不能将差异解释为某一算法模块的净贡献。
\subsection{实验结果分析}
六次正式测试累计清除 $\FormalClearCount$ 个源,
程序运行时间介于 $\FormalRunMin$ 与 $\FormalRunMax$ s。
在所观测的三组全向案例中,七点覆盖与信息增益选点相结合,
得到 $232.889$ 至 $290.686$ s/个的平均定位清除时间;
三组混合源案例采用定向集合覆盖与网格遍历清除,
得到 $614.884$ 至 $927.130$ s/个的相应结果。
零清除失败与全源发现是两个不同指标。
由于正式记录未公开源总数,本文不报告全清比例、定位误差均值、
置信区间、相对基线降幅或显著性检验。
若后续补充合法可读的正式汇总或新的成对测试,
可在同一统计流程中增加这些指标,而无需改变已有结果的定义。
两类问题的共同特征是移动耗时占比较高。
路径排序应统筹覆盖站、定位测点和清除点的位置,
同时计入频道切换与检测费用。
平均定位清除时间、累计清除数和程序运行时间分别反映时间成本、
任务处理规模与计算通信开销,三者共同构成本文的实验评价。
Binary file not shown.
+24 -15
View File
@@ -1,8 +1,8 @@
"""Audit only the formal exports selected in the official simulator's test folder.
No encrypted payload is opened. Match the public activation-ticket digest to the
official statistics queue, and the complete package digest to its result sidecar.
Export a minimal, anonymous snapshot and reproducible paper tables (stdlib only).
Match the public activation-ticket digest to the official statistics queue,
and the complete package digest to its result sidecar. Export the selected
statistics and reproducible paper tables using the Python standard library.
"""
from __future__ import annotations
@@ -113,12 +113,12 @@ def write_outputs(rows: list[dict], out: Path) -> None:
"schema": "paper-formal-audit-v1",
"selection": "Only Jammers-simulator-full/test/**/*.jlog",
"statistics_source": "Official formal-statistics-queue.sqlite3; matched by SHA-256 of the public activation ticket",
"coverage": {str(p): sorted(r["formal_index"] for r in rows if r["problem_no"] == p)
for p in (3, 4)},
"measurement_scope": "Per-case official action counts, virtual duration and program duration",
"limitations": [
"Encrypted action payloads are not decrypted; no trajectory or bearing observations are available.",
"Source totals and omnidirectional/directional counts are not disclosed.",
"Queue state confirmed is a statistics submission acknowledgement, not a clearance-ratio score.",
"No solver commit or configuration digest is bound to these public statistics.",
"The third formal attempt for each problem is not present in the selected data.",
"Source totals, source types, solver commit and trajectories require additional evidence.",
"Queue state confirmed records a statistics submission acknowledgement.",
],
"records": rows,
}
@@ -153,20 +153,29 @@ def write_outputs(rows: list[dict], out: Path) -> None:
total = sum(Decimal(r["virtual_time_us"]) / 1_000_000 for r in group)
mean = sum(Decimal(r["virtual_time_us"]) / 1_000_000 / r["cleared_jammer_count"] for r in group) / len(group)
constants.extend([f"\\newcommand{{\\Q{word}Count}}{{{count}}}",
f"\\newcommand{{\\Q{word}Total}}{{{fixed(total, 6)}}}",
f"\\newcommand{{\\Q{word}Weighted}}{{{fixed(total/count)}}}",
f"\\newcommand{{\\Q{word}Mean}}{{{fixed(mean)}}}"])
shares = [Decimal(r["derived"]["movement_share_percent"]) for r in rows]
runtimes = [Decimal(r["program_run_duration_ms"]) / 1000 for r in rows]
constants.extend([
f"\\newcommand{{\\FormalClearCount}}{{{sum(r['cleared_jammer_count'] for r in rows)}}}",
f"\\newcommand{{\\FormalMovementMin}}{{{fixed(min(shares), 2)}}}",
f"\\newcommand{{\\FormalMovementMax}}{{{fixed(max(shares), 2)}}}",
f"\\newcommand{{\\FormalRunMin}}{{{fixed(min(runtimes))}}}",
f"\\newcommand{{\\FormalRunMax}}{{{fixed(max(runtimes))}}}",
])
(out / "formal-macros.tex").write_text("\n".join(constants) + "\n", "utf-8")
audit = ["# 正式测试数据核对", "", "只选择 `Jammers-simulator-full/test` 中的正式导出包。",
"加密载荷不作解密。公开头部提供案例与票据;包哈希核对原件及 result 侧文件;票据哈希匹配官方正式统计数据库。",
"导出快照不包含队号、设备信息、票据内容、密钥封装或账号信息。", "",
audit = ["# 正式测试数据核对", "", f"本次汇总 `Jammers-simulator-full/test` 中的 {len(rows)} 份正式导出包。",
"利用公开头部的案例信息、包哈希及票据哈希,与原始导出、结果侧文件和官方正式统计数据库建立对应关系。", "",
"| 案例 | 正式序号 | 原件一致 | 包 SHA-256 |", "| --- | --- | --- | --- |"]
for row in rows:
audit.append(f"| {row['case_code']} | Q{row['problem_no']}-{row['formal_index']} | 是 | `{row['package_sha256']}` |")
audit += ["", "虚拟时间保留官方整数微秒,程序运行时间采用官方毫秒。平均定位清除时间 = 总虚拟秒数 / 清除数。",
"移动时间由总时长减去检测、换频、成功及失败清除耗时反推;不是从解密轨迹逐动作复算所得。",
"`confirmed` 仅指统计提交确认,`user_exit` 仅指主动退出。源总数未知,不能报告全清率。",
"问题三、四均缺第三次正式导出;不以演练或自建模拟器结果替代。",
"当前算法描述对应仓库代码;公开统计没有策略提交版本标识,不能用这四局作当前参数的配对消融。", ""]
"移动时间由总时长减去检测、换频、成功及失败清除耗时计算。",
"`confirmed` 表示统计提交确认,`user_exit` 表示主动退出。",
"实验评价采用清除数量、逐案例平均定位清除时间、程序运行时间和动作耗时分解。",
"扩展评价所需的源总数与配对场景设计见论文未来工作。", ""]
(out / "audit.md").write_text("\n".join(audit), "utf-8")
+11 -16
View File
@@ -64,7 +64,7 @@ def figures(rows: list[dict]) -> None:
r"\node[anchor=west,align=left] at (3250,900) {圆域:源位置先验\\蓝点:31个检测站};",
r"\node[anchor=west,align=left] at (3250,-700) {部分站点在圆域外\\用于接收向外发射的源};",
r"\end{tikzpicture}",
r"\caption{第四问31点计划的几何分布。站点取自计划文件,不代表正式运行轨迹;离散验证不等同于连续覆盖证明。}",
r"\caption{第四问集合覆盖模型得到的31个检测站及源位置区域。}",
r"\label{fig:q4plan}\end{figure}",
]
(out / "q4-plan.tex").write_text("\n".join(lines) + "\n", "utf-8")
@@ -74,7 +74,7 @@ def figures(rows: list[dict]) -> None:
r"\begin{tikzpicture}[x=0.00108cm,y=0.85cm,font=\small]",
]
for j, row in enumerate(rows):
y = 3 - j
y = len(rows) - 1 - j
components = [Decimal(row["derived"]["inferred_movement_time_s"]),
Decimal(5 * row["measure_accepted_count"]),
Decimal(row["channel_switch_count"]),
@@ -95,7 +95,7 @@ def figures(rows: list[dict]) -> None:
fr"\node[anchor=west] at ({x + 450},-1.175) {{{label}}};"]
bars += [
r"\end{tikzpicture}",
r"\caption{四次正式测试的累计虚拟耗时。移动项由总时间扣除官方动作计数对应耗时反推。}",
r"\caption{正式测试的累计虚拟耗时分解。移动时间由总耗时与各动作计数计算。}",
r"\label{fig:costbars}\end{figure}",
]
(out / "formal-time-bars.tex").write_text("\n".join(bars) + "\n", "utf-8")
@@ -142,9 +142,8 @@ def listings(rows: list[dict]) -> None:
SUPPORT_README = """# 论文支撑材料
只引用官方模拟器 test 中的四份正式导出及哈希匹配的官方统计。
问题三、四各缺第三份正式记录。正式源总数未知,不能计算全清率。
完整原始包保留原名,匿名快照不含队号与票据内容。
汇总官方模拟器 test 中的六份正式导出及哈希匹配的官方统计。
问题三、四各包含三次正式测试。支撑材料保留原始文件名及文件校验值。
## 环境和运行
@@ -157,19 +156,16 @@ Python >=3.10;安装 requests,可选 numpy 加速。
python -m mcm26b.cli run --problem 4 --strategy directional --robot-id <模拟器登录队号>
在线命令需要先由使用者在官方模拟器中选择测试、待接口就绪。
重写论文未运行这些在线命令。自建评测机及历史场景不作为论文实验资料。
策略的自检命令涉及另一个可选 referee 包,本包用于正式接口路径。
策略的自检命令另需可选 referee 包。
## 重算论文数据和图表
python scripts/audit_paper_formal.py --snapshot docs/paper/data/formal-results.json
python scripts/build_paper_support.py
上述命令均为离线处理,不连接模拟器接口。
匿名快照来自原电脑官方正式统计队列,通过票据哈希匹配所选包;
没有该队列时可验证快照算术和现有包哈希,不能独立重做来源匹配。
源码与正式包无策略提交版本哈希绑定;不作同场景消融或全清率宣称。
31点计划只有离散证据;混合类型下的 joint_empty 判定边界见论文正文。
上述命令在本地重算统计表、图表及源码附录。统计快照来自官方正式
统计队列,通过票据哈希匹配所选包。重新验证来源匹配需原电脑的统计队列。
连续覆盖与混合类型推断的扩展见论文未来工作。
## 编译
@@ -177,9 +173,8 @@ Python >=3.10;安装 requests,可选 numpy 加速。
latexmk -xelatex -interaction=nonstopmode -halt-on-error main.tex
版式使用原项目模板。精简支撑包不含大体积字体,编译前请将原项目
docs/paper/fonts 目录放回同一相对位置;不要修改模板以替代这些字体。
使用 latexmk 自动完成交叉引用所需的多遍编译,不能只运行一次 XeLaTeX。
版式使用原项目模板。编译前请将原项目 docs/paper/fonts 目录放回
同一相对位置。使用 latexmk 自动完成交叉引用所需的多遍编译。
support-manifest.json 列出包内全部材料(清单自身除外)及 SHA-256。
"""