Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
14b0ebb7fb | ||
|
|
b7aadaa400 | ||
|
|
2cb3dd6602 | ||
|
|
662d17e21a | ||
|
|
599eea40d6 | ||
|
|
89021eb9f8 | ||
|
|
9fb15f53f5 | ||
|
|
705c4c9b6a | ||
|
|
257d1a9bd7 | ||
|
|
fb0325f67f | ||
|
|
4f836fe123 | ||
|
|
78e4420a3e | ||
|
|
2c63610f12 | ||
|
|
82311a47cc | ||
|
|
b810ec7777 | ||
|
|
0a2d30702d | ||
|
|
27f4d6e0d8 | ||
|
|
dec57e3e29 | ||
|
|
71688b2ab2 | ||
|
|
f71d7d9288 | ||
|
|
102ca032fb | ||
|
|
a1500d25c1 | ||
|
|
892451dca9 |
@@ -1,18 +1,42 @@
|
|||||||
# Python-generated files
|
# ============================================================
|
||||||
|
# 2026 B 题:无线电干扰源自动定位清除 —— 版本控制忽略清单
|
||||||
|
# 原则:只跟踪"可复现结果所需的最小集合"。
|
||||||
|
# - 源码、自建模拟器、六份正式日志、测试、复现脚本与说明文档:纳入版本控制;
|
||||||
|
# - 编译产物、运行期采集目录、缓存与本机工作区:一律忽略。
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# ---------- Python ----------
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.py[oc]
|
*.py[cod]
|
||||||
|
*.egg-info/
|
||||||
|
.venv/
|
||||||
|
.piptmp/
|
||||||
|
.pytest_cache/
|
||||||
|
.mypy_cache/
|
||||||
|
.ruff_cache/
|
||||||
|
.ipynb_checkpoints/
|
||||||
|
|
||||||
|
# 构建与打包产物
|
||||||
build/
|
build/
|
||||||
dist/
|
dist/
|
||||||
wheels/
|
wheels/
|
||||||
*.egg-info
|
|
||||||
|
|
||||||
# Virtual environments
|
# ---------- 运行期产生:不进版本控制 ----------
|
||||||
.venv
|
# 官方模拟器本体与判题留档(体积大且需官方环境)
|
||||||
|
|
||||||
# Sim
|
|
||||||
Jammers*/
|
Jammers*/
|
||||||
|
# 官方演练采集产物(问题一观测、回放归档、评测机日志)
|
||||||
|
output/
|
||||||
|
# 本机临时工作区:历史留档、截图、中间草稿等
|
||||||
tmp/
|
tmp/
|
||||||
# LaTeX build artifacts
|
# 构建 Python 包时使用的临时目录
|
||||||
|
.piptmp/
|
||||||
|
uv-temp/
|
||||||
|
pip-temp/
|
||||||
|
|
||||||
|
# referee-data/ 是论文正文数据的来源,纳入版本控制(含演练与正式日志)。
|
||||||
|
# 其中登录标识已统一为中性占位符,不包含参赛队号。
|
||||||
|
|
||||||
|
# ---------- LaTeX 编译产物 ----------
|
||||||
docs/paper/build/
|
docs/paper/build/
|
||||||
docs/paper/*.aux
|
docs/paper/*.aux
|
||||||
docs/paper/*.log
|
docs/paper/*.log
|
||||||
@@ -21,9 +45,30 @@ docs/paper/*.fls
|
|||||||
docs/paper/*.fdb_latexmk
|
docs/paper/*.fdb_latexmk
|
||||||
docs/paper/*.xdv
|
docs/paper/*.xdv
|
||||||
docs/paper/*.synctex.gz
|
docs/paper/*.synctex.gz
|
||||||
|
# 支撑包是脚本产物(scripts/build_paper_support.py --package),不入库
|
||||||
|
docs/paper/support-materials.zip
|
||||||
|
|
||||||
# pytest
|
# ---------- 编辑器 / 操作系统 ----------
|
||||||
.pytest_cache/
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
.idea/
|
||||||
|
.zcode/
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
# 1
|
# ---------- 字体:体积过大,不进版本控制 ----------
|
||||||
output/
|
# docs/paper/fonts/ 共约 150 MB(HeitiSC / SongtiSC / Times New Roman),
|
||||||
|
# 远超支撑材料合理体积。cls 已内置系统字体回退方案,缺字体时按
|
||||||
|
# docs/paper/mcm26b-paper.cls 中的「若未携带 fonts/ 目录」注释改用系统字体即可。
|
||||||
|
docs/paper/fonts/
|
||||||
|
|
||||||
|
# AIGC 报告构建产物
|
||||||
|
docs/build/
|
||||||
|
docs/*.aux
|
||||||
|
docs/*.log
|
||||||
|
docs/*.toc
|
||||||
|
docs/*.out
|
||||||
|
docs/*.fls
|
||||||
|
docs/*.fdb_latexmk
|
||||||
|
docs/*.xdv
|
||||||
|
docs/*.synctex.gz
|
||||||
|
|||||||
@@ -1,37 +1,85 @@
|
|||||||
{
|
{
|
||||||
|
// LaTeX Workshop 配方 —— 与 docs/paper/README.md 记录的口令一致:
|
||||||
|
// latexmk -xelatex -interaction=nonstopmode -halt-on-error main.tex
|
||||||
|
// 论文需要多遍编译(交叉引用、目录与长表格),且必须用 XeLaTeX(ctex + fontspec),
|
||||||
|
// 因此默认配方取 latexmk,而不是单遍 xelatex。
|
||||||
"latex-workshop.latex.workingDirectory": "%DIR%",
|
"latex-workshop.latex.workingDirectory": "%DIR%",
|
||||||
"latex-workshop.latex.tools": [
|
"latex-workshop.latex.tools": [
|
||||||
{
|
{
|
||||||
"name": "xelatex",
|
// 默认配方使用的工具:%DOCFILE% 与 %DIR% 配合,
|
||||||
|
// 切换工作目录后传给 latexmk 的仍是纯文件名,避免绝对路径与 \input 相对路径冲突。
|
||||||
|
"name": "latexmk (xelatex, paper)",
|
||||||
|
"command": "latexmk",
|
||||||
|
"args": [
|
||||||
|
"-synctex=1",
|
||||||
|
"-interaction=nonstopmode",
|
||||||
|
"-halt-on-error",
|
||||||
|
"-file-line-error",
|
||||||
|
"-xelatex",
|
||||||
|
"%DOCFILE%"
|
||||||
|
],
|
||||||
|
"env": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// 备选:产物集中到 build/ 子目录,源码目录更干净;
|
||||||
|
// 需要清理时删除 docs/paper/build 即可(该目录已在 .gitignore 中)。
|
||||||
|
"name": "latexmk (xelatex, outdir=build)",
|
||||||
|
"command": "latexmk",
|
||||||
|
"args": [
|
||||||
|
"-synctex=1",
|
||||||
|
"-interaction=nonstopmode",
|
||||||
|
"-halt-on-error",
|
||||||
|
"-file-line-error",
|
||||||
|
"-xelatex",
|
||||||
|
"-outdir=build",
|
||||||
|
"%DOCFILE%"
|
||||||
|
],
|
||||||
|
"env": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// 单遍 xelatex 只用于排查单个文件的语法错误,交叉引用会显示为 ??
|
||||||
|
"name": "xelatex (单遍,调试用)",
|
||||||
"command": "xelatex",
|
"command": "xelatex",
|
||||||
"args": [
|
"args": [
|
||||||
"-synctex=1",
|
"-synctex=1",
|
||||||
"-interaction=nonstopmode",
|
"-interaction=nonstopmode",
|
||||||
"-file-line-error",
|
"-file-line-error",
|
||||||
"%DOC%"
|
"%DOCFILE%"
|
||||||
]
|
],
|
||||||
},
|
"env": {}
|
||||||
{
|
|
||||||
"name": "latexmk (xelatex)",
|
|
||||||
"command": "latexmk",
|
|
||||||
"args": [
|
|
||||||
"-synctex=1",
|
|
||||||
"-interaction=nonstopmode",
|
|
||||||
"-file-line-error",
|
|
||||||
"-xelatex",
|
|
||||||
"%DOC%"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"latex-workshop.latex.recipes": [
|
"latex-workshop.latex.recipes": [
|
||||||
{
|
{
|
||||||
"name": "xelatex",
|
"name": "latexmk (xelatex, paper)",
|
||||||
"tools": ["xelatex"]
|
"tools": ["latexmk (xelatex, paper)"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "latexmk (xelatex)",
|
"name": "latexmk (xelatex, outdir=build)",
|
||||||
"tools": ["latexmk (xelatex)"]
|
"tools": ["latexmk (xelatex, outdir=build)"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "xelatex (单遍,调试用)",
|
||||||
|
"tools": ["xelatex (单遍,调试用)"]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"latex-workshop.latex.recipe.default": "first"
|
// 默认配方:本项目的实际编译口令(多遍 + XeLaTeX + 遇错即停)。
|
||||||
|
//
|
||||||
|
// 产物写入 build/ 而不是就地写 docs/paper/main.pdf:就地编译时若 PDF 预览
|
||||||
|
// 仍打开发着 main.pdf,Windows 会锁住该文件,xdvipdfmx 随即报
|
||||||
|
// "gave an error" 且不产出 PDF,表现为"编译没反应"。
|
||||||
|
// 写到 build/ 后,预览读的是 docs/paper/build/main.pdf,不再与源码目录的
|
||||||
|
// main.pdf 抢占,保存即编译也就稳定了。
|
||||||
|
// 需要就地产出时,把下面这行改为 "latexmk (xelatex, paper)",并先关闭 PDF 预览。
|
||||||
|
"latex-workshop.latex.recipe.default": "latexmk (xelatex, outdir=build)",
|
||||||
|
// 预览与 build/ 配方保持一致
|
||||||
|
"latex-workshop.latex.outDir": "build",
|
||||||
|
// 保存即编译:单次编译约十秒,开启后可直接看 PDF 预览;
|
||||||
|
// 只想手动触发时把下一行改为 "never"。
|
||||||
|
"latex-workshop.latex.autoBuild.run": "onSave",
|
||||||
|
"latex-workshop.latex.autoClean.run": "onBuilt",
|
||||||
|
"latex-workshop.latex.clean.subfolder.enabled": true,
|
||||||
|
"latex-workshop.view.pdf.viewer": "tab",
|
||||||
|
// 禁止 LaTeX Workshop 用启发式自动切换工具,始终按上面的配方执行
|
||||||
|
"latex-workshop.latex.build.forceRecipeUsage": true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,60 +0,0 @@
|
|||||||
# 修复计划:7 项 P2 问题 + 3 项规划调整
|
|
||||||
|
|
||||||
已核实:7 个问题的定位与审核报告一致;另确认关联缺陷 `planner/__init__.py:392` 用 `>` 判断遮挡预算(实际放行 5 个被遮挡探点,注释口径为 4)。用户已确认:环探保留启发式+重写依据;误差场采用逐点白噪声哈希。
|
|
||||||
|
|
||||||
## 修改一:模拟器固定误差场(问题1)
|
|
||||||
文件 `src/mcm26b/sim/simulator.py`:
|
|
||||||
- 新增 `_bearing_error(channel, pos)`:`sha256(f"{error_seed}|{channel}|{round(x,6)}|{round(y,6)}")` 前 8 字节映射到 `[-error_half_deg, +error_half_deg)`。同一(源频道, 位置)读数恒定,不同点独立。
|
|
||||||
- `_observe`(L193)改为调用它;删除顺序随机流 `self._rng`(构造参数 `error_seed` 保留)。
|
|
||||||
- 模块 docstring 更新:同位置误差固定;分布仍是测试假设。
|
|
||||||
- 新增测试:同位置重复测量(不同 request_id)svd_deg 相同;同种子两次构造结果一致。
|
|
||||||
|
|
||||||
## 修改二:Q4 对跖探点公式(问题2)
|
|
||||||
文件 `src/mcm26b/planner/__init__.py`(L440-447):
|
|
||||||
- L447:`dx / norm * scale` → `dx * scale`(dy 同理),使偏移模长 = `min(norm, safe)`。圆心为原点、原探点 (200,0)、safe≥200 时返回 (-200,0)。
|
|
||||||
- L444 退化分支:`min(safe, 1.0)` → `safe`(方向 +x),不再钳到 1m。
|
|
||||||
- 新增单测:对跖点坐标(safe≥norm 与 safe<norm 两种)。
|
|
||||||
|
|
||||||
## 修改三:环探依据重写 + 预算一致(问题3,保留启发式)
|
|
||||||
- `planner/__init__.py` 模块 docstring、`DirectionalExtension` docstring、`_next_probe` docstring(L428-431):删除"≥180° 弧"声称,改为诚实表述:源位于环上且朝向沿外切线时可见弧可退化为单点,固定 45° 步进无最坏命中保证;梯子只提高提前命中率,完备性完全由后备清除兜底。
|
|
||||||
- `docs/协议规则表与状态机.md` §7(L166-172)同步重写。
|
|
||||||
- L392 `>` → `>=`,`config.py:85` 注释与文档同步为"4 个被遮挡探点(选点/对跖/环探×2)"。
|
|
||||||
- 新增 `scripts/benchmark_q4.py`:批量种子扫描(`--problem 4`,可配源数/定向数/种子范围/输出路径),逐局记录 measures、clears、后备清除格数与 attempts、virtual_time、completed,落盘 `output/q4/benchmark.json` 并打印汇总表——用于验证修复后的后备清除成本(审核"验证后备成本"要求),同时为论文问题4结果表提供可复现数字。
|
|
||||||
|
|
||||||
## 修改四:通信失败可靠收尾(问题4)
|
|
||||||
文件 `planner/__init__.py` `run()`(L195-205):
|
|
||||||
- `client.enter()` 纳入 try;except 顺序:`DeadlineExceeded` → `(TransportError, ProtocolError, InconsistentBelief)` → `Exception` 兜底;stop_reason 分别记 `real_budget_exhausted` / `transport_failure` / `protocol_error` / `inconsistent_belief` / `unexpected_error`,summary 增 `abort_detail`(异常类型+消息,截断)。
|
|
||||||
- `/exit` 改为尽力而为:`client.exit()` 失败不再中断收尾;`_summary` 接受 `info=None`(`exit_reason="exit_unreachable"`,virtual_time 取 `client.state.virtual_time_s`)。
|
|
||||||
- summary 增 `channel_status` 快照(每频道状态 + 候选 MEC 半径,约 20 条)——即"保存未完成状态";`--log` 的 JSONL 本就有全过程留痕。
|
|
||||||
- cli.py 无需改(`completed=false` 已映射退出码 1)。
|
|
||||||
- 新增测试:注入连续三次传输失败(若 `ScriptedFaultTransport` 不支持持久失败则扩展其故障类型),断言 `run()` 正常返回 summary 不抛异常、有 /exit 尝试留痕、退出码路径为 1。
|
|
||||||
|
|
||||||
## 修改五:Q1 近平行退化情形(问题5)
|
|
||||||
文件 `src/mcm26b/geometry/localization.py`(L216-226):
|
|
||||||
- 衰退方向判定改为对浮点平面系数的精确有理数运算(`Fraction`):候选方向仍枚举各平面法线的垂直方向 `(b,-a)/(-b,a)`;先用浮点快速预筛(max > 1e-9 直接排除,浮点误差远小于该阈值),近零候选再用 Fraction 精确检验 `∀(d,e,f): d·dir_x + e·dir_y ≤ 0`。平面系数本身是 float(精确有理数),故结论对量化输入精确,消除 2e-14 阈值与顶点过滤 eps=1e-9 的口径错配导致的漏判。
|
|
||||||
- 顶点枚举与 `PARALLEL_EPS` 预筛保持现状。
|
|
||||||
- 回归测试:审核复现输入 `[(0,0,1°), (0,0.01,358.99999999999°)]` → `status=unbounded`、`diameter_infinite=true`、不给清除保证;`scripts/benchmark_q1.py` 两档结果不回归。
|
|
||||||
|
|
||||||
## 修改六:默认舍入裕量统一(问题6)
|
|
||||||
- `config.py:75`:`bearing_rounding_margin_deg` 默认 `0.0` → `0.005`,注释改为"覆盖服务器两位小数舍入偏差(≤0.005°);库默认与 CLI 默认一致"。
|
|
||||||
- `q1` 子命令与 `geometry/__main__.py` 的 `--rounding-margin-deg` 默认保持 0(离线敏感性分析语义不变,审核未要求改)。
|
|
||||||
- 新增断言 `SearchConfig().bearing_rounding_margin_deg == 0.005`,并用默认配置复跑"边缘读数保留真源"场景;检查显式传参的现有测试不受影响;README 如有默认值描述一并更新。
|
|
||||||
|
|
||||||
## 修改七:后验评分补 near 分支(问题7)
|
|
||||||
文件 `planner/__init__.py` `_worst_posterior_radius`(L93-110):
|
|
||||||
- 增加 near 分支:`probe.clip_disk(q, field.near_radius_m, search.polygon_sides)`,多边形非空则纳入 max;direction 端点分支保留,docstring 说明 safe 盘内 no_signal 不可能故不枚举。
|
|
||||||
- 调用点(粗评/加密复评两处)传入 `near_radius_m` 与 `polygon_sides`。
|
|
||||||
- 新增测试:候选集 `[(-4,0),(4,0)]`(两点退化区域)、q=原点 → 最坏后验 ≈ 4m(修复前报 2m);`test_loop_q3/q4` 场景回归(选点可能变化,但断言均为清除状态类,预期无碍)。
|
|
||||||
|
|
||||||
## 规划调整落地
|
|
||||||
- **A(第二问定位)**:`docs/algo-2.md` §13(L231 附近)明确交付为"安全选点的启发式基线":解析安全盘证书已实现并证明;§10 区间上界未实现,采样最大值仅作粗筛,不得称严格最坏上界。
|
|
||||||
- **B(第三问)**:无代码改动;顺序约束(先修改一/四,再官方演练)在 `docs/B题建模分析与实施计划.md` 演练清单处注明。
|
|
||||||
- **C(第四问预算口径)**:`_summary` 增 `total_requests`(measures+clears);`DirectionalExtension._summary` 增 `fallback_clear_attempts`(Σ attempts);`docs/协议规则表与状态机.md` §7 后备清除段注明"后备 /clear 请求计入总请求与现实预算"。
|
|
||||||
|
|
||||||
## 测试与验收
|
|
||||||
- 每项修改配单测(新增约 10-12 项),全套 pytest 通过(95 → ~107 项)。
|
|
||||||
- 冒烟:`uv run mcm26b sim-check`;`uv run mcm26b run --problem 3/4 --self-test` 若干种子。
|
|
||||||
- 运行 `scripts/benchmark_q4.py` 记录修复后后备成本,输出落盘。
|
|
||||||
|
|
||||||
## 执行顺序
|
|
||||||
修改一(模拟器)→ 修改四(收尾)→ 修改六 → 修改七 → 修改二 → 修改三 → 修改五 → 文档同步 → 全量回归。
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
# 目标
|
|
||||||
|
|
||||||
在新分支 **`q3-bayes`**(基于当前 `gpt`)实现第三问新算法:**网格化贝叶斯粒子滤波(含负观测更新)+ 信息增益选点 + 开放路径 2-opt 任务排序 + 七点覆盖兜底 + Optuna 离线调参**。评分口径 = 虚拟总时间(A2 基线:官方演练 12 源 5232s、109 次检测);硬性要求全清率 100%、缺席证明正确、零异常。
|
|
||||||
|
|
||||||
# 关键设计
|
|
||||||
|
|
||||||
## 1. 粒子滤波 `src/mcm26b/particles.py`(新建)
|
|
||||||
|
|
||||||
与用户方案的差异点:本项目要求清除证书/缺席证明**严格**(A2 靠保守几何证书做到 100% 清除率),软核概率 PF 有删掉真源的风险。因此采用**网格幸存集滤波**(= 硬似然 PF + Voronoi 裕量,与用户"|θ̂−θ|>1° 权重置零"的设定一致但更严格):
|
|
||||||
|
|
||||||
- 每频道一组 Ω 上间距 h≈30m 的网格粒子(约 1.1 万格,alive 用整数索引集合;空间哈希加速邻域查询)
|
|
||||||
- 保守 kill 判定(margin = h·√2/2,保证真源所在格必活):
|
|
||||||
- `no_signal`@s:kill dist(g,s) ≤ 1000 − margin(题面 r_eff ≥ 1000 ⟹ 可严格排除该盘)
|
|
||||||
- `direction`@s 读数 θ:kill 角向偏差超出 δ_eff=1.005°(含余量)或 dist > 1500 + margin 的格
|
|
||||||
- `near`@s:kill dist(g,s) > 5 + margin
|
|
||||||
- 证书全部由此推导:清除证书 = MEC(alive).R + margin ≤ 20 − clear_margin;**缺席证明 = alive 为空集**(无需额外像素覆盖检查);跳测规则 = min dist(alive, s) > 1500 + margin ⟹ 必 no_signal,跳过省 6s/次
|
|
||||||
- 信息增益:对候选点用子采样(≤500 粒子)× K 个代表假设做 MC 期望熵减估计;复用 `smallest_enclosing_circle`(Welzl) 求 MEC
|
|
||||||
|
|
||||||
## 2. 新策略 `BayesLoop(OmnidirectionalLoop)`(`src/mcm26b/planner/bayes_loop.py`)
|
|
||||||
|
|
||||||
复用基类 run() 骨架、异常收尾、summary、anomaly、预算机制,重写阶段逻辑:
|
|
||||||
- **发现阶段**:原点起扫(频道排序省换频)→ 站点 = 七点环 ∪ PF 高价值点,按"期望发现数 − λ·移动时间"贪心选站;每站批量扫频时跳过"PF 判定必 no_signal"的 (站,频道) 对与已证缺席频道;每站扫完即服务已发现频道(SevenBatch 风格)
|
|
||||||
- **定位服务**:选点 = 保证接收盘内候选环采样 + 信息增益评分(ΔH − λ·移动 − μ·检测),有证书即清除;步数上限沿用 `max_localize_steps`
|
|
||||||
- **清除调度**:待服务任务(定位+清除 ≤20 节点)开放路径最近邻 + 2-opt,纯标准库,每个决策点滚动重排
|
|
||||||
- **收尾**:全部 CLEARED/ABSENT → all_resolved;清满 16 提前停;persistent_search 沿用现有配置语义(实现时对照 `run_q3_seven_practice.py` 保持官方演练停止行为一致)
|
|
||||||
|
|
||||||
## 3. 配置 `config.py`
|
|
||||||
|
|
||||||
新增 `BayesConfig` frozen dataclass([工程]):particle_spacing_m、λ/μ 权重、MC 代表数/子采样、skip_margin、站点环半径、2-opt 开关/迭代数等;挂到 `ProblemConfig.bayes`。默认值不改变现有策略行为。
|
|
||||||
|
|
||||||
## 4. 七点覆盖提升为库代码 `src/mcm26b/planner/seven.py`
|
|
||||||
|
|
||||||
把 `scripts/benchmark_q3_search.py` 的 `seven_points()/SevenImmediate/SevenBatch` 移入 src(旧脚本改 import,消融结果可复现),供 CLI 与新基准复用。
|
|
||||||
|
|
||||||
## 5. CLI `cli.py`
|
|
||||||
|
|
||||||
`mcm26b run --strategy {grid,seven,bayes}`,默认 grid;**若基准通过则默认改为 bayes**(用户已确认)。
|
|
||||||
|
|
||||||
## 6. 基准 `scripts/benchmark_q3_bayes.py`
|
|
||||||
|
|
||||||
配对消融 {seven_batch, bayes} ×(seeds 0..5 × 10/16 源 + 边界源 + 0 源纯缺席场景),复用现有 run_case/LocalSimulator 模式;输出 `output/q3/bayes-ablation/`(benchmark.json + report.md):全清率、correct_absence、异常、accounted/total 虚拟时间、配对降幅、实机 compute_wall_s。
|
|
||||||
|
|
||||||
## 7. Optuna 调参 `scripts/tune_q3_bayes.py`
|
|
||||||
|
|
||||||
- `uv add --group dev optuna`(仅调参脚本用,生产零新增依赖)
|
|
||||||
- TPE,目标 = 场景子集平均虚拟时间 + 10⁶×失败惩罚;场景与 error_seed 多样化防过拟合
|
|
||||||
- 搜索空间:h、λ/μ、skip margin、候选环、2-opt 开关等
|
|
||||||
- optuna 不可用时自动退化为随机搜索;最优参数写 JSON,复跑基准确认后合入 config.py 默认值
|
|
||||||
|
|
||||||
## 8. 测试
|
|
||||||
|
|
||||||
- `tests/test_particles.py`:真源保留性(随机场景 × LocalSimulator 误差场,任意更新序列后真源邻域格必活);证书正确性(alive=∅ ⟺ 真缺席;MEC 证书清除必成功);跳测规则永不漏检
|
|
||||||
- `tests/test_bayes_loop_q3.py`:端到端 LocalSimulator(10/16/0 源、边界源、预算耗尽、故障注入):全清 + 缺席正确 + 无异常 + 正常退出
|
|
||||||
- 现有 105 项测试保持绿
|
|
||||||
|
|
||||||
## 9. 文档
|
|
||||||
|
|
||||||
`docs/algo-3-bayes.md`(Voronoi 裕量严格性论证、信息增益与调度设计、与 A2 对比数据);README 策略表加行;`docs/algo-3.md` 加交叉引用。
|
|
||||||
|
|
||||||
# 执行顺序
|
|
||||||
|
|
||||||
1. `git checkout -b q3-bayes`
|
|
||||||
2. BayesConfig → particles.py(含单测)→ seven.py 提升
|
|
||||||
3. bayes_loop.py + CLI 接入 → pytest 全绿
|
|
||||||
4. 跑配对消融基准
|
|
||||||
5. Optuna 调参 → 回填参数复跑基准
|
|
||||||
6. 若达标(全清 100% 且配对均值更优):`mcm26b run` 默认切 bayes + 文档更新
|
|
||||||
7. 分支上分阶段 commit(不 push)
|
|
||||||
|
|
||||||
# 验收标准
|
|
||||||
|
|
||||||
- 基准全部场景:all_cleared 100%、correct_absence 100%、anomalies 空、normal_exit、单局实机计算 < 60s
|
|
||||||
- 配对平均虚拟时间优于 seven_batch(目标降幅 ≥5%;参考量级 A2=5232s/12 源)
|
|
||||||
- `uv run pytest` 全绿;`mcm26b run --self-test --problem 3` 通过
|
|
||||||
|
|
||||||
# 风险与对策
|
|
||||||
|
|
||||||
- PF 实机计算耗时 → 空间哈希 + MC 子采样,基准记录 compute_wall_s,超预算先降 MC 规模(实机预算 1200s,A2 仅用 3.4s,余量巨大)
|
|
||||||
- LocalSimulator 误差场确定性 → 调参与基准用多 error_seed
|
|
||||||
- 负观测删点的正确性 → Voronoi 裕量定理 + 随机化真源保留性测试兜底
|
|
||||||
@@ -1,187 +1,197 @@
|
|||||||
# mcm26b — CUMCM 2026 B题:无线电干扰源的快速自动定位与清除
|
# mcm26b — CUMCM 2026 B 题:无线电干扰源的快速自动定位与清除
|
||||||
|
|
||||||
统一框架:有界误差几何定位、主动选点、带覆盖证明的搜索、按真实动作耗时调度。
|
本仓库为参赛论文(`docs/paper/main.tex`)的可复现支撑材料:
|
||||||
分析依据 `issue/B题.pdf`、附件1《模拟器使用说明》、附件2《通信接口说明及编程指南》。
|
提供四问的完整可运行程序、自建模拟器、论文全部数据与插图的生成脚本。
|
||||||
|
算法本身的推导、证明与结果分析见论文,本文件只说明**怎么跑、怎么复现**。
|
||||||
|
|
||||||
- [四问建模分析与 P0–P7 实施计划](docs/B题建模分析与实施计划.md)
|
---
|
||||||
- [协议规则表、字段表与状态机(P0 交付)](docs/协议规则表与状态机.md)
|
|
||||||
- [问题一完整解答](docs/问题一解答.md)
|
|
||||||
- [问题三搜索与总耗时改进方案(含七点覆盖证明和自建消融)](docs/algo-3.md)
|
|
||||||
- [第三、四问系统性架构优化与运行提速方案(运行历史复核、最小命中集、联合信念)](docs/第三四问架构优化与运行提速方案.md)
|
|
||||||
- [第三、四问图论与动态规划优化方案(定点实测、路由 gap、定向定位 DP、证书硬化)](docs/第三四问图论与动态规划优化方案.md)
|
|
||||||
- [论文](docs/paper/main.tex)
|
|
||||||
|
|
||||||
## 项目结构
|
## 1. 环境
|
||||||
|
|
||||||
```
|
- Python ≥ 3.10;运行时依赖仅 `requests`,测试与自检另需 `pytest`、`numpy`。
|
||||||
referee/ # 独立评测机包(mcm26b-referee):模拟器引擎+机器狗接口+WebUI,
|
- 自建模拟器 `referee/` 为零第三方依赖的独立包,`uv sync` 时作为开发依赖一并挂载。
|
||||||
# 零第三方依赖、不依赖本队代码;题意符合性对照见 referee/README.md
|
- 复现论文 PDF 另需 TeX Live(XeLaTeX、ctex、TikZ)。论文用字体在 `docs/paper/fonts/`,
|
||||||
src/mcm26b/
|
该目录约 150 MB、**已在 `.gitignore` 中排除、不入库**;缺失时按
|
||||||
├── config.py # 参数中心:题面常量[题面] + 工程参数[工程],唯一字面量来源
|
`docs/paper/mcm26b-paper.cls` 中的「若未携带 fonts/ 目录」注释改用系统字体即可编译。
|
||||||
├── protocol/ # P0/P1 字段表、计时模型、状态机、串行幂等客户端(已完工)
|
|
||||||
├── geometry/ # P2 角域交会、直径、MEC、问题二安全候选盘证书(已完工)
|
|
||||||
├── belief/ # P3 逐频道候选集合 K_c:保守外包多边形 + 半平面裁剪(已完工)
|
|
||||||
├── coverage/ # P4 49点覆盖账本(网格生成 + 逐频道记录)
|
|
||||||
├── planner/ # P3 保证接收盘选点器 / P4 全向闭环 / P5 混合源定向闭环(已完工)
|
|
||||||
├── routing.py # 图论/DP 工具箱:Held-Karp 精确开放路径、2-opt/Or-opt、MST 下界、路由度量
|
|
||||||
├── evaluation/ # 日志复算与统计(已完工)
|
|
||||||
└── harness/ # 测试侧适配:评测机<->Transport 内存回环、故障注入、回放、场景
|
|
||||||
tests/ # pytest(含解耦守卫:运行时零导入 referee + 规则表不漂移)
|
|
||||||
scripts/ # 采集、基准、可视化与校核脚本(含问题四批量仿真 benchmark_q4.py、
|
|
||||||
# 运行历史计时分解 analyze_run_timing.py、第四问覆盖证书 verify_q4_cover.py)
|
|
||||||
output/ examples/ # 演练证据、算例与生成产物
|
|
||||||
```
|
|
||||||
|
|
||||||
## 独立评测机与 WebUI(referee/)
|
|
||||||
|
|
||||||
评测机已抽成独立包:`referee/`(uv workspace 成员,`uv sync` 自动挂载为 dev 依赖)。
|
|
||||||
参赛队运行时代码**零导入** referee,双方仅通过附件2 的 HTTP 协议耦合——
|
|
||||||
评测机可独立服务任何客户端,参赛队代码对接官方模拟器无需任何改动。
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
uv run python -m referee # WebUI http://127.0.0.1:8026,接口 :2026
|
uv sync # 安装主包与 referee(可编辑挂载)
|
||||||
uv run python -m referee --port 2026 --ui-port 8026 --data-dir referee-data
|
|
||||||
uv run mcm26b run --robot-id 2026001 --local-judge # 一键:起评测机→开演练局→闭环→汇总
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- **WebUI 完全按附件1 §4 复现官方界面语义**:四个测试模块(演练不限次/正式各3次、
|
---
|
||||||
启动即占用、正式前再次确认)、确认开始→数据准备→5秒倒计时→25分钟窗口开放接口、
|
|
||||||
"指令与反馈"默认最新1000条(100..5000 可调)、中止测试两次确认、结束原因显示、
|
|
||||||
案例编码、演练结束显示 总数/全向/定向(正式任何界面不显示真值)、行为日志导出
|
|
||||||
(2MB 上限告警)、空闲时可改端口、只监听本机回环。
|
|
||||||
- **回放器**("回放"Tab):以本局行为日志 JSONL 驱动,在 Ω 圆上动画复现运动与
|
|
||||||
扫描过程——移动按 5m/s 展开、检测以雷达扫描动画呈现(direction 附实测示向度
|
|
||||||
射线)、清除先光学定位再清除;支持播放/暂停、逐步±、1×~300× 倍速快进、
|
|
||||||
滚轮缩放/拖拽平移、带动作刻度的进度条任意定位;兼容 CSV 式逐事件信息面板。
|
|
||||||
**支持手动选定 JSONL 回放**:点击"选择 JSONL 文件"或直接拖拽导入任意行为日志
|
|
||||||
(评测机日志含真值;参赛队客户端会话日志取 accepted 事件,无真值),纯前端解析。
|
|
||||||
- 引擎与协议:`referee.simulator`(观测判定/幂等/并发409/微秒计时/截止断连)、
|
|
||||||
`referee.interface`(附件2 §5 完整语法边界,HTTP 服务器与内存直连共用),
|
|
||||||
一致性由 `referee/tests` 90 项测试与真实 HTTP 测试固化。
|
|
||||||
- 自建差异(题面未规定)均在 referee/README.md 声明:联网登录/官方校时/17:30
|
|
||||||
截止/加密上传属官方服务器侧策略,本地不实现;示向度误差场与场景分布是测试假设。
|
|
||||||
|
|
||||||
## 快速开始
|
## 2. 运行程序(问题三 / 问题四闭环)
|
||||||
|
|
||||||
Python ≥ 3.10,运行时依赖仅 `requests`;测试/自检另需 `pytest` 与独立评测机
|
**队号不在代码中固化**:登录标识属身份信息,一律在运行时通过 `--robot-id` 传入,
|
||||||
包(`uv sync` 一并安装)。
|
代码、测试、示例与日志中只出现与赛事无关的中性占位符(如 `TEAM-0001`)。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
uv sync # 安装(可编辑挂载本包与 referee)
|
# 对接官方模拟器(先在界面确认测试已开始、接口就绪)
|
||||||
uv run pytest # 全部测试(含 referee 90 项 + 解耦守卫)
|
uv run python -m mcm26b.cli run --robot-id <队号> --problem 3
|
||||||
uv run python -m referee # 起本地评测机(可选,配合 WebUI 回放)
|
uv run python -m mcm26b.cli run --robot-id <队号> --problem 4
|
||||||
uv run mcm26b sim-check # P0 自检:复现附件计时示例 105/111/194/199
|
|
||||||
uv run mcm26b run --robot-id 2026001 --self-test # 问题3自检:随机全向场景闭环(不连官方)
|
# 一键本地评测:自动起自建模拟器 → 开一局演练 → 跑完整闭环 → 汇总
|
||||||
uv run mcm26b run --robot-id 2026001 --self-test --problem 4 # 问题4自检:混合定向源场景
|
uv run python -m mcm26b.cli run --robot-id <队号> --problem 3 --local-judge
|
||||||
# 自检默认:源数按题面 10~16 随机;实机预算 30 分钟(--real-budget-s 可改,仅自检生效);
|
|
||||||
# 找全后持续复扫未清除频道直到限时(--config 关闭 persistent_search 可回到"找全即退")
|
# 不连任何模拟器的自检(随机场景,内存回环)
|
||||||
uv run mcm26b run --robot-id <队号> --log output/run/session.jsonl # 对接模拟器正式/演练
|
uv run python -m mcm26b.cli run --robot-id SELFCHECK --problem 3 --self-test
|
||||||
uv run mcm26b run --robot-id <队号> --base-url http://127.0.0.1:2026 # 对接本地 referee
|
|
||||||
uv run mcm26b run --robot-id 2026001 --local-judge # 一键本地评测:自动起 referee+开演练局
|
# 复现附件计时示例(期望 105/111/194/199 秒)
|
||||||
# 端口被占时主动询问换端口(非交互自动改空闲端口);WebUI 可实时观战并在"回放"Tab
|
uv run python -m mcm26b.cli sim-check
|
||||||
# 逐步回看;结束自动汇总结束原因/真值统计/全清校验(--judge-no-ui 可关闭界面)
|
|
||||||
uv run mcm26b q1 examples/q1/normal.json # 问题一求解(等价 python -m mcm26b.geometry ...)
|
|
||||||
uv run python main.py examples/q1/triangle.json --rounding-margin-deg 0.005
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 问题一(P2,已完工)
|
主要开关:`--strategy {bayes,seven,grid}`(仅问题三,默认 `bayes`)、
|
||||||
|
`--base-url`、`--log <路径>`、`--real-budget-s`(仅自检生效)。
|
||||||
|
|
||||||
给定同频道多个检测点及 ±1° 误差示向度,计算前向角域交集(半平面交)、
|
### 问题一 / 问题二
|
||||||
定位区域直径、直径圆覆盖判断(含反例顶点与超出距离)与最小包围圆、20m 清除余量。
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
uv run mcm26b q1 examples/q1/normal.json -o output/q1/result.json
|
uv run python -m mcm26b.cli q1 examples/q1/normal.json -o output/q1/result.json
|
||||||
uv run python scripts/build_q1_demo.py # 重建离线交互可视化 output/q1/question1.html
|
uv run python -m mcm26b.geometry examples/q1/triangle.json
|
||||||
uv run python scripts/benchmark_q1.py # MEC 基准与舍入敏感性
|
|
||||||
```
|
```
|
||||||
|
|
||||||
离线交互页:`output/q1/question1.html`。可选 PNG 重绘需要 Pillow 与 Windows
|
`examples/q1/` 下的五个算例分别覆盖正常多边形、劣交会、零误差线段、不相容观测与直径圆反例。
|
||||||
雅黑字体:`python scripts/render_q1_figures.py`;事件校核需要 Node.js:
|
|
||||||
`node scripts/verify_visualization.cjs`。二者仅为图形校核,非求解依赖。
|
|
||||||
|
|
||||||
## 协议基线(P0/P1,已完工)
|
仓库根的 `main.py` 只是转发到同一 CLI 的薄壳(`python main.py <子命令>`),
|
||||||
|
等价于 `python -m mcm26b.cli <子命令>`。
|
||||||
|
|
||||||
- `protocol.rules`:四条指令的字段表、结果码与错误语义(可执行表格);
|
---
|
||||||
- `protocol.timing`:纯计时模型,逐步复现附件示例 105/111/194/199;
|
|
||||||
- `protocol.state.RobotState`:位置/频道/虚拟时刻状态机;accepted=false 不更新,
|
|
||||||
`/clear` 不切频道,虚拟时刻以 accepted 响应为准;
|
|
||||||
- `protocol.client.SimulatorClient`:串行发送、幂等重试(同 ID 同内容原样重发)、
|
|
||||||
连接/读超时、基于 `remaining_real_duration_s` 的本地截止时钟与退出预留、JSONL 会话日志;
|
|
||||||
- 独立包 `referee`:按附件语义复现评测机(观测门限、定向覆盖角、幂等回放、
|
|
||||||
整数微秒计时、现实/虚拟截止、并发409和请求校验),真值只对评测机/测试端开放;
|
|
||||||
`harness.LocalSimTransport` 内存回环挂载(与 referee HTTP 服务器共用同一边界),
|
|
||||||
`harness.ScriptedFaultTransport` 注入断连/超时/500,`harness.PlaybackTransport`
|
|
||||||
回放官方演练日志。
|
|
||||||
|
|
||||||
本地模拟器默认执行至多1200秒程序预算、1500秒接口开放窗口,截止后通过
|
## 3. 自建模拟器(`referee/`)
|
||||||
`SimulatorClosed` 模拟连接关闭,已登记动作可以完成。可注入 `clock`、`wall_clock`
|
|
||||||
和 `window_started_at` 测试迟到与超时。CLI `--self-test` 显式使用 `stress_mode=True`,
|
|
||||||
保留默认1800秒压力预算并扩展窗口;这不是官方演练时限。
|
|
||||||
内存传输不实现TCP连接限流、UI或日志上传;场景均匀分布及逐点哈希误差仍是测试假设。
|
|
||||||
|
|
||||||
```python
|
按题面附件 1《模拟器使用说明》与附件 2《通信接口说明》实现,与参赛队代码零耦合,
|
||||||
from mcm26b.protocol import SimulatorClient
|
只通过 HTTP 协议对接;论文正文的演练数据即由它产生。
|
||||||
client = SimulatorClient("参赛队号") # 默认 http://127.0.0.1:2026
|
|
||||||
client.enter()
|
```bash
|
||||||
outcome = client.measure((300, 400), 1) # MeasureOutcome(result, svd_deg, ...)
|
uv run python -m referee # WebUI http://127.0.0.1:8026,接口 :2026
|
||||||
client.exit()
|
uv run python -m referee --data-dir referee-data
|
||||||
```
|
```
|
||||||
|
|
||||||
## 阶段状态(对照 P0–P6 计划)
|
- 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)在本目录内的全部会话,已从本机客户端存储中提取并汇编为一份合规记录:
|
||||||
|
|
||||||
|
| 文件 | 说明 |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| P0 规则固定(规则表/状态机/字段表,示例逐步 105/111/194/199) | ✅ 完成 |
|
| [`docs/aigc-compliance-record.tex`](docs/aigc-compliance-record.tex) | LaTeX 源文件(58 页):编制说明、使用总览、环境与权限配置、逐会话逐轮次详细记录、合规性说明、附录 |
|
||||||
| P1 协议基线(客户端 + 自建回放/故障注入测试) | ✅ 完成 |
|
| [`docs/aigc-compliance-record.pdf`](docs/aigc-compliance-record.pdf) | 编译成品 |
|
||||||
| P2 几何内核(角域交、直径、MEC、证书) | ✅ 完成(迁入 `mcm26b.geometry`) |
|
|
||||||
| P3 问题二选点(K1、候选区域 Q、采样评估) | ✅ 完成(belief + 选点器,测试固化) |
|
|
||||||
| P4 问题3全向闭环(49点覆盖、定位队列、清除、停止) | ✅ 官方问题3演练单案例通过(10/10全清,[验证报告](output/q3/practice/20260911-port2026/report.md)) |
|
|
||||||
| P5 问题4定向扩展(联合约束、后备清除、预算) | ✅ 自建完成(官方演练待执行) |
|
|
||||||
| P6 加速与消融 | ✅ 七点批量(`--strategy seven`,官方演练 12/12)+ 贝叶斯闭环(`--strategy bayes` 默认,自建消融 −30.0%,[算法说明](docs/algo-3-bayes.md)) |
|
|
||||||
| P7 图论/动态规划优化(S1–S5) | ✅ 已落地([实测回填](docs/第三四问图论与动态规划优化方案.md#8-本轮实测回填2026-09-12-实施结果)):路由度量入库、覆盖证书硬化(15 m/72 缺口 566→0)、Q4 后备盲清 125.7→4.3 次/局;同时修复联合信念 `no_signal` 朝向规则反向缺陷 |
|
|
||||||
|
|
||||||
### 图论/DP 轮(2026-09-12,S1–S5)要点
|
记录覆盖 **11 个会话 / 34 个工作轮次 / 31 条人工提示词 / 1508 次工具调用**,
|
||||||
|
跨 2026-09-10 20:52 至 2026-09-13 18:51(UTC+8)。每条目给出该轮次的
|
||||||
|
**发生时间、执行环境与上下文(含提示词全文)、大模型实际操作概要**(工具调用分类、
|
||||||
|
写入文件、代表性命令、模型对外结论)。
|
||||||
|
|
||||||
- **S1 度量**:`scripts/run_suite.py` 逐局新增 `route_gap_vs_offline`、
|
编译(需 ctex / longtable / booktabs):
|
||||||
`route_lower_bound_s`(MST 下界)、`distinct_service_points`、
|
|
||||||
`coverage_actual_visited`、`probe_no_signal_ratio`、`plan_verify_wall_s`;
|
|
||||||
图算法在 `src/mcm26b/routing.py`(Held-Karp 精确 / 2-opt / Or-opt / Prim)。
|
|
||||||
- **S2 证书**:`q4_mincover_v2`(31 点,`r_design=965 m` + 前向角裕量 5°,
|
|
||||||
15 m/72 档 325.6 万 (p,h) 缺口 0,最坏命中 990 m),取代粗采样过拟合的
|
|
||||||
`q4_mincover_v1`(25 m/48 档 125 缺口)。
|
|
||||||
- **S3 探点**:默认口径改为"可见候选里移动最省"(`probe_score_mode=nearest_visible`);
|
|
||||||
后备盲清 125.7 → 4.3 次/局,Q4 core 均值 8676 → 8602 s、最坏 10891 → 9630 s。
|
|
||||||
- **S4/S5 负面结论**:后备清除 Or-opt、Held-Karp 精确任务序、路线感知探点
|
|
||||||
在本模拟器上均为净负收益,默认关闭,代码与开关保留(见方案 §8.6)。
|
|
||||||
- **正确性修复**:`belief/joint.py` 的 `no_signal` 朝向裁剪原先规则反向且漏计格内
|
|
||||||
角裕量,会删掉真源朝向档;已修复并由 `tests/test_joint_belief.py` 的随机观测
|
|
||||||
序列保留性测试固化。
|
|
||||||
|
|
||||||
## 采集与正式测试约束
|
|
||||||
|
|
||||||
改进版 A2(七点覆盖+本站批量扫频)已通过官方案例 `J4ER-Y9EP-Q379-UPFA`:
|
|
||||||
12/12源全清,109次检测,虚拟耗时5232.132109秒,现实耗时3.406秒。
|
|
||||||
[本局报告与运行方法](output/q3/practice/20260911-seven-batch-01/report.md)。
|
|
||||||
独立入口为 `scripts/run_q3_seven_practice.py`。
|
|
||||||
|
|
||||||
贝叶斯闭环 `bayes`(网格粒子滤波+负观测更新+信息增益选点+滚动 2-opt
|
|
||||||
调度,参数经 Optuna 回填)在自建模拟器配对消融中相对 SevenBatch 平均
|
|
||||||
虚拟时间再降 30.0%(14/14 场景全清零异常),算法与数据见
|
|
||||||
[algo-3-bayes.md](docs/algo-3-bayes.md),已是 `mcm26b run` 默认策略。
|
|
||||||
虚拟时间即成绩口径:找全证明后立即 `/exit`(`--persistent` 可显式开启
|
|
||||||
"扫到限时"的复扫保险模式)。
|
|
||||||
|
|
||||||
2026-09-11 已通过本机 2026 端口完成一次官方问题3演练:案例
|
|
||||||
`DHFK-PHD2-SR2P-FXK9`,10/10 源全清,540 次检测、10 次清除,现实耗时
|
|
||||||
7.629 秒。原始请求响应、官方产物及离线审计见上述验证报告。原计时复算的
|
|
||||||
541 处微秒精度误报也已记录;按官方整数微秒累计规则独立复算后,552 个
|
|
||||||
响应时刻全部吻合。生产计时复算函数保持原样。
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
uv run python scripts/verify_q3_practice.py output/q3/practice/20260911-port2026
|
cd docs
|
||||||
|
latexmk -xelatex -interaction=nonstopmode aigc-compliance-record.tex
|
||||||
```
|
```
|
||||||
|
|
||||||
本项目只使用官方**演练**采集观测,从未使用正式测试。`scripts/capture_practice.py`
|
> 记录由审计脚本从 `~/.codex/sessions/`、`~/.codex/state_5.sqlite`、`~/.dsh/sessions/`
|
||||||
不会启动测试:必须先在界面确认“问题3演练”、接口已就绪,再提供
|
> 中**工作目录等于本仓库**的会话自动提取生成,原始记录未经改写;提取与统计脚本
|
||||||
`--practice-confirmed` 与本局案例编码。正式测试由团队按计划另行安排;
|
> 存于 `tmp/aigc/`(该目录按 `.gitignore` 不入库)。会话如何归属本项目、
|
||||||
加密日志上传上限 2MB,程序避免异常高频循环。
|
> 哪些存储被核查后排除,见记录第 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` 记录论文各轮修订与验证过程(含数据重采与问题修复)。
|
||||||
|
|||||||
@@ -1,237 +0,0 @@
|
|||||||
# B 题建模分析与实施计划
|
|
||||||
|
|
||||||
根据你们对工程实践和物理模型的熟悉程度,确定研究 B 题“无线电干扰源的快速自动定位与清除”。推荐采用**有界误差几何定位、主动选点、具有覆盖证明的搜索、按实际动作耗时调度**的统一框架。AI 辅助推导、实现与实验分析,策略只依赖题目允许的观测。
|
|
||||||
|
|
||||||
本文件已结合本次评审修订。问题一的几何内核、离线可视化和官方演练观测回放已经完成;问题二新增了安全候选圆盘证书,但主动选点优化器、问题三和四的全清闭环尚未完成。文中的覆盖结论是根据题设推导的,耗时估算不是演练成绩。当前工作仅离线复算既有演练记录,不使用正式测试。
|
|
||||||
|
|
||||||
依据:`issue/B题.pdf` 全文、`issue/附件/附件1.docx`《模拟器使用说明》、`issue/附件/附件2.docx`《模拟器通信接口说明及编程指南》。文档中的登录、测试和日志要求在这里作为交付约束分析,不作为自动执行正式测试的指令。
|
|
||||||
|
|
||||||
## 本次建议的取舍
|
|
||||||
|
|
||||||
| 建议 | 处理结论 |
|
|
||||||
| --- | --- |
|
|
||||||
| 四问复用几何内核、有界误差、覆盖证明、严格停止、幂等协议 | 保留,作为主线与验收条件 |
|
|
||||||
| 问题二的候选集合加入 $\Omega$ 和 1500 米上界 | 采纳,但仅加入在线候选集合 $K$,不改变问题一纯角域多边形 $P$ |
|
|
||||||
| 问题二首次测向后安全区域可能为空 | 对一般 $K$ 成立;本题首次窄角域可直接证明非空,见下文 |
|
|
||||||
| $Q$ 为空就去最小包围圆圆心并结合交会角 | 仅是一般情形的探索退化;$\rho>1000$ 时不保证接收,不能冒充保底方案 |
|
|
||||||
| 枚举所有直径对判断直径圆 | 简化为任意一组最远点对检查一次;失败时给出圆外顶点 |
|
|
||||||
| 定向无信号不直接删位置、失去信号后覆盖清除 | 采纳;执行前必须计算覆盖格数、路径和现实请求预算 |
|
|
||||||
| 现实20分钟优先控制请求数 | 采纳为硬约束;全部清除后仍按题目虚拟时间优化 |
|
|
||||||
| P0–P7分期与尽早正式测试 | 采纳分期;演练不限定3次,正式问题3/4各3次由团队另行安排 |
|
|
||||||
| `/detect` | 修正为附件规定的 `/measure` |
|
|
||||||
|
|
||||||
## 1. 四问应当串成一条实现主线
|
|
||||||
|
|
||||||
| 问题 | 要回答的实质问题 | 推荐抽象 | 必须交付的结果 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| 1 | 带误差的多个方位如何形成定位区域,其直径如何计算,直径圆是否覆盖区域 | 扇形角域的半平面交、凸多边形直径、最小包围圆 | 算法、边界情形、覆盖判断及反例 |
|
|
||||||
| 2 | 仅有一次测向时,下一步去哪里更有利 | 在未知目标位置条件下进行主动测量设计 | 明确的候选区域、选点目标和比较实验 |
|
|
||||||
| 3 | 数量未知的全向源如何全部找到并尽快清除 | 全域覆盖、逐频道候选区域、局部定位与路径调度 | 演练统计、3 次正式结果、原名正式日志 |
|
|
||||||
| 4 | 有未知朝向的定向源时,如何避免遗漏 | 加入朝向不确定性的观测模型、半平面覆盖、失去信号后的处理 | 演练统计、另外 3 次正式结果、正式日志 |
|
|
||||||
|
|
||||||
第 1 问的定位区域和包围圆直接服务第 2 问选点与第 3、4 问清除;第 3 问的工程框架延伸到第 4 问。模型不必为每问重新搭建。
|
|
||||||
|
|
||||||
## 2. 用题面明确的观测能力约束物理抽象
|
|
||||||
|
|
||||||
目标区域为 $\Omega=\{(x,y):x^2+y^2\le 1800^2\}$。每个频道最多有一个源,源总数为 10–16,频道为 1–20。对一个存在的源 $c$,用未知位置 $g_c$、接收半径 $R_c\in[1000,1500]$、类型和定向朝向描述;全向源不需要朝向参数。
|
|
||||||
|
|
||||||
机器狗状态只需要位置 $p$、当前测向频道 $k$、虚拟时间、现实剩余时间、各频道的观测历史和处理状态。每个频道维护:未知/已发现待定位/可清除/已清除/已证明不存在,以及尚可能包含源的集合 $K_c$。
|
|
||||||
|
|
||||||
| 规则 | 数学或程序含义 | 容易出现的错误 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| 只返回 no_signal、near、direction;direction 附带示向度 | 这是带距离可见性门限的方位观测问题 | 构造接口并未提供的 RSSI、距离或场强数据 |
|
|
||||||
| 同地点误差固定,幅度不超过 $1^\circ$ | 用有界误差集合,保留空间相关性 | 原地重复测量取平均,假定可消除误差 |
|
|
||||||
| 示向度保留两位小数 | 题设模型取 $\pm 1^\circ$;实现可另设 $\pm 1.005^\circ$ 保守裕量 | 把额外舍入裕量写成题面规定 |
|
|
||||||
| 定向源覆盖朝向两侧各 $90^\circ$,包含边界 | 检测点须处于以源为界的发射半平面内 | 把无信号直接判定为没有源 |
|
|
||||||
| 可到目标圆域外检测与清除 | 目标位置受 $\Omega$ 限制,机器狗正常搜索不受 $\Omega$ 限制 | 所有搜索点强制留在圆域内,遗漏朝外发射的边界源 |
|
|
||||||
| 清除半径 20 米,不受定向朝向限制 | 清除可成为失去信号时的可靠后备手段 | 认为背面接收不到信号就无法清除 |
|
|
||||||
| /clear 不切换测向频道 | 保存独立的当前测向频道状态 | 清除后错误更新频道,算错下一次检测耗时 |
|
|
||||||
|
|
||||||
不需要重新拟合电磁传播衰减公式:接口只暴露接收门限与方位,额外物理参数无法由题目观测充分辨识。工程经验主要用于设计可见性分析、测向几何和闭环决策。
|
|
||||||
|
|
||||||
精确的虚拟时间目标是:
|
|
||||||
|
|
||||||
$$
|
|
||||||
T=\frac{L}{5}+N_{\mathrm{switch}}+5N_{\mathrm{measure}}
|
|
||||||
+5N_{\mathrm{clear,success}}+3N_{\mathrm{clear,fail}}.
|
|
||||||
$$
|
|
||||||
|
|
||||||
$L$ 包括检测和清除引发的所有移动,切换次数只由被接受的检测动作决定。先满足全部清除,再减少 $T$;不能通过少清几个源来改善平均时间。程序运行时间是另一个硬约束,不能把虚拟检测的 5 秒实现为现实 `sleep(5)`。
|
|
||||||
|
|
||||||
## 3. 定位与选点的统一几何标准
|
|
||||||
|
|
||||||
在 $s_i$ 测到 $\theta_i$ 后,定义 $W_i$ 为从 $s_i$ 出发、方向范围 $[\theta_i-\delta,\theta_i+\delta]$ 的前向角域。它由两条线性半平面约束表示,必须正确处理 $0^\circ/360^\circ$ 跨界。
|
|
||||||
|
|
||||||
第 1 问的定位多边形 $P$ 为这些角域的交。求各边界直线交点并筛选可行点、排序成凸多边形后,小规模下直接枚举顶点对即可计算直径:
|
|
||||||
|
|
||||||
$$
|
|
||||||
D(P)=\max_{i,j}\lVert v_i-v_j\rVert.
|
|
||||||
$$
|
|
||||||
|
|
||||||
先用简单可靠的顶点对枚举作基准,规模确有需要时再换旋转卡壳。算法必须区分空集、单点、线段、有限多边形和无界区域;不能靠任意大方框截断后声称得到无界区域的真实直径。旋转卡壳的背景可参考 [McGill 计算几何研究页面](https://www-cgrl.cs.mcgill.ca/~godfried/research/calipers.html)。
|
|
||||||
|
|
||||||
**直径为 $D$ 的圆不一定覆盖直径为 $D$ 的区域。**例如边长为 $D$ 的等边三角形,最小包围圆半径为 $D/\sqrt{3}$,大于 $D/2$。后续保证清除应使用:
|
|
||||||
|
|
||||||
$$
|
|
||||||
\rho(K)=\min_z\max_{g\in K}\lVert g-z\rVert\le 20.
|
|
||||||
$$
|
|
||||||
|
|
||||||
到最小包围圆圆心清除是充分选择,并非唯一选择。所有可保证清除的位置组成 $C_{20}(K)=\bigcap_{g\in K}B(g,20)$;只要该集合非空,就可进一步选择距离机器狗最近的可行点来节省移动。$D\le 40$ 只是必要条件,不是充分条件。最小包围圆是已有标准计算几何问题,可参考 [CGAL Min_circle_2 文档](https://doc.cgal.org/latest/Bounding_volumes/classCGAL_1_1Min__circle__2.html)。实现时给 20 米阈值保留数值余量;数值阈值附近返回谨慎判断,不把浮点容差当作精确算术证明。
|
|
||||||
|
|
||||||
直径圆覆盖只需任意一组最远顶点 $A,B$:包含距离为 $D$ 的两点且半径为 $D/2$ 的圆,其圆心只能是 $(A+B)/2$。因此检查一次全部顶点即可;若失败,换另一组直径对也不可能产生覆盖圆。问题一实现现输出最坏超出距离、圆外顶点索引和一个具体反例顶点。
|
|
||||||
|
|
||||||
在线定位还可用 $\Omega$ 和“收到信号意味着距离 $\le 1500$”约束 $K$。圆盘交角域可能包含曲线边界;若用多边形近似,必须构造外包近似,才能维持“不丢失真源”的保证。用圆周采样点连成的内接多边形不能直接作为保守外包。
|
|
||||||
|
|
||||||
第 2 问建议先明确“较好的定位效果”:以新观测后的最坏包围圆半径为主要几何指标,再考虑移动和检测成本。交会角大、面积小可作为候选点筛选指标,但不是对所有未知位置都最优的证明。
|
|
||||||
|
|
||||||
第一次收到 `direction` 后,明确取 $K_1=\Omega\cap W(s_1,\theta_1\pm\delta)\cap B(s_1,1500)$。保留整个距离圆盘是保守处理,忽略 `direction` 还隐含的近距离排除不会丢失真源。对全向源,第二检测点的安全候选区域为:
|
|
||||||
|
|
||||||
$$
|
|
||||||
\mathcal{Q}=\left\{q:\max_{g\in K_1}\lVert q-g\rVert\le 1000\right\}.
|
|
||||||
$$
|
|
||||||
|
|
||||||
在这里测量,不论实际目标位于 $K_1$ 何处,接收距离都满足题目最小接收半径;可能返回 `direction`,也可能返回 `near`。若已知外包圆 $K_1\subseteq B(c,r)$,且 $r\le 1000$,则 $B(c,1000-r)$ 是充分候选区域,等号时是单点。不要误写成“距第一次检测点不超过 1000 米”。宽松外包圆的 $r>1000$ 不能证明真实 $\mathcal{Q}$ 为空。
|
|
||||||
|
|
||||||
本题还有比“检查 $\mathcal{Q}$ 是否为空”更强的解析结论。令 $R=1500$,$u$ 为第一次示向方向,$\delta\le 45^\circ$,定义
|
|
||||||
|
|
||||||
$$
|
|
||||||
a=\frac{R}{2\cos\delta},\qquad c=s_1+au.
|
|
||||||
$$
|
|
||||||
|
|
||||||
整个截断角域 $W\cap B(s_1,R)$ 包含在 $B(c,a)$ 内。证明:任意候选 $g=s_1+tu_\varphi$ 满足 $0\le t\le R$、$|\varphi-\theta_1|\le\delta$,因此
|
|
||||||
|
|
||||||
$$
|
|
||||||
\lVert g-c\rVert^2=t^2+a^2-2at\cos(\varphi-\theta_1).
|
|
||||||
$$
|
|
||||||
|
|
||||||
该式关于 $t$ 是凸函数,最大值在 $0$ 或 $R$ 取得;两端都不超过 $a^2$。于是 $K_1\subseteq B(c,a)$,从而 $B(c,1000-a)\subseteq\mathcal{Q}$。$\delta=1.005^\circ$ 时,$a\approx 750.115391$ 米,安全圆盘半径约 $249.884609$ 米,严格为正;题设 $\delta=1^\circ$ 同样成立。即使检测点或 $c$ 在 $\Omega$ 外也合法,因为机器狗不受源位置圆域限制。实现见 `geometry/planning.py::first_bearing_candidate_disk`。
|
|
||||||
|
|
||||||
因此,在本题一致的首次测向条件下无需依赖“$\mathcal{Q}$ 空集退化”。对后续更一般的非空紧集 $K$,$\mathcal{Q}$ 非空当且仅当 $\rho(K)\le 1000$;若确实 $\rho>1000$,去 MEC 圆心只是最小化最坏接收距离的探索动作,必须允许 `no_signal`。若 $K$ 为空,应先核查频道、数据、误差界与几何计算,不给空集编造中心。上述证书只保证距离;不能直接用于定向源的朝向可见性保证。
|
|
||||||
|
|
||||||
在上述安全圆盘内,围绕测向轴两侧取候选点,计算后验包围半径与动作代价。最坏情形目标可写为 $\sup_{\theta'}\rho\bigl(K_1\cap W(q,\theta')\bigr)$,其中 $\theta'$ 遍历与 $K_1$ 和误差界一致的读数;实现先用目标位置与误差区间端点采样,并加密检查。若返回 `near`,则候选源位于当前点 5 米以内,可直接在当前位置尝试清除该频道。交会角仅作筛选或同分择优,不为改善交会角越出已证明安全的候选区域。采样是启发式,不能称为严格最坏情形最优解;圆弧先验如需离散,使用外包切线多边形并记录逼近误差。
|
|
||||||
|
|
||||||
## 4. 搜索完整性和停止条件要有可验证的依据
|
|
||||||
|
|
||||||
第 3 问中,在 $s$ 对尚未清除频道测得 `no_signal`,可以排除以 $s$ 为中心、半径 1000 米的圆盘内存在该全向源。超过 1000 米仍可能存在接收半径较小的源,不能一律排除到 1500 米。
|
|
||||||
|
|
||||||
第 4 问中,同样的 `no_signal` 约束的是“位置、半径、朝向”的联合假设。若位置和朝向暂不联合维护,最简单的可靠基线就是不利用这一观测直接删除空间候选点,只记录覆盖检测已完成。后续加速版本再维护朝向可行集合。
|
|
||||||
|
|
||||||
可以先构造一个对全向、定向均适用的完整发现基线:
|
|
||||||
|
|
||||||
$$
|
|
||||||
S=\{(700i,700j):i,j=-3,-2,\ldots,3\},\quad |S|=49.
|
|
||||||
$$
|
|
||||||
|
|
||||||
这些点覆盖 $[-2100,2100]^2$,包含目标圆域,并允许到圆域外访问。对于位于一个网格单元内部的源 $g$,该单元 4 个顶点到 $g$ 的距离都不超过 $700\sqrt{2}\approx 989.95$ 米。$g$ 在这些顶点的凸包内部,所以经过 $g$ 的任意发射半平面总包含至少一个顶点。该顶点满足接收距离与发射角条件。源恰在网格边或顶点时,取相邻单元的顶点;由于目标圆域与外框有余量,两侧相邻点都存在,仍可选择距离合格、且不与源重合的可见点。
|
|
||||||
|
|
||||||
因此,对每个尚未解决的频道完成这些点的测量,能够保证发现该频道存在的源。实际实现可跳过已经清除或已经具有有效定位任务的频道,但必须保存逐频道的覆盖记录,不能把“路过某点”当作“测过所有频道”。
|
|
||||||
|
|
||||||
作为规模检查,49点全部扫描20频道最多需要980次检测。若从原点去网格一角,再按逐行折返路线扫完,纯扫描路程约36569.85米;每点检测成本上界120秒,纯扫描虚拟总耗时上界约13193.97秒,即3.665小时。**该估算不含定位、清除及其绕行,也不保证满足现实20分钟窗口。**它说明覆盖基线在100小时虚拟上限内有设计空间,现实可行性仍要测接口延迟、总请求数和日志大小。
|
|
||||||
|
|
||||||
发现源后,先通过主动测向缩小候选集合。若定向源再次失去信号,可对已知有界候选集合构造半径小于 20 米的有限圆盘覆盖,逐点调用 `/clear`,作为不依赖朝向的后备清除方法。边长 20 米方格中心距格内任何点不超过 $10\sqrt{2}$ 米;保留与候选集合相交的格子即可保守覆盖。格子按统一半开区间索引,源恰在网格线上时至少归入一个格子;若相交判定数值不确定则保留格子。
|
|
||||||
|
|
||||||
有限不等于现实预算可行。设候选外包框宽为 $w$、高为 $h$,使用全局 20 米网格枚举时,上界可取 $N\le(\lceil w/20\rceil+2)(\lceil h/20\rceil+2)$,再以实际相交格子列表得到精确请求上限。生成路径长度 $L$ 后,单源全失败清除耗时为 $L/5+3N$;若最后一次成功则为 $L/5+3(N-1)+5$。现实代价用 $N$ 乘实测单请求高分位耗时加本地计算时间估计。不满足剩余预算时应继续有希望的定位、选择其它任务或按预算退出,不能声称后备清除保证 20 分钟内成功。即使已知源落在半径 1500 米圆盘,按外包框枚举仍有约 $2.3$ 万个格子的量级,故宽候选集合不能直接盲扫。
|
|
||||||
|
|
||||||
停止成功的依据为以下任一项:
|
|
||||||
|
|
||||||
- 已成功清除16个不同频道的源,达到题设数量上界。
|
|
||||||
- 每个频道都已有清除成功记录,或通过完整覆盖证明不存在;所有已发现源均已处理完毕。
|
|
||||||
|
|
||||||
发现10个源、连续若干次无信号、候选采样点恰好为空,都不是充分停止条件。现实预算不足而退出应记为未证明完成,不能与成功退出混记。
|
|
||||||
|
|
||||||
## 5. 在可靠基线之上增加加速策略
|
|
||||||
|
|
||||||
先做“发现一个、定位清除一个”的简单闭环,保证功能可运行;再增加以下独立可开关的策略,以便消融比较:
|
|
||||||
|
|
||||||
| 策略 | 所解决的问题 | 需要验证的收益 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| 共享检测位置 | 一次移动后顺便测多个未知频道 | 是否减少总移动时间,而非仅减少单目标测量数 |
|
|
||||||
| 目标队列和短路径排序 | 多个已发现源处理顺序不佳 | 路程减少是否抵消局部定位变差 |
|
|
||||||
| 第二点主动选取 | 共线或小交会角导致候选区域狭长 | 同等观测预算下包围圆半径、清除耗时改善 |
|
|
||||||
| 自适应覆盖 | 固定49点有冗余 | 跳点之后每个频道的覆盖证明是否仍成立 |
|
|
||||||
| 朝向可行集合 | 第4问盲区导致反复失去信号 | 是否减少无效检测,同时不误删真源 |
|
|
||||||
| 提前尝试清除 | 再测一次可能不如直接尝试便宜 | 失败的3秒和绕行是否值得;保留失败后的正确更新 |
|
|
||||||
|
|
||||||
调度可以先采用“预期信息改善/增量虚拟耗时”之类的启发式,但要记录每项含义和参数,性能结论来自演练。不预设目标均匀分布,不假定测向误差独立或均匀分布。若研究统计模型,明确它是实验场景假设。
|
|
||||||
|
|
||||||
AI 的适合用法是把这些模块逐一变成可测试程序、生成边界案例、分析消融结果,以及在自建环境中搜索策略参数。先形成可解释基线,再判断学习方法是否有额外收益;避免把未建立的奖励与训练分布直接用于正式测试。
|
|
||||||
|
|
||||||
## 6. 抽象标准和验收标准
|
|
||||||
|
|
||||||
采用“来源—输入—状态—动作—观测—约束—代价—输出—验证”的统一模块记录格式。它是本项目建议的工程标准,不是竞赛另行规定的官方评分标准。每个假设注明是题面事实、保守近似还是实验启发式;每条结论注明是数学证明还是演练观察。
|
|
||||||
|
|
||||||
| 模块 | 最小接口职责 | 验收标准 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| 协议与状态 | 串行发送动作,更新位置、频道、两类时间 | 附件计时示例逐步得到105、111、194、199秒 |
|
|
||||||
| 观测与几何 | 根据 direction、near、clear结果更新候选集合 | 自建已知真值案例中真源始终保留;跨角度边界不出错 |
|
|
||||||
| 直径与包围圆 | 给出直径、圆心、包围半径 | 与顶点对枚举对照;等边三角形反例通过 |
|
|
||||||
| 主动选点 | 输出下一测量位置及选择依据 | 实际可见性、最坏误差与移动成本均有记录 |
|
|
||||||
| 覆盖与停止 | 管理每频道的覆盖记录和成功依据 | 边界朝外源不漏搜;10源和16源场景都能正确退出 |
|
|
||||||
| 后备清除 | 对有界候选集合建立20米以内圆盘覆盖 | 覆盖无空洞、每次失败后能继续、预算有上界估计 |
|
|
||||||
| 演练统计 | 从自身动作日志与演练结束真值统计结果 | 清除比例、平均时间、总时间与分项耗时可独立复算 |
|
|
||||||
| 正式交付 | 绑定案例编码、程序版本、统计与官方原始日志 | 问题3和4各3次;日志原名保留,核查上传与导出 |
|
|
||||||
|
|
||||||
协议必须同时检查 HTTP 状态和 accepted。accepted=false 时不得更新状态,返回的 virtual_time_s=0 不能重置本地虚拟时钟。网络超时重试同一动作必须复用原 request_id 和完全相同的内容;处理重试响应也不能重复累加本地成功数与费用。新动作使用新ID,不并发调用不同动作。
|
|
||||||
|
|
||||||
用/enter返回的remaining_real_duration_s建立本地单调时钟截止时间;后续响应若提供剩余时间则校准,不能把首次剩余时间当成永远不变。记录每次请求的现实往返耗时,预留退出与故障恢复余量。例如先预留60秒,再由演练高分位延迟调节;60秒是初始工程参数,不是官方规定。估计剩余请求数时同时计入测量、失败重试、清除和退出,禁止并发动作。
|
|
||||||
|
|
||||||
980次检测在单次0.5–1秒的假设下占490–980秒(约8.17–16.33分钟),还没有定位清除余量。这个延迟范围不是实测结论;本地接口和模拟器计算的实际耗时应测量。当前14个动作的单次短演练不足以估计高分位延迟或全程稳定性。已清除频道跳过,已发现频道暂停覆盖并进入定位队列,移动到同一点后共享频道测量;自适应跳点必须保留逐频道覆盖证据。根据附件,正式上传日志不超过2MB,需监测官方日志体积;自建JSON大小不能冒充加密日志的大小。
|
|
||||||
|
|
||||||
基准实验至少覆盖:全向与混合源;数量 10 和 16;接收半径 1000 和 1500 米;目标贴近圆域边界且朝外;测向接近 $0^\circ/360^\circ$;误差取界值;检测点距离 5 米及清除距离 20 米的边界;重复请求、拒绝动作及短暂断连。样例数量按剩余时间和运行成本安排,不把有限样例通过等同于数学保证。
|
|
||||||
|
|
||||||
比较策略时先看是否全清,再比较同一批场景的总虚拟时间、平均每源时间、中位数与高分位耗时、程序时间、请求数。自建环境可用固定场景做配对比较;官方案例随机且不能重读真值,演练成绩单独记录,不声称是在完全相同的隐藏案例上比较。
|
|
||||||
|
|
||||||
## 7. 建议实施次序与阶段交付
|
|
||||||
|
|
||||||
下面按P0–P7列出可执行交付与当前状态。排期以验收门槛推进,避免把“几何代码完成”误认为“全清策略完成”。
|
|
||||||
|
|
||||||
| 阶段 | 交付与执行任务 | 验收门槛 | 当前状态 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| P0 规则固定 | 规则表、状态机、四类API字段与成本 | 示例逐步105/111/194/199秒;clear不切换频道 | 已完成:`protocol/rules+timing+state` 工程化,`sim-check` 与 `tests/test_protocol_timing.py` 固化 |
|
|
||||||
| P1 协议基线 | enter/measure/clear/exit客户端;串行、幂等、截止时间 | accepted=false和超时重试不污染状态;主动退出;故障注入回放 | 已完成:`protocol/client`,`ScriptedFaultTransport`/`PlaybackTransport` 回放,`tests/test_protocol_client.py` 全过 |
|
|
||||||
| P2 几何内核 | 问题一解答、区域分类、直径圆证据、MEC、清除余量 | 跨界、退化、无界、解析反例、独立算法对照 | 已实现并优化,20项自动化测试通过 |
|
|
||||||
| P3 问题二选点 | $K_1$ 先验、安全候选盘、后验半径采样与 `near` 分支 | 距离证书有效;采样加密;不把探索当接收保证 | 已实现:`belief` 保守候选集 + `planner` 保证接收盘选点器(worst-posterior 采样、1/4 间距加密复核);策略对比实验待做 |
|
|
||||||
| P4 全向闭环 | 49点覆盖记录、定位队列、清除、停止、日志统计 | 10/16源、边界源和错误响应案例;官方演练全清并正常退出 | 自建闭环已完成:`planner.OmnidirectionalLoop`(10/16/0 源、近边界源、预算耗尽、故障注入测试通过);官方演练全清待团队执行 |
|
|
||||||
| P5 定向扩展 | no_signal联合约束、覆盖发现、有限清除后备与预算 | 朝外边界源不漏;真源不误删;格数与退出预算检查 | 已实现:`planner.DirectionalExtension`(49点覆盖对定向源成立、保证接收盘内 no_signal 记为观测到定向、对跖+环探梯子、`fallback_clear_cells` 有限圆盘覆盖后备清除带格数/预算双硬顶);`tests/test_loop_q4.py` 全过;官方混合源演练待执行 |
|
|
||||||
| P6 加速消融 | 共享测点、自适应覆盖、目标排序、提前清除 | 配对案例全清不退化,时间/请求数改善可复算 | 可删减;闭环基线数据已可用于消融对照 |
|
|
||||||
| P7 正式与论文 | 固定版本、论文表1、日志原名、上传核查 | 问题3/4各3份正式记录与程序版本对应 | 团队后续安排;本任务不执行正式测试 |
|
|
||||||
|
|
||||||
按2026年9月10日起的剩余时间,建议10日补齐P1并衔接P3,11日完成P4自建边界案例与全向演练,12日完成P5及混合源演练;未达验收就删减P6并优先修正闭环。演练不限3次,正式机会为问题3和4各3次。团队在版本稳定后自行安排正式记录,留出失败恢复和论文整理时间。附件建议9月13日15:30前完成正式测试,17:30后不能启动新的演练或正式测试;已进入上传队列的日志仍会继续上传。此处引用所给附件安排,运行前核对模拟器界面公告;这份排期不改变当前禁止使用正式测试的限制。
|
|
||||||
|
|
||||||
若时间不足,优先删减加速策略,保留可解释定位、覆盖证明、可靠协议和完整日志。开发组织可按几何算法、工程接口、实验论文分工,具体人员由团队安排。
|
|
||||||
|
|
||||||
建议后续代码划分为 protocol、geometry、belief、coverage、planner、local_simulator、evaluation 七个模块。官方客户端与自建环境使用同一动作接口;自建真值只对测试端开放,策略端只能看到观测,防止评估时意外使用隐藏答案。
|
|
||||||
|
|
||||||
## 8. 当前已落实的结论与下一步
|
|
||||||
|
|
||||||
已完成题面与附件核对、49点覆盖推导及扫描成本复算;此前497160个位置与朝向组合的辅助数值校核未发现覆盖遗漏,但采样不代替证明。问题一已通过官方演练三点观测离线验证;该次只有enter、measure、exit,没有清除动作,不能当作全清策略成绩。
|
|
||||||
|
|
||||||
本次将 MEC 从全支撑点枚举改为带固定随机种子的 Welzl 增量算法,保留原枚举法作独立对照;对外输出增加直径圆反例顶点、超出距离和 20 米清除余量。CLI 可显式追加 $0.005^\circ$ 舍入裕量。真实演练默认 $\delta=1^\circ$ 时 $D=23.996723$ 米、$\rho=12.068583$ 米;$\delta=1.005^\circ$ 时 $D=24.119088$ 米、$\rho=12.130377$ 米,两种口径下直径圆都不覆盖,但 MEC 半径都小于 20 米。原始演练记录未改写。
|
|
||||||
|
|
||||||
可复现报告见 `output/q1/optimization_report.json`,问题一证明、输入输出及数值限制见 `docs/问题一解答.md`。局部MEC基准只反映本地几何计算,不能据此宣称请求延迟、完整策略或官方成绩得到同样提升。
|
|
||||||
|
|
||||||
P0–P5(自建部分)与 P2 均已交付:协议层(串行幂等客户端、状态机、预算截止、
|
|
||||||
故障回放)、几何内核、belief 保守候选集、保证接收盘选点器、`OmnidirectionalLoop`
|
|
||||||
全向闭环与 `DirectionalExtension` 混合源定向闭环(49 点覆盖对定向源同样成立、
|
|
||||||
no_signal 联合约束基线不删候选、对跖+环探遮挡梯子、`fallback_clear_cells`
|
|
||||||
有限圆盘覆盖后备清除,格数与现实预算双硬顶下不盲扫)。自建验收:
|
|
||||||
`uv run pytest`(105 项)与 `uv run mcm26b sim-check`;随机场景自检:
|
|
||||||
`uv run mcm26b run --robot-id <队号> --self-test`(问题4加 `--problem 4`)。
|
|
||||||
|
|
||||||
评审修订(2026-09-11):本地模拟器改为逐点固定误差场(同一"源×位置"读数
|
|
||||||
恒定,与官方演练实测一致);对跖复核探点公式修正(此前塌缩到 MEC 圆心 1m
|
|
||||||
内,浪费探点预算并推高后备清除);环探"≥180° 可见弧"依据删除(最坏可见弧
|
|
||||||
可退化为单点,梯子只是启发式,完备性由后备清除兜底);断连/协议错误中断后
|
|
||||||
仍尽力 /exit 并产出未完成 summary;库默认舍入裕量统一为 0.005°;后验评分
|
|
||||||
补 near 分支;问题一近平行细长区域保留远端顶点。后备清除成本用
|
|
||||||
`scripts/benchmark_q4.py` 批量种子扫描量化(结果落盘 `output/q4/`)。
|
|
||||||
|
|
||||||
下一步优先把两个闭环接入官方演练(问题3用全向、问题4用混合,先实测单请求
|
|
||||||
延迟与总请求数,核对 1200s 现实预算与 2MB 日志体积),再做 P6 消融对照。
|
|
||||||
顺序约束:上述模拟器与故障收尾修复先行合入,官方演练在修复后的版本上执行;
|
|
||||||
总请求口径必须计入后备清除(summary 的 `total_requests` 与
|
|
||||||
`fallback_clear_attempts`),仅统计检测次数会低估现实耗时。
|
|
||||||
基线量级供参照:10 源场景约 550–630 次检测、虚拟总时 1.4–1.7 万秒;16 源
|
|
||||||
场景约 200–320 次检测即触发数量上界停止。该数字说明共享测点与跳点策略
|
|
||||||
(P6)有明确改进空间。不要重复开发几何内核或提前堆叠学习算法;以官方演练
|
|
||||||
的实际请求、日志和耗时决定 P6 加速投入。
|
|
||||||
@@ -1,191 +0,0 @@
|
|||||||
# 2026 高教社杯 B 题(无线电干扰源快速自动定位与清除)问题 3、4 相关论文列表
|
|
||||||
|
|
||||||
> 排序原则:与问题 3/4 直接应用方案越相关,排名越靠前。
|
|
||||||
> 标注:【Q3】主要支撑问题 3(全向干扰源:搜索→交会定位→逼近清除的整体策略);【Q4】主要支撑问题 4(定向干扰源、方向未知);【Q3·Q4】两者通用。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 一、无线电信号源的移动机器人搜索与定位(与赛题任务框架最直接对应)
|
|
||||||
|
|
||||||
1. **Simultaneous Localization of Multiple Unknown and Transient Radio Sources Using a Mobile Robot** 【Q3】
|
|
||||||
D. Song, C. Y. Kim, J. Yi. *IEEE Transactions on Robotics*, 2012(被引 75)
|
|
||||||
移动机器人沿路径采集 RSS,在线同时定位**多个未知无线电源**——与问题 3“干扰源个数未知、机器狗边走边测”的设定几乎同构,可直接借鉴其多源数据关联与定位框架。
|
|
||||||
https://ieeexplore.ieee.org/abstract/document/6145760/ | [PDF](http://coewww.rutgers.edu/~jgyi/pdfs/IEEE_TRO_2012.pdf)
|
|
||||||
|
|
||||||
2. **Cooperative Search of Multiple Unknown Transient Radio Sources Using Multiple Paired Mobile Robots** 【Q3】
|
|
||||||
C. Y. Kim, D. Song, Y. Xu, J. Yi, X. Wu. *IEEE Transactions on Robotics*, 2014(被引 67)
|
|
||||||
上文的协同多机器人版本:成对机器人搜索多个未知瞬态无线电源,含**源匿名(信号不可区分)**处理——对应本题不同频道区分信号的思路对照。
|
|
||||||
https://ieeexplore.ieee.org/abstract/document/6857360/ | [PDF](https://jingangyi.rutgers.edu/pdfs/IEEE_TRO_2014.pdf)
|
|
||||||
|
|
||||||
3. **RSS Gradient-Assisted Frontier Exploration and Radio Source Localization** 【Q3·Q4】
|
|
||||||
J. N. Twigg, J. R. Fink, L. Y. Paul, B. M. Sadler. *ICRA*, 2012(被引 77)
|
|
||||||
用 RSS 梯度引导前沿探索(frontier exploration),让机器人高效逼近信号源而避免盲目遍历——可直接支撑问题 3/4 中“初探→逼近”的两阶段搜索策略设计。
|
|
||||||
https://ieeexplore.ieee.org/abstract/document/6225059/
|
|
||||||
|
|
||||||
4. **Radio Source Localization Using Sparse Signal Measurements from Uncrewed Ground Vehicles** 【Q3】
|
|
||||||
A. Perera, V. P. Tran, S. Anavatti, K. Kasmarik, et al. *arXiv:2312.03493*, 2023
|
|
||||||
地面无人车(与机器狗同类平台)在室外区域以稀疏采样定位无线电源,含完整仿真评估流程——与用模拟器演练测试的实验设计直接可参照。
|
|
||||||
https://arxiv.org/abs/2312.03493 | [PDF](https://arxiv.org/pdf/2312.03493)
|
|
||||||
|
|
||||||
5. **Particle Filter Based Localization of Access Points Using Direction of Arrival on Mobile Robots** 【Q3·Q4】
|
|
||||||
R. Parashar, R. Parasuraman. *IEEE VTC*, 2020(被引 13)
|
|
||||||
移动机器人利用**到达方向(DOA,即示向度)**+ 粒子滤波递推定位无线电源——对应本题“多次测向→逐步缩小定位区域”的序贯定位算法。
|
|
||||||
https://ieeexplore.ieee.org/abstract/document/9348813/
|
|
||||||
|
|
||||||
6. **Online Methods for Radio Signal Mapping with Mobile Robots** 【Q3】
|
|
||||||
J. Fink, V. Kumar. *ICRA*, 2010(被引 166)
|
|
||||||
移动机器人边走边在线构建信号场强地图并估计源位置,可支撑本题“场强仅随距离衰减”假设下的快速粗定位与路径在线修正。
|
|
||||||
https://ieeexplore.ieee.org/abstract/document/5509574/
|
|
||||||
|
|
||||||
7. **Distributed Algorithms for Stochastic Source Seeking with Mobile Robot Networks** 【Q3】
|
|
||||||
N. A. Atanasov, J. Le Ny, et al. *ASME JDSMC*, 2015(被引 117)
|
|
||||||
随机源搜索的分布式算法,以无线电源定位为应用背景,理论保证强,可作为逼近清除阶段的收敛性依据。
|
|
||||||
https://arxiv.org/pdf/1402.0051
|
|
||||||
|
|
||||||
8. **Cooperative Multi-Robot Estimation and Control for Radio Source Localization** 【Q3】
|
|
||||||
B. Charrow, N. Michael, V. Kumar. *IJRR*, 2014(被引 84)
|
|
||||||
仅测距射频下的多机器人协同估计与控制,信息论驱动( mutual information )选择测量动作——可迁移为“选哪个频道、去哪测”的决策准则。
|
|
||||||
https://journals.sagepub.com/doi/abs/10.1177/0278364913500542
|
|
||||||
|
|
||||||
9. **A Review of Radio Frequency Based Localisation for Aerial and Ground Robots with 5G Future Perspectives** 【Q3·Q4】
|
|
||||||
M. Kabiri, C. Cimarelli, H. Bavle, et al. *Sensors*, 2022(被引 48)
|
|
||||||
综述:RSS/AOA 等 RF 定位手段在空地机器人上的比较,适合写论文的“研究现状”部分并帮助选型。
|
|
||||||
https://www.mdpi.com/1424-8220/23/1/188
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 二、测向(Bearing-only/AOA)交会定位与观测点优化(第二检测点选择、定位区域收缩)
|
|
||||||
|
|
||||||
10. **Gathering Bearing Data for Target Localization** 【Q3】
|
|
||||||
H. Bayram, J. Vander Hook, V. Isler. *IEEE Robotics and Automation Letters*, 2016(被引 38)
|
|
||||||
给定若干潜在目标区域与不确定度要求,规划采集方位数据的机器人路径,归结为 **TSP with Neighborhoods 的信息路径规划**——与问题 3“多个待清除目标 + 逐个交会定位 + 总时间最短”的任务排序高度吻合。
|
|
||||||
https://ieeexplore.ieee.org/abstract/document/7390217/ | [PDF](https://conservancy.umn.edu/bitstreams/ff2d34bf-0056-4a29-be84-eb7355b527e4/download)
|
|
||||||
|
|
||||||
11. **Relationship Between Error Ellipse and Error Quadrilateral in Bearing-Only Localization** 【Q3·Q4】
|
|
||||||
B. Wang, Y. Hu, C. Yu, et al. *IEEE Access*, 2026
|
|
||||||
直接研究双站测向定位的**误差四边形**(即题目中的“定位区域”)与误差椭圆的关系,论证几何构型与精度的关系——与问题 1 的定位区域、问题 2/3 的测点选择理论完全对口。
|
|
||||||
https://ieeexplore.ieee.org/abstract/document/11677056/
|
|
||||||
|
|
||||||
12. **Bearing-Only Active Target Localization Strategies for a System of Two Communicating Mobile Robots** 【Q3】
|
|
||||||
J. Vander Hook, P. Tokekar. 技术报告, 2013
|
|
||||||
主动测向定位:规划“去哪测”以最优压缩目标位置不确定性,给出最优双机器人测量构型——第二检测点选择策略的系统性理论。
|
|
||||||
https://conservancy.umn.edu/items/38693c39-7a3b-400b-8926-f9aa194a8824
|
|
||||||
|
|
||||||
13. **Multi-UAV Trajectory Optimization for Bearing-Only Localization in GPS Denied Environments** 【Q3】
|
|
||||||
A. Sciacchitano, L. Mudrik, S. Kragelund, et al. *arXiv:2602.11116*, 2026
|
|
||||||
面向测向定位的轨迹优化,在视场等约束下优化测量构型——可借鉴其代价函数与滚动优化框架设计机器狗的测点序列。
|
|
||||||
https://arxiv.org/abs/2602.11116 | [PDF](https://arxiv.org/pdf/2602.11116)
|
|
||||||
|
|
||||||
14. **Optimal Sensor Placement for Multi-Source AOA Localisation with Distance-Dependent Noise Model** 【Q3·Q4】
|
|
||||||
M. Hamdollahzadeh, R. Amiri, et al. *IET Radar, Sonar & Navigation*, 2019(被引 37)
|
|
||||||
**多源** AOA 定位的最优布点,含递推 CRLB 表示——支撑多干扰源场景下测点位置的全局优化。
|
|
||||||
https://ietresearch.onlinelibrary.wiley.com/doi/abs/10.1049/iet-rsn.2018.5426
|
|
||||||
|
|
||||||
15. **Optimal Sensor Placement for Target Localization Using Hybrid RSS, AOA and TOA Measurements** 【Q3】
|
|
||||||
S. Xu, et al. *IEEE Communications Letters*, 2020(被引 110)
|
|
||||||
混合量测下最小化 tr(CRLB) 的最优传感器-目标几何,可用于论证“交会角接近 90°”等构型结论的严谨性。
|
|
||||||
https://ieeexplore.ieee.org/abstract/document/9097832/
|
|
||||||
|
|
||||||
16. **Geometry Influence on GDOP in TOA and AOA Positioning Systems** 【Q3·Q4】
|
|
||||||
X. Lv, K. Liu, P. Hu. *ICNSC*, 2010(被引 58)
|
|
||||||
基于 CRLB 分析新增观测点对 GDOP 的影响——回答“再加一个检测点值不值、放在哪”的定量依据。
|
|
||||||
https://ieeexplore.ieee.org/abstract/document/5480336/
|
|
||||||
|
|
||||||
17. **定向交叉定位配站问题与定位精度分析**(中文)【Q3·Q4】
|
|
||||||
张艳花. 《电讯技术》, 2008(被引 2)
|
|
||||||
中文文献,专门讨论测向交叉定位的配站(交会角)与精度关系,便于直接引用“交会角 90° 最优、30°~150° 可用”类结论。
|
|
||||||
(《电讯技术》2008 年刊,可通过知网/万方检索全文)
|
|
||||||
|
|
||||||
18. **Trajectory Planning for Multiple Robots in Bearing-Only Target Localisation** 【Q3】
|
|
||||||
C. Leung, S. Huang, G. Dissanayake, et al. *IROS*, 2005(被引 16)
|
|
||||||
早期经典:以定位精度为目标做测向机器人轨迹规划,适合作为主动定位问题的建模起点引用。
|
|
||||||
https://ieeexplore.ieee.org/abstract/document/1545322/
|
|
||||||
|
|
||||||
19. **Observer Path Planning for Bearings-Only Localization Considering Limited Field of View** 【Q3】
|
|
||||||
A. Nayebi Astaneh, N. Pariz, M. O. Naghibi Sistani. *Journal of Control*, 2014
|
|
||||||
考虑传感器视场约束的观测者实时路径规划——对应测向机需旋转天线搜索示向度的过程约束。
|
|
||||||
https://joc.kntu.ac.ir/browse.php?a_id=37&sid=1&slc_lang=en&ftxt=1
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 三、多目标搜索理论与任务规划(10–16 个未知目标的区域搜索框架)
|
|
||||||
|
|
||||||
20. **Multi-Vehicle Bayesian Search for Multiple Lost Targets** 【Q3·Q4】
|
|
||||||
E. M. Wong, F. Bourgault, T. Furukawa. *ICRA*, 2005(被引 193)
|
|
||||||
多目标贝叶斯搜索经典:概率图 + 贝叶斯更新 + 搜索资源分配——问题 3“干扰源个数未知、需确保全部清除”的终止判据与覆盖率论证可由此构建。
|
|
||||||
https://ieeexplore.ieee.org/abstract/document/1570598/
|
|
||||||
|
|
||||||
21. **MPC-Based Cooperative Multiagent Search for Multiple Targets Using a Bayesian Framework** 【Q3】
|
|
||||||
H. Xiao, R. Cui, D. Xu, Y. Li. *Journal of Field Robotics*, 2024(被引 9)
|
|
||||||
模型预测控制 + 贝叶斯框架的多目标搜索路径规划,滚动时域决策——适合借鉴为本题“边测边重规划”的在线策略。
|
|
||||||
https://onlinelibrary.wiley.com/doi/abs/10.1002/rob.22382
|
|
||||||
|
|
||||||
22. **Multi-Agent Informed Path Planning Using the Probability Hypothesis Density** 【Q3·Q4】
|
|
||||||
J. Olofsson, G. Hendeby, T. R. Lauknes, T. A. Johansen. *Autonomous Robots*, 2020(被引 27)
|
|
||||||
用 PHD(随机有限集)表示**目标个数与位置均未知**的场景并做信息路径规划——与“干扰源总数 10–16 但具体未知”的设定直接对应。
|
|
||||||
https://link.springer.com/article/10.1007/s10514-020-09904-1 | [PDF](https://torarnj.folk.ntnu.no/AURO2020a.pdf)
|
|
||||||
|
|
||||||
23. **Probabilistic Search for Tracking Targets: Theory and Modern Applications** 【Q3·Q4】
|
|
||||||
E. Kagan, I. Ben-Gal. Wiley, 2013(被引 27)
|
|
||||||
搜索论专著:最优搜索策略、马尔可夫决策模型,为搜索策略提供理论根基(Stone 最优搜索理论的应用版)。
|
|
||||||
https://onlinelibrary.wiley.com/doi/abs/10.1002/9781118596593
|
|
||||||
|
|
||||||
24. **Efficient Multi-Robot Search for a Moving Target** 【Q3】
|
|
||||||
G. Hollinger, S. Singh, J. Djugash, A. Kehagias. *IJRR*, 2009(被引 254)
|
|
||||||
多机器人高效搜索路径规划(ESPP)并提出可证明性能的近似算法;本题目标虽静止,其“最大化截获概率”的建模与保证思路可迁移。
|
|
||||||
https://journals.sagepub.com/doi/abs/10.1177/0278364908099853
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 四、定向干扰源定位(问题 4 特有:覆盖角 180°、方向未知)
|
|
||||||
|
|
||||||
25. **UAV-Based Efficient Joint Estimation of Directional Emitter Position and Transmission Orientation** 【Q4】
|
|
||||||
T. Ruan, Y. Huang, L. Zhou, Q. Wu, et al. *IEEE Wireless Communications Letters*, 2024(被引 2)
|
|
||||||
**联合估计定向发射源的位置与发射方向**(RSS-AOA 混合量测)——问题 4“定向方向未知”的最直接对应文献。
|
|
||||||
https://ieeexplore.ieee.org/abstract/document/10802920/
|
|
||||||
|
|
||||||
26. **Efficient Localization of Directional Emitters via Joint Beampattern Estimation** 【Q4】
|
|
||||||
F. Williams, A. Pemasiri, D. Jayalath, T. Martin, et al. *arXiv:2411.04364*, 2024
|
|
||||||
联合波束方向图估计实现定向发射源高效定位,并分析波束宽度/朝向对定位的灵敏度(CRLB)——可支撑定向源需从侧向多点探测的策略设计。
|
|
||||||
https://arxiv.org/abs/2411.04364 | [PDF](https://arxiv.org/pdf/2411.04364)
|
|
||||||
|
|
||||||
27. **Location Errors of Directional Emitters in AOA System for Non-Line-of-Sight Conditions** 【Q4】
|
|
||||||
J. M. Kelner, C. Ziółkowski, et al. *SPIE*, 2019
|
|
||||||
分析发射天线朝向对 AOA 示向度误差的影响——定向干扰源场景下误差建模的参考。
|
|
||||||
https://www.spiedigitallibrary.org/conference-proceedings-of-spie/11055/110551G/Location-errors-of-directional-emitters-in-AOA-system-for-non/10.1117/12.2525060.short
|
|
||||||
|
|
||||||
28. **ALRD: AoA Localization with RSSI Differences of Directional Antennas for Wireless Sensor Networks** 【Q4】
|
|
||||||
J. R. Jiang, C. M. Lin, F. Y. Lin, et al. *Int. J. of Distributed Sensor Networks*, 2013(被引 133)
|
|
||||||
利用定向天线朝向差分的 RSSI 做定位,对“信号只在 180° 覆盖角内可被接收”的探测盲区分析与补盲路径设计有参考价值。
|
|
||||||
https://journals.sagepub.com/doi/abs/10.1155/2013/529489
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 五、信息路径规划方法与综述(通用方法库)
|
|
||||||
|
|
||||||
29. **Information-Driven Path Planning** 【Q3·Q4】
|
|
||||||
S. Bai, T. Shan, F. Chen, L. Liu, B. Englot. *Current Robotics Reports*, 2021(被引 53)
|
|
||||||
信息驱动路径规划综述,梳理目标函数(信息增益、熵减)与平台约束,适合搭建问题 3 的总体算法框架。
|
|
||||||
https://link.springer.com/article/10.1007/s43154-021-00045-6
|
|
||||||
|
|
||||||
30. **Adaptive Informative Path Planning in Metric Spaces** 【Q3】
|
|
||||||
Z. W. Lim, D. Hsu, W. S. Lee. *IJRR*, 2016(被引 101)
|
|
||||||
带自适应性的信息路径规划,具次模性与近似保证——为“总时间越短越好”的目标函数设计提供理论工具。
|
|
||||||
https://journals.sagepub.com/doi/abs/10.1177/0278364915596378
|
|
||||||
|
|
||||||
31. **Informative Path Planning for Active Field Mapping Under Localization Uncertainty** 【Q3】
|
|
||||||
M. Popović, T. Vidal-Calleja, J. J. Chung, et al. *ICRA*, 2020(被引 62)
|
|
||||||
不确定性感知的信息路径规划,平衡探索与精度——对应本题“检测耗时 vs 路径耗时”的权衡。
|
|
||||||
https://ieeexplore.ieee.org/abstract/document/9197034/
|
|
||||||
|
|
||||||
32. **基于深度强化学习的短波自主检测与定位方法**(中文)【Q3】
|
|
||||||
冯祺玥, 唐涛, 张昀普, 王鼎, 吴志东. 《通信学报》, 2026
|
|
||||||
中文文献:多站测角交会定位 + 深度强化学习自主检测定位,提供国内无线电监测定位的表述与流程范式。
|
|
||||||
https://www.joconline.com.cn/rc-pub/front/front-article/download/155129217/lowqualitypdf/%E5%9F%BA%E4%BA%8E%E6%B7%B1%E5%BA%A6%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0%E7%9A%84%E7%9F%AD%E6%B3%A2%E8%87%AA%E4%B8%BB%E6%A3%80%E6%B5%8B%E4%B8%8E%E5%AE%9A%E4%BD%8D%E6%96%B9%E6%B3%95.pdf
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 使用建议
|
|
||||||
- **问题 3 算法主线**:以 1、3、10、20、22 为核心——贝叶斯概率图搜索(20/22)确定探测顺序与终止条件,DOA 序贯定位(5)+ 交会几何优化(10/11/15/17)选测点,RSS 梯度逼近(3)完成 20 m 内清除前逼近。
|
|
||||||
- **问题 4 增量**:在问题 3 框架上叠加 25/26 的“位置 + 方向”联合估计,并用 28 的思路设计覆盖角盲区的补测路径。
|
|
||||||
- **论文写作**:现状综述引用 9、29、32;精度理论引用 11、14、15、16。
|
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# docs 索引
|
||||||
|
|
||||||
|
论文本身已完整给出四问的模型、推导与结果分析,因此本目录不再保留算法说明文档,
|
||||||
|
只留下复现所需的说明与材料。
|
||||||
|
|
||||||
|
| 入口 | 内容 |
|
||||||
|
| --- | --- |
|
||||||
|
| [`../README.md`](../README.md) | **总入口**:环境、运行程序、复现论文数据与插图、编译论文 |
|
||||||
|
| [`aigc-compliance-record.tex`](aigc-compliance-record.tex) | **AIGC 使用合规记录**:本机 AI 客户端会话的完整审计留痕(58 页) |
|
||||||
|
| [`aigc-compliance-record.pdf`](aigc-compliance-record.pdf) | 上述记录的编译成品 |
|
||||||
|
| [`paper/README.md`](paper/README.md) | 论文工程说明:数据分工、重算与编译步骤、VS Code 配方 |
|
||||||
|
| [`paper/REWRITE_NOTES.md`](paper/REWRITE_NOTES.md) | 论文各轮修订与验证记录(含演练数据重采与问题修复) |
|
||||||
|
| [`paper/main.tex`](paper/main.tex) | 论文 LaTeX 源文件(正文与附录) |
|
||||||
|
| [`paper/data/`](paper/data) | 论文引用的全部数据、宏与整表(由脚本生成) |
|
||||||
|
| [`figures/README.md`](figures/README.md) | 论文插图清单:每张图的数据来源与生成命令 |
|
||||||
|
| [`figures/manifest.json`](figures/manifest.json) | 插图来源清单(可机读) |
|
||||||
|
|
||||||
|
`docs/paper/fonts/` 存放论文编译用字体(约 150 MB),已在 `.gitignore` 中排除、不入库;
|
||||||
|
缺失时按 `paper/mcm26b-paper.cls` 内的注释改用系统字体。
|
||||||
|
|
||||||
|
## 复现顺序
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python scripts/build_practice_data.py # 演练局复算 → 宏与表格
|
||||||
|
python scripts/audit_paper_formal.py --snapshot docs/paper/data/formal-results.json
|
||||||
|
python scripts/build_paper_support.py # 附录正式数据表(--package 另出支撑包)
|
||||||
|
uv run python scripts/plot_paper_figures.py
|
||||||
|
cd docs/paper && latexmk -xelatex -interaction=nonstopmode -halt-on-error -outdir=build main.tex
|
||||||
|
```
|
||||||
|
|
||||||
|
> `docs/paper/data/*.tex` 由脚本生成,一律使用 LF 换行:CRLF 会让 `\input` 进表格的行
|
||||||
|
> 在 TeX 缓冲中提前 `\par` 化,触发 booktabs 的 “Misplaced \noalign”。
|
||||||
@@ -1,185 +0,0 @@
|
|||||||
# 问题一:有界测向误差下定位区域的直径与圆覆盖
|
|
||||||
|
|
||||||
## 摘要
|
|
||||||
|
|
||||||
针对同一干扰源在多个检测点处的带误差方位观测,建立前向角域交集模型,将定位区域表示为二维线性不等式组的可行域。首先推导角域的半平面表达,给出兼顾空集、点、线段和无界区域的几何构造算法;随后证明,有界定位区域的直径必由一对顶点取得,且判断是否存在直径等于区域直径的覆盖圆,只需检验任意一组最远顶点的中点。通过符合题设测向条件的等边三角形反例,说明直径圆一般不能覆盖定位区域。进一步以最小包围圆连接定位精度和后续清除条件,并给出算法复杂度、数值处理原则及既有演练观测的复算结果。全部结论以有界误差模型为前提,不引入误差独立、正态或均匀分布假设。
|
|
||||||
|
|
||||||
**关键词:** 交会定位;有界误差;半平面交;凸多边形直径;最小包围圆。
|
|
||||||
|
|
||||||
## 1. 问题界定与思路来源
|
|
||||||
|
|
||||||
题目要求由若干检测点坐标及同一干扰源的示向度,求交会定位多边形的直径,并判断以该直径为直径的圆能否覆盖定位区域。题面规定测向误差在 $[-1^\circ,1^\circ]$ 内,同一地点重复测量的误差不变;示向度从正东沿逆时针方向计量。[题面第1页、附录2第(1)、(3)项](C:/Users/HelixCopex/code/MATH/issue/B题.pdf)
|
|
||||||
|
|
||||||
由此得到三步建模思路。第一,单次观测不能确定一条精确射线,却可以确定一个包含真实方向的角域,因此采用集合相交而非直线最小二乘。第二,角域可以写成半平面交,问题随之转化为凸几何问题。第三,“两点最远距离”和“覆盖全部位置所需半径”是不同的优化量,应分别计算直径和最小包围圆。
|
|
||||||
|
|
||||||
半平面、凸组合和凸集交运算属于标准凸分析工具,其背景见 Boyd 与 Vandenberghe 的《Convex Optimization》第2章;本文针对测向模型给出独立推导,不将一般理论本身视为新的研究贡献。[文献2](https://web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf)
|
|
||||||
|
|
||||||
本文严格区分两个集合:问题一的 $P$ 仅表示测向角域之交;第二问及在线搜索中的 $K$ 可进一步结合源位置圆域和接收距离先验。向 $P$ 加入圆盘后,边界可能出现圆弧,不能继续把它当成原问题中的纯多边形。
|
|
||||||
|
|
||||||
## 2. 符号及基本假设
|
|
||||||
|
|
||||||
| 符号 | 含义 |
|
|
||||||
| --- | --- |
|
|
||||||
| $s_i=(s_{ix},s_{iy})$ | 第 $i$ 个检测点,坐标单位为米 |
|
|
||||||
| $\theta_i$ | 第 $i$ 次有效示向度 |
|
|
||||||
| $\delta_i$ | 误差半角,题设取 $1^\circ$ |
|
|
||||||
| $g=(x,y)$ | 未知干扰源位置 |
|
|
||||||
| $W_i$ | 第 $i$ 次测向对应的闭前向角域 |
|
|
||||||
| $P$ | 所有角域的交集 |
|
|
||||||
| $V=\{v_1,\ldots,v_m\}$ | 非空有界 $P$ 的顶点集 |
|
|
||||||
| $D(P)$ | 区域内任意两点距离的上确界 |
|
|
||||||
| $B(c,r)$ | 中心为 $c$、半径为 $r$ 的闭圆盘 |
|
|
||||||
| $\rho(P)$ | 覆盖 $P$ 的最小圆盘半径 |
|
|
||||||
|
|
||||||
假设各次有效示向度对应同一频道的同一个静止源。仅把 `direction` 观测代入角域模型,不能给 `near` 或 `no_signal` 人为赋予角度。理论推导允许 $0\le\delta_i<90^\circ$,用于讨论退化情况,题目主模型始终采用 $\delta_i=1^\circ$。
|
|
||||||
|
|
||||||
程序可额外计入两位小数舍入对应的 $0.005^\circ$ 裕量,但必须显式声明。题设的 $1^\circ$ 误差界与实现中的浮点容差是两个概念,均不能在结果解释时省略。
|
|
||||||
|
|
||||||
## 3. 由角域推导半平面约束
|
|
||||||
|
|
||||||
定义方向向量 $u(\alpha)=(\cos\alpha,\sin\alpha)$,二维叉积为 $[a,b]=a_xb_y-a_yb_x$。三角函数计算前将角度换成弧度。
|
|
||||||
|
|
||||||
令 $u_i^-=u(\theta_i-\delta_i)$、$u_i^+=u(\theta_i+\delta_i)$。当 $0<\delta_i<90^\circ$ 时,真实位置位于两条边界射线之间,等价于 $[u_i^-,g-s_i]\ge0$ 和 $[u_i^+,g-s_i]\le0$。第一条要求 $g-s_i$ 在下边界的左侧,第二条要求其在上边界的右侧。
|
|
||||||
|
|
||||||
将第一条展开,得到 $\sin(\theta_i-\delta_i)x-\cos(\theta_i-\delta_i)y\le\sin(\theta_i-\delta_i)s_{ix}-\cos(\theta_i-\delta_i)s_{iy}$。
|
|
||||||
|
|
||||||
将第二条展开,得到 $-\sin(\theta_i+\delta_i)x+\cos(\theta_i+\delta_i)y\le-\sin(\theta_i+\delta_i)s_{ix}+\cos(\theta_i+\delta_i)s_{iy}$。
|
|
||||||
|
|
||||||
同时保留前向约束 $u(\theta_i)\cdot(g-s_i)\ge0$。该约束在正半角情形下冗余,但当 $\delta_i=0$ 时,前两条只限定一条直线,加入它才得到正确的射线。角域顶点本身也包含在闭集合内,这是保守几何处理,并不表示该点仍能获得示向度。
|
|
||||||
|
|
||||||
因此,$P=\bigcap_{i=1}^{n}W_i=\{g:Ag\le b\}$。采用向量不等式后,$359^\circ$ 与 $0^\circ$ 跨界无需分段比较角度。每个 $W_i$ 是闭凸集,故 $P$ 也是闭凸集;它可能为空、为单点、为线段、为有界凸多边形,也可能无界。
|
|
||||||
|
|
||||||
## 4. 定位区域的构造与分类
|
|
||||||
|
|
||||||
### 4.1 边界交点与可行性
|
|
||||||
|
|
||||||
把约束统一写成 $a_jx+b_jy\le c_j$。两条边界的行列式为 $\Delta_{jk}=a_jb_k-a_kb_j$。当 $\Delta_{jk}\ne0$ 时,交点坐标为 $x=(c_jb_k-c_kb_j)/\Delta_{jk}$、$y=(a_jc_k-a_kc_j)/\Delta_{jk}$。保留满足全部约束的交点,再去重并构造凸包。
|
|
||||||
|
|
||||||
**命题1:** 至少有一次观测时,非空的角域交集一定存在极点,因此可通过可行边界交点枚举判空。
|
|
||||||
|
|
||||||
**证明:** 取第一个角域的轴向量 $u_1$,其中任意 $g$ 满足 $u_1\cdot(g-s_1)\ge\cos\delta_1\,\lVert g-s_1\rVert$,且 $\cos\delta_1>0$。在非空 $P$ 上最小化线性函数 $u_1\cdot(g-s_1)$;以任一可行点的函数值截取下水平集,得到非空紧集,故最小值能够取得。最小化点集位于一条支撑直线上,且有界,所以为点或线段。取该点或线段端点即得到 $P$ 的极点。二维线性约束的极点至少有两条法向量线性无关的有效边界,否则沿所有有效边界的公共切向可作双向小扰动,与极点定义矛盾。因此极点包含在上述交点枚举中。证毕。
|
|
||||||
|
|
||||||
无观测时,$P=\mathbb R^2$,应直接判为无界,不能用“没有交点”判断为空集。
|
|
||||||
|
|
||||||
### 4.2 无界性判定
|
|
||||||
|
|
||||||
对非空 $P$ 定义衰退锥 $\mathcal R=\{d:Ad\le0\}$。若存在 $d\ne0$,则任意 $g_0\in P$ 与 $t\ge0$ 都满足 $g_0+td\in P$,所以 $P$ 无界。
|
|
||||||
|
|
||||||
反之,若 $P$ 无界,可取 $g_k\in P$ 使 $\lVert g_k-g_0\rVert\to\infty$。单位向量 $(g_k-g_0)/\lVert g_k-g_0\rVert$ 存在收敛子列,极限 $d$ 满足 $\lVert d\rVert=1$。将 $Ag_k\le b$ 减去 $Ag_0$,再除以距离并取极限,得到 $Ad\le0$。因此 $P$ 有界当且仅当 $\mathcal R=\{0\}$。
|
|
||||||
|
|
||||||
本模型的衰退锥被一个小于 $180^\circ$ 的闭角域约束,若包含非零向量,必含一条极射线,该射线平行于某条有效约束边界。故只需检查每个法向量 $(a_j,b_j)$ 的两个切向方向 $(b_j,-a_j)$、$(-b_j,a_j)$ 是否满足所有齐次不等式。
|
|
||||||
|
|
||||||
### 4.3 分类约定
|
|
||||||
|
|
||||||
可行交点为空时返回空集;存在非零衰退方向时返回无界。否则求可行交点的凸包,按顶点数和仿射维数区分单点、线段和二维多边形。空集的直径在本文约定为未定义;无界集合的直径为 $+\infty$。程序使用空值及单独的无穷标志表示二者,避免写入非标准 JSON 数值。
|
|
||||||
|
|
||||||
显示窗口只用于绘图裁剪。任意大矩形都不能取代衰退锥判定,更不能把截断图形的直径称为原无界区域的直径。
|
|
||||||
|
|
||||||
## 5. 直径的顶点定理
|
|
||||||
|
|
||||||
**定理1:** 若 $P=\operatorname{conv}(V)$ 非空且有界,则 $D(P)=\max_{i,j}\lVert v_i-v_j\rVert$。
|
|
||||||
|
|
||||||
**证明:** 任取 $x,y\in P$,可写成 $x=\sum_i\lambda_i v_i$、$y=\sum_j\mu_jv_j$,其中权重非负且分别求和为1。于是 $x-y=\sum_{i,j}\lambda_i\mu_j(v_i-v_j)$。由三角不等式,$\lVert x-y\rVert\le\sum_{i,j}\lambda_i\mu_j\lVert v_i-v_j\rVert\le\max_{i,j}\lVert v_i-v_j\rVert$。最远顶点对又属于 $P$,上界可以达到,结论成立。证毕。
|
|
||||||
|
|
||||||
因此,小规模问题中直接枚举所有顶点对即可,计算复杂度为 $O(m^2)$。单点的直径为0,线段的直径为端点距离。这里的直接枚举不是近似算法;其缺点仅在于大规模时计算量较高。
|
|
||||||
|
|
||||||
## 6. 直径圆覆盖的充要条件
|
|
||||||
|
|
||||||
**定理2:** 取任意一组最远顶点 $a,b$,令 $D=\lVert a-b\rVert$、$o=(a+b)/2$。存在直径为 $D$ 的覆盖圆,当且仅当所有顶点均满足 $\lVert v_i-o\rVert\le D/2$。
|
|
||||||
|
|
||||||
**证明:** 若半径为 $D/2$、中心为 $z$ 的圆同时包含 $a,b$,则 $D\le\lVert a-z\rVert+\lVert z-b\rVert\le D$。两个不等式必须同时取等号,所以 $z$ 在两点连线上,且到两点距离相等,只能是中点 $o$。当 $D=0$ 时结论直接成立。另一方面,圆盘是凸集,包含全部顶点等价于包含它们的凸包。因此只需在这个唯一可能的圆心处检查全部顶点。证毕。
|
|
||||||
|
|
||||||
该定理不仅回答“以某条直径线段为直径的圆是否覆盖”,也回答“能否移动一个同样大小的圆使其覆盖”。若检查失败,移动圆心或更换最远顶点对均不能解决。
|
|
||||||
|
|
||||||
定义最大超出量 $E=\max_i\lVert v_i-o\rVert-D/2$。在精确算术下,$E=0$ 表示覆盖成立,$E>0$ 表示失败;不会出现严格负值,因为最远点对就在圆周上。取达到最大值的顶点,即得到一份可以独立复核的覆盖失败证据。
|
|
||||||
|
|
||||||
## 7. 符合测向条件的反例
|
|
||||||
|
|
||||||
取误差半角均为 $1^\circ$,三个检测点及读数如下。
|
|
||||||
|
|
||||||
| 检测点 | 坐标(米) | 示向度 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| $s_1$ | $(-1000,0)$ | $1^\circ$ |
|
|
||||||
| $s_2$ | $(540,-500\sqrt3)$ | $121^\circ$ |
|
|
||||||
| $s_3$ | $(520,520\sqrt3)$ | $241^\circ$ |
|
|
||||||
|
|
||||||
每个角域的下边界方向分别为 $0^\circ,120^\circ,240^\circ$。对应的三个左半平面是 $y\ge0$、$\sqrt3x+y\le40\sqrt3$、$y\le\sqrt3x$,交集为顶点 $A=(0,0)$、$B=(40,0)$、$C=(20,20\sqrt3)$ 的等边三角形。
|
|
||||||
|
|
||||||
还需验证每个角域的另一条边不会切去这个三角形。以 $s_1$ 为例,到三个顶点的方向分别为 $0^\circ,0^\circ,\arctan(20\sqrt3/1020)$,最后一项约为 $1.945^\circ<2^\circ$,均在 $[0^\circ,2^\circ]$ 内。其余两站由绕三角形中心旋转 $120^\circ$ 的对称性成立。因此三个完整前向角域之交恰为上述三角形。
|
|
||||||
|
|
||||||
将真实源取为三角形中心 $g_*=(20,20\sqrt3/3)$。以第一站为例,真实方向约为 $0.649^\circ$,与 $1^\circ$ 的读数偏差小于 $1^\circ$;检测距离约为1020米,小于1500米。另两站同理。该反例符合题设方位误差和可能的有效接收半径。
|
|
||||||
|
|
||||||
此时 $D=40$ 米,而以 $AB$ 为直径的圆中心为 $(20,0)$,到 $C$ 的距离为 $20\sqrt3>20$ 米,不能覆盖。三角形外接圆即最小包围圆,其中心为 $(20,20\sqrt3/3)$,半径为 $40/\sqrt3\approx23.094011$ 米。这也证明了“直径不超过40米”不足以保证一次清除。
|
|
||||||
|
|
||||||
## 8. 最小包围圆及其清除含义
|
|
||||||
|
|
||||||
### 8.1 存在性、唯一性与支撑点
|
|
||||||
|
|
||||||
定义 $f(z)=\max_{v\in V}\lVert v-z\rVert$,则 $\rho(P)=\min_z f(z)$。由于 $V$ 有限,$f$ 连续且随 $\lVert z\rVert\to\infty$ 而趋于无穷,最小值存在。
|
|
||||||
|
|
||||||
若两个不同中心 $c_1,c_2$ 都以半径 $r$ 覆盖 $V$,中点 $c$ 对每个顶点满足 $\lVert v-c\rVert^2=(\lVert v-c_1\rVert^2+\lVert v-c_2\rVert^2)/2-\lVert c_1-c_2\rVert^2/4<r^2$,与最小性矛盾。因此最小包围圆唯一。
|
|
||||||
|
|
||||||
在最优中心 $c$ 处,令 $T$ 为圆周上的顶点集。若 $c$ 不在 $T$ 的凸包中,可沿严格分离方向小幅移动中心,使所有圆周点的距离同时减小;其余有限个点有严格余量,仍被稍小圆覆盖,产生矛盾。故 $c\in\operatorname{conv}(T)$。二维凸组合经仿射相关权重消元,最多保留3个点。因此最小包围圆由至多3个圆周顶点支撑。
|
|
||||||
|
|
||||||
更具体地,若支撑点 $p_j$ 的权重满足 $c=\sum_j\lambda_jp_j$,则对任意 $z$ 有 $\sum_j\lambda_j\lVert p_j-z\rVert^2=r^2+\lVert c-z\rVert^2\ge r^2$。这给出了任何覆盖圆半径不能小于 $r$ 的直接证据。
|
|
||||||
|
|
||||||
### 8.2 求解方法与来源
|
|
||||||
|
|
||||||
由支撑点性质,可以枚举单点零半径圆、两点直径圆和三点外接圆,再检查全体顶点。这是便于核查的基准方法,最坏复杂度为 $O(m^4)$。
|
|
||||||
|
|
||||||
当前实现采用 Welzl 的随机增量算法:打乱点序,若当前圆不包含新点,则在该点成为边界点的约束下递归求解较小问题;边界点至多3个。程序用显式栈避免递归深度限制,并固定随机种子以复现结果。理论期望线性依赖随机排列分析,不等于任意固定排列的最坏时间保证。3个强制边界点应使用外接圆,不能替换成其无约束最小圆。算法来源为 Welzl 的原论文,CGAL 文档提供了定义与实现背景。[文献3](https://people.inf.ethz.ch/emo/PublFiles/SmallEnclDisk_LNCS555_91.pdf)、[文献4](https://doc.cgal.org/latest/Bounding_volumes/classCGAL_1_1Min__circle__2.html)
|
|
||||||
|
|
||||||
### 8.3 与一次清除的关系
|
|
||||||
|
|
||||||
所有能够保证一次清除的位置构成 $C_{20}(P)=\bigcap_{g\in P}B(g,20)=\bigcap_{v\in V}B(v,20)$。第二个等号来自圆盘凸性。该集合非空当且仅当 $\rho(P)\le20$。
|
|
||||||
|
|
||||||
因此,最小包围圆中心是保证清除的充分选择,但不一定是移动距离最短的选择。若后续需要优化路径,可以在 $C_{20}(P)$ 内寻找距离机器狗最近的位置。相比之下,$D(P)\le40$ 只是必要条件。
|
|
||||||
|
|
||||||
## 9. 算法流程与计算量
|
|
||||||
|
|
||||||
**算法1:角域交、直径及覆盖证据。**
|
|
||||||
|
|
||||||
1. 校验观测并进行坐标平移、尺度归一化,保留原误差半角。
|
|
||||||
2. 生成每次观测的三条半平面约束。
|
|
||||||
3. 枚举非平行边界交点,保留满足全部约束的点;无观测和空集分别处理。
|
|
||||||
4. 检验非零衰退方向;存在时报告无界并停止有限圆计算。
|
|
||||||
5. 对可行点去重并求凸包,识别点、线段或多边形。
|
|
||||||
6. 枚举顶点对求直径及任意一组最远点。
|
|
||||||
7. 检查其中点到全部顶点的距离,输出最大超出量与失败顶点。
|
|
||||||
8. 求最小包围圆,换回原坐标,重新检查顶点包含性,输出清除半径余量。
|
|
||||||
|
|
||||||
令半平面数 $k=3n$,顶点数为 $m$。边界交点枚举及全约束检查为 $O(k^3)$,衰退方向检查为 $O(k^2)$,交点排序上界为 $O(k^2\log k)$,直径计算为 $O(m^2)$,覆盖证据检查为 $O(m)$。随机增量最小圆在随机排列下期望为 $O(m)$;整个算法仍由半平面交点枚举主导,不能因此称为总体线性算法。
|
|
||||||
|
|
||||||
## 10. 数值实现与已有观测复核
|
|
||||||
|
|
||||||
数学结论使用精确不等式。浮点实现先平移、归一化,再用位置容差、平行判定阈值和衰退方向容差分别处理不同问题。接近平行或退化输入应进行精度与容差敏感性检查;任意追加一个固定小数裕量都不能替代严格的误差传播上界。
|
|
||||||
|
|
||||||
当前程序输出 `diameter_circle` 中的圆心、半径、最大超出量和反例顶点,以及 `minimum_enclosing_circle`。清除判断采用 $\rho+\varepsilon_m\le20$,其中 $\varepsilon_m$ 是工程数值裕量。它是观测及几何计算可靠这一前提下的决策条件,不是一次真实清除成功记录。
|
|
||||||
|
|
||||||
既有官方演练案例 `U5ZW-P9KN-TCAG-R7ST` 的三次不同位置观测如下。
|
|
||||||
|
|
||||||
| 检测点 | $x$ / 米 | $y$ / 米 | 示向度 / 度 |
|
|
||||||
| --- | ---: | ---: | ---: |
|
|
||||||
| 1 | 0 | 0 | 131.52 |
|
|
||||||
| 2 | -613.7618853216 | 391.5307754525 | 34.92 |
|
|
||||||
| 3 | -314.2721344680 | 656.6833525352 | 227.19 |
|
|
||||||
|
|
||||||
| 误差半角 | 直径 / 米 | 最小包围半径 / 米 | 直径圆最大超出 / 米 |
|
|
||||||
| --- | ---: | ---: | ---: |
|
|
||||||
| $1^\circ$ | 23.996723 | 12.068583 | 0.604002 |
|
|
||||||
| $1.005^\circ$ | 24.119088 | 12.130377 | 0.608486 |
|
|
||||||
|
|
||||||
两种口径下直径圆均不覆盖区域,最小包围半径均小于20米。该演练未公开源坐标,且没有执行清除,故只用于观测交会和计算一致性复核,不能据此声称实测定位误差或全清成功率。数据见[原始三点观测](C:/Users/HelixCopex/code/MATH/output/q1/practice/U5ZW-P9KN-TCAG-R7ST_observations.json),敏感性数值见[已有复算报告](C:/Users/HelixCopex/code/MATH/output/q1/optimization_report.json)。
|
|
||||||
|
|
||||||
## 11. 结论与实现对应
|
|
||||||
|
|
||||||
问题一的准确答案为:将测向角域表示为半平面交,先判断非空性及有界性,再由最远顶点对得到直径;以该直径为直径的圆一般不能覆盖定位区域,覆盖的充要条件是任意一组最远顶点的中点到全部顶点的距离均不超过半径。最小包围圆提供独立且适合后续清除的精度指标。
|
|
||||||
|
|
||||||
对应实现为 [localization.py](C:/Users/HelixCopex/code/MATH/geometry/localization.py)。在项目根目录可运行 `python -m geometry examples/q1/triangle.json`;追加 `--rounding-margin-deg 0.005` 可复算额外舍入裕量。本文整理理论与已有计算结果,不改变原始观测或既有程序。
|
|
||||||
|
|
||||||
## 参考文献
|
|
||||||
|
|
||||||
1. 全国大学生数学建模竞赛组委会. 2026年高教社杯全国大学生数学建模竞赛B题:无线电干扰源的快速自动定位与清除[Z]. 2026. [本地题面](C:/Users/HelixCopex/code/MATH/issue/B题.pdf),第1页、附录2。
|
|
||||||
2. BOYD S, VANDENBERGHE L. Convex Optimization[M]. Cambridge: Cambridge University Press, 2004. [作者公开版本](https://web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf),第2章。用于凸几何背景,本文的题目化证明在正文给出。
|
|
||||||
3. WELZL E. Smallest enclosing disks (balls and ellipsoids)[C]//MAURER H. New Results and New Trends in Computer Science. Lecture Notes in Computer Science, vol. 555. Berlin: Springer, 1991: 359–370. [作者公开论文](https://people.inf.ethz.ch/emo/PublFiles/SmallEnclDisk_LNCS555_91.pdf)。用于随机增量最小包围圆算法来源。
|
|
||||||
4. CGAL Project. CGAL::Min_circle_2: Bounding Volumes[EB/OL]. [在线文档](https://doc.cgal.org/latest/Bounding_volumes/classCGAL_1_1Min__circle__2.html),访问日期:2026-09-10。用于最小圆及支撑点定义的交叉核对。
|
|
||||||
@@ -1,248 +0,0 @@
|
|||||||
# 问题二:具有接收保证的第二检测点选择
|
|
||||||
|
|
||||||
## 摘要
|
|
||||||
|
|
||||||
针对只获得一次全向干扰源示向度的情形,提出以接收保证为约束、以后验最小包围半径为主要指标的主动选点方法。首先将源位置圆域、首次角域与有效接收距离上界相交,构造包含真实源的位置候选集;随后把第二检测点的安全条件写成一族闭圆盘的交,并证明其非空性等价于候选集最小包围半径不超过最小有效接收半径。利用首次角域狭窄的题设特征,进一步推导截断角域的最小包围圆,得到半径约250米、能够直接计算的安全候选圆盘。为比较候选点的定位效果,建立兼顾 `direction` 和 `near` 的保守后验模型,推导交会角的局部几何意义,并给出采用外包多边形及观测区间划分的有限候选评估算法。严格接收保证与启发式性能优化分别陈述,不将有限采样结果解释为连续问题的全局最优解。
|
|
||||||
|
|
||||||
**关键词:** 主动测向;鲁棒选点;安全候选区域;最坏后验半径;保守几何近似。
|
|
||||||
|
|
||||||
## 1. 问题界定与思路来源
|
|
||||||
|
|
||||||
题目第二问给定某全向干扰源在一个检测点处的示向度,要求提出第二检测点的选择策略、说明其定位效果并给出候选区域。这里的源类型明确为全向,不能混入第四问的朝向可见性条件。[题面第1页问题2](C:/Users/HelixCopex/code/MATH/issue/B题.pdf)
|
|
||||||
|
|
||||||
本问有两个先后不同的问题:第二点是否仍能收到信号;在能收到信号的点中,如何使新测量更有价值。如果只追求较大交会角而不控制到真实源的距离,第二次测量可能返回 `no_signal`,预期几何收益无法实现。因此先构造保证接收的可行域,再优化测向后的不确定区域。
|
|
||||||
|
|
||||||
方法来源分为三部分。候选位置集合来自题设有界误差与接收距离,沿用问题一的角域约束;安全选点来自“对每个可能源位置都满足距离条件”的鲁棒可行性;定位收益来自主动测量设计,以最坏后验半径代替未经题面支持的平均误差。凸函数与鲁棒建模的一般背景参见 Boyd 与 Vandenberghe 的《Convex Optimization》第3章、第6.4节;本题的安全圆盘公式、扇形推导及区间评估方法在下文逐步建立。[文献3](https://web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf)
|
|
||||||
|
|
||||||
需要强调:本题没有给出源位置概率分布,也没有给出可直接使用的独立高斯测向噪声模型。因此不能把卡尔曼滤波、协方差或费舍尔信息计算直接作为严格保证。交会角仍有明确几何意义,但应作为局部解释和候选筛选依据。
|
|
||||||
|
|
||||||
## 2. 符号、题设事实与建模约定
|
|
||||||
|
|
||||||
| 符号 | 含义 |
|
|
||||||
| --- | --- |
|
|
||||||
| $s$、$\theta$ | 首次检测位置与示向度 |
|
|
||||||
| $\delta$ | 误差半角,默认 $1^\circ$ |
|
|
||||||
| $g$ | 未知的全向干扰源位置 |
|
|
||||||
| $\Omega=B(0,1800)$ | 干扰源位置圆域 |
|
|
||||||
| $R_g\in[R_-,R_+]$ | 未知有效接收半径,$R_-=1000$、$R_+=1500$ 米 |
|
|
||||||
| $K_1$ | 首次观测后的保守位置候选集 |
|
|
||||||
| $q$ | 第二检测点 |
|
|
||||||
| $\mathcal Q(K_1)$ | 对 $K_1$ 内所有位置均保证接收的第二点区域 |
|
|
||||||
| $\rho(K)$ | 非空有界集合 $K$ 的最小包围半径 |
|
|
||||||
| $J(q)$ | 第二点的最坏保守后验半径 |
|
|
||||||
|
|
||||||
采用以下题设事实:有效接收半径在1000至1500米之间;检测点到全向源距离不超过5米时无法得到示向度,可直接光学定位并清除;清除距离不超过20米;机器狗移动速度为5米/秒,检测需要5秒,同一频道连续测量不发生额外频道切换。[题面附录2第(2)、(4)至(9)项](C:/Users/HelixCopex/code/MATH/issue/B题.pdf)
|
|
||||||
|
|
||||||
1800米圆域限制的是源位置,不是机器狗的搜索位置。检测点可以位于该圆域外;接口坐标分量的绝对值上限属于数值防护限制,不能误解成要求 $q\in\Omega$。[题面第4页](C:/Users/HelixCopex/code/MATH/issue/B题.pdf)
|
|
||||||
|
|
||||||
如果把读数舍入额外计入误差预算,可显式采用 $\delta=1.005^\circ$。下文解析推导对 $0\le\delta\le45^\circ$ 成立,但这一扩展区间不是题目误差范围。
|
|
||||||
|
|
||||||
## 3. 首次观测对应的源位置集合
|
|
||||||
|
|
||||||
设 $u=u(\theta)=(\cos\theta,\sin\theta)$。由第一次有效示向度,真实位置属于前向角域 $W(s,\theta,\delta)$;由已经收到信号,必有 $\lVert g-s\rVert\le R_g\le R_+$;由源位置限制,又有 $g\in\Omega$。故定义 $K_1=\Omega\cap W(s,\theta,\delta)\cap B(s,R_+)$。
|
|
||||||
|
|
||||||
该集合为闭凸紧集。真实观测一致时 $g\in K_1$,所以它非空。首次返回 `direction` 还意味着 $\lVert g-s\rVert>5$,但若把这个开圆盘排除,会破坏凸性。本文暂不使用该排除信息,保留包含真源的凸外包集合;由此得到的保证可能更保守,不会误删真实位置。
|
|
||||||
|
|
||||||
这一区别决定了后续结论的口径:本文给出的保证对较大的 $K_1$ 中所有位置成立,因而对实际源成立;但在 $K_1$ 上定义的最坏后验指标可能比利用全部观测细节的精确模型更悲观。
|
|
||||||
|
|
||||||
若计算得到 $K_1=\varnothing$,说明输入、频道、误差界或数值处理与题设不一致。此时应返回不一致状态,不能继续给空集计算圆心。问题一的纯角域求解器也不能直接把上述圆弧边界当作直线边界处理。
|
|
||||||
|
|
||||||
## 4. 安全候选区域的精确定义及基本性质
|
|
||||||
|
|
||||||
### 4.1 接收距离条件
|
|
||||||
|
|
||||||
若第二检测点满足 $\lVert q-g\rVert\le R_-$,由于 $R_g\ge R_-$,即可保证全向源信号能够接收。因此定义 $F_K(q)=\max_{g\in K}\lVert q-g\rVert$,并令 $\mathcal Q(K)=\{q:F_K(q)\le R_-\}=\bigcap_{g\in K}B(g,R_-)$。
|
|
||||||
|
|
||||||
这里限制的是第二点到所有可能源位置的距离,而不是到第一次检测点的距离。保证接收也不等于保证返回示向度,因为距离不超过5米时可能返回 `near`;该分支的定位效果更好,不能视为策略失败。
|
|
||||||
|
|
||||||
### 4.2 凸性、稳定性和非空条件
|
|
||||||
|
|
||||||
**命题1:** 对任意非空紧集 $K$,函数 $F_K$ 为凸函数,且满足 $\lvert F_K(q_1)-F_K(q_2)\rvert\le\lVert q_1-q_2\rVert$。
|
|
||||||
|
|
||||||
**证明:** 对每个固定的 $g$,距离函数关于 $q$ 凸;逐点取最大值保持凸性。又由三角不等式,$\lVert q_1-g\rVert\le\lVert q_2-g\rVert+\lVert q_1-q_2\rVert$,对 $g$ 取最大值得到一个方向的不等式,再交换两点即得结论。证毕。
|
|
||||||
|
|
||||||
因此 $\mathcal Q(K)$ 是闭凸集。非空时,它包含在任一 $B(g_0,R_-)$ 内,所以也有界。
|
|
||||||
|
|
||||||
**定理1:** $\mathcal Q(K)\ne\varnothing$ 当且仅当 $\rho(K)\le R_-$。
|
|
||||||
|
|
||||||
**证明:** 最小包围半径的定义为 $\rho(K)=\min_q F_K(q)$。存在 $q$ 使 $F_K(q)\le R_-$,与其最小值不超过 $R_-$ 完全等价。最小值存在,因为 $F_K$ 连续且随 $\lVert q\rVert\to\infty$ 趋于无穷。证毕。
|
|
||||||
|
|
||||||
当 $\rho(K)=R_-$ 时,安全区域仅包含唯一最小包围圆中心;唯一性可由两个候选中心的中点距离恒等式证明,见[问题一第8节](C:/Users/HelixCopex/code/MATH/docs/algo-1.md)。因此应使用不严格不等式,不能把等号情形误判为空。
|
|
||||||
|
|
||||||
### 4.3 外包圆给出的充分区域
|
|
||||||
|
|
||||||
若已知 $K\subseteq B(c,r)$ 且 $r\le R_-$,则任意满足 $\lVert q-c\rVert\le R_--r$ 的点,都有 $\lVert q-g\rVert\le\lVert q-c\rVert+\lVert c-g\rVert\le R_-$。因此 $B(c,R_--r)\subseteq\mathcal Q(K)$。
|
|
||||||
|
|
||||||
这给出了容易计算的充分候选区域,但一般不等于整个安全区域。一个宽松外包圆若满足 $r>R_-$,只能说明该外包圆不能提供证书,不能证明真实的 $\mathcal Q(K)$ 为空。
|
|
||||||
|
|
||||||
## 5. 首次截断角域的解析最小包围圆
|
|
||||||
|
|
||||||
### 5.1 坐标变换
|
|
||||||
|
|
||||||
暂时去掉只会缩小集合的 $\Omega$ 约束,考虑完整截断角域 $S=W(s,\theta,\delta)\cap B(s,R_+)$。平移并旋转,使 $s$ 成为原点、$u$ 成为横轴。其点可写成 $g=s+t\,u(\theta+\varphi)$,其中 $0\le t\le R_+$、$-\delta\le\varphi\le\delta$。
|
|
||||||
|
|
||||||
令 $a=R_+/(2\cos\delta)$,并取 $c=s+au$。
|
|
||||||
|
|
||||||
### 5.2 包含性证明
|
|
||||||
|
|
||||||
**定理2:** 对 $0\le\delta\le45^\circ$,截断角域 $S$ 的最小包围圆为 $B(c,a)$。
|
|
||||||
|
|
||||||
**证明的第一部分:** 对任意 $g\in S$,有 $\lVert g-c\rVert^2=t^2+a^2-2at\cos\varphi$。固定 $\varphi$ 时,右侧关于 $t$ 为凸二次函数,区间最大值在端点取得。当 $t=0$ 时等于 $a^2$;当 $t=R_+$ 时,由 $\cos\varphi\ge\cos\delta$ 得其不超过 $R_+^2+a^2-2aR_+\cos\delta=a^2$。故整个 $S$ 被该圆覆盖。
|
|
||||||
|
|
||||||
### 5.3 最小性证明
|
|
||||||
|
|
||||||
取角域中的三个点 $p_0=s$、$p_+=s+R_+u(\theta+\delta)$、$p_-=s+R_+u(\theta-\delta)$。它们均在 $B(c,a)$ 的圆周上。
|
|
||||||
|
|
||||||
令 $\lambda_+=\lambda_-=1/(4\cos^2\delta)$,$\lambda_0=1-1/(2\cos^2\delta)$。由于 $\delta\le45^\circ$,三权重非负且和为1,直接代入可得 $c=\lambda_0p_0+\lambda_+p_++\lambda_-p_-$。
|
|
||||||
|
|
||||||
对任意中心 $z$,利用加权距离恒等式,有 $\sum_j\lambda_j\lVert p_j-z\rVert^2=a^2+\lVert c-z\rVert^2\ge a^2$。若半径为 $r$ 的圆覆盖这三个点,则左侧不超过 $r^2$,故 $r\ge a$。任何覆盖 $S$ 的圆都必须覆盖这三个点,结合第一部分的包含性,得到最小半径恰为 $a$。当 $\delta=0$ 时两个远端点重合,结论退化为长度 $R_+$ 的线段直径圆,仍成立。证毕。
|
|
||||||
|
|
||||||
该推导不依赖源位置先验,也不依赖位置概率分布。它给出的是完整截断角域的精确最小圆;与 $\Omega$ 相交后,真实 $K_1$ 的最小圆可能更小。
|
|
||||||
|
|
||||||
## 6. 本题可直接采用的第二点候选区域
|
|
||||||
|
|
||||||
由 $K_1\subseteq S\subseteq B(c,a)$ 和第4.3节,可取 $\mathcal Q_0=B(c,b)$,其中 $c=s+au$、$a=1500/(2\cos\delta)$、$b=1000-a$。
|
|
||||||
|
|
||||||
| 误差半角 | 轴向中心距离 $a$ / 米 | 安全候选半径 $b$ / 米 |
|
|
||||||
| --- | ---: | ---: |
|
|
||||||
| $1^\circ$ | 750.114246 | 249.885754 |
|
|
||||||
| $1.005^\circ$ | 750.115391 | 249.884609 |
|
|
||||||
|
|
||||||
两种口径下 $b>0$,故本题首次有效测向后的安全候选区域可以直接证明非空。无需将“若安全区域为空就去最小圆圆心”作为正常流程的保底步骤。
|
|
||||||
|
|
||||||
几何上,$\mathcal Q_0$ 位于首测示向方向前方约750米,以约250米为半径。位于圆盘轴向前后端的点、两侧横向点以及圆心都保证接收。横向点只是可供比较的候选点,并未被证明总是最优。
|
|
||||||
|
|
||||||
为抵消坐标计算和动作提交中的工程舍入,可取缩小区域 $\mathcal Q_\eta=B(c,b-\eta)$,其中 $0<\eta<b$。若圆心和提交位置合计偏差不超过 $\eta$,三角不等式保证仍有 $\lVert q-g\rVert\le1000$。例如先取 $\eta=0.01$ 米属于可调工程选择,不是题面要求,也不是未分析数值误差的自动上界。
|
|
||||||
|
|
||||||
若有更精细的 $K_1$ 外包圆,可得到更大的充分区域;若精确处理其圆弧边界,也可直接搜索 $\mathcal Q(K_1)$。这些扩展是性能优化,不影响 $\mathcal Q_0$ 的正确性。
|
|
||||||
|
|
||||||
## 7. “较好的定位效果”的数学定义
|
|
||||||
|
|
||||||
### 7.1 保守后验集合
|
|
||||||
|
|
||||||
对候选点 $q\in\mathcal Q_0$,若返回 `direction` 及示向度 $\beta$,定义保守后验 $K_d(q,\beta)=K_1\cap W(q,\beta,\delta)$。这里继续忽略距离大于5米所提供的非凸排除信息。真实源一定属于 $K_d$。
|
|
||||||
|
|
||||||
若返回 `near`,定义 $K_n(q)=K_1\cap B(q,5)$,故 $\rho(K_n(q))\le5$。在此分支直接以当前位置进行光学定位和清除,满足20米的清除条件,不必强行再取得一个角度。
|
|
||||||
|
|
||||||
设圆周角距离为 $d_{\mathbb S^1}(\alpha,\beta)=\min_{k\in\mathbb Z}\lvert\alpha-\beta+360^\circ k\rvert$。对 $\lVert g-q\rVert>5$ 的候选位置,令真实方位为 $h_q(g)=\operatorname{atan2}(g_y-q_y,g_x-q_x)$。可能出现的读数集合定义为 $\mathcal B(q)=\{\beta:\exists g\in K_1,\ \lVert g-q\rVert>5,\ d_{\mathbb S^1}(\beta,h_q(g))\le\delta\}$。
|
|
||||||
|
|
||||||
这里用所有允许误差描述可能读数,不是假设各地点的误差可以随机独立重抽样。同一个位置的重复检测不产生新的独立信息;所构造的 $\mathcal Q_0$ 与首测位置相距至少约500米,天然避免原地重复测量。
|
|
||||||
|
|
||||||
### 7.2 最坏后验半径指标
|
|
||||||
|
|
||||||
定义 $J(q)$ 为所有可能 `direction` 分支的 $\rho(K_d(q,\beta))$,以及非空 `near` 分支的 $\rho(K_n(q))$ 的上确界。等价地,它是未来所有允许观测下最坏的保守最小包围半径;不存在的观测分支不参与取最大值。
|
|
||||||
|
|
||||||
选点的主要目标为在安全候选区域中降低 $J(q)$。该指标直接服务于一次清除要求:若 $J(q)\le20$,则每个可能分支都有半径不超过20米的保守定位圆。它比仅比较面积更符合任务,因为面积较小的集合仍可能十分狭长。
|
|
||||||
|
|
||||||
对于任意有效分支,后验都是 $K_1$ 的子集。集合包含关系给出 $\rho(K_2)\le\rho(K_1)$,故 $J(q)\le\rho(K_1)$。但不一定严格小于,因此不能仅由“增加一次观测”推断定位精度必然严格改善,更不能保证只需两次测向便达到20米阈值。
|
|
||||||
|
|
||||||
### 7.3 移动成本的引入
|
|
||||||
|
|
||||||
连续测量同一频道时,本次动作的虚拟时间增量为 $C(q)=\lVert q-s\rVert/5+5$ 秒。推荐先按后验半径择优,再在几何效果接近的候选点中比较移动成本,以避免任意混合米和秒。
|
|
||||||
|
|
||||||
用 $\widehat J(q)$ 表示实际计算的评估量,在第10节的保守方案中取为上界 $\overline J(q)$。设有限候选点中的最小评估值为 $J_{\min}$。可先保留满足 $\widehat J(q)\le J_{\min}+\tau$ 的点,再选择其中 $C(q)$ 最小者,其中 $\tau\ge0$ 是显式给定的定位容忍量,单位为米;$\tau=0$ 对应严格的字典序选择。本文不预设一个未经实验支持的最优 $\tau$。
|
|
||||||
|
|
||||||
## 8. 交会角的局部几何解释
|
|
||||||
|
|
||||||
在某个假定真实位置 $g$ 附近,令两站距离为 $r_1,r_2$,真实视线单位向量为 $u_1,u_2$,对应法向量为 $n_1,n_2$。当角误差很小且位置扰动相对站距较小时,方位函数的一阶展开给出 $n_i\cdot\Delta g\approx r_i e_i$,其中 $e_i$ 用弧度表示,满足 $\lvert e_i\rvert\le\delta_{\rm rad}$。
|
|
||||||
|
|
||||||
于是局部不确定区域近似由两条带状约束限定:$\lvert n_1\cdot\Delta g\rvert\le r_1\delta_{\rm rad}$、$\lvert n_2\cdot\Delta g\rvert\le r_2\delta_{\rm rad}$。若视线交会角为 $\phi$,法向量矩阵的行列式绝对值为 $\lvert\sin\phi\rvert$。对法向坐标中的矩形作线性逆变换,得到近似面积 $A_{\rm loc}\approx4r_1r_2\delta_{\rm rad}^2/\lvert\sin\phi\rvert$。
|
|
||||||
|
|
||||||
这解释了两点:近于平行或反向的视线使误差显著放大;在距离不变的局部比较下,接近直角的交会较有利。然而真实源位置未知,$r_2$ 和 $\phi$ 随 $g$ 改变,且有限角域并非无限带状区域。因此不能由该近似推出“总应横移固定距离”或“在某个假定源位置形成90度就是全局最优”。本文只将其用于优先考虑轴线两侧候选点,最终仍以后验集合指标评价。
|
|
||||||
|
|
||||||
## 9. 圆弧先验的保守离散
|
|
||||||
|
|
||||||
### 9.1 外包切线多边形
|
|
||||||
|
|
||||||
直接将圆周采样点连接得到的是内接多边形,会错误排除圆盘边缘的真实位置。为了复用第一问的半平面工具,选择 $M\ge3$ 个均匀法向量 $v_j=u(2\pi j/M)$,定义 $P_M(o,R)=\{x:v_j\cdot(x-o)\le R,\ j=0,\ldots,M-1\}$。
|
|
||||||
|
|
||||||
由柯西不等式,任意 $x\in B(o,R)$ 都满足所有约束,因此 $B(o,R)\subseteq P_M(o,R)$。相邻切线交点到圆心的距离为 $R\sec(\pi/M)$,故单个圆盘外包的最大径向超出不超过 $R[\sec(\pi/M)-1]$。
|
|
||||||
|
|
||||||
令 $\widetilde K_1=P_M(0,1800)\cap W(s,\theta,\delta)\cap P_M(s,1500)$,便有 $K_1\subseteq\widetilde K_1$。对任何第二读数再求半平面交,仍然保留真实源。上述单圆径向误差不能未经论证直接当成最终定位半径的误差界;靠近切触或退化时尤其需要加密检查。
|
|
||||||
|
|
||||||
安全选点仍使用第6节的解析 $\mathcal Q_\eta$。即使粗糙外包多边形的最小圆偏大,也不能据此推翻解析安全区域的非空结论。
|
|
||||||
|
|
||||||
### 9.2 多边形安全区域的可选扩展
|
|
||||||
|
|
||||||
若采用任意有界凸外包多边形 $\widetilde K=\operatorname{conv}\{v_j\}$,则 $\max_{g\in\widetilde K}\lVert q-g\rVert=\max_j\lVert q-v_j\rVert$,证明与第一问的凸组合论证相同。因此其保证接收区域由有限个约束 $\lVert q-v_j\rVert\le1000$ 给出,是圆盘交。
|
|
||||||
|
|
||||||
也可先解最小包围圆问题,再构造充分安全圆盘。由于 $\widetilde K$ 是外包集合,得到的区域可能更小,但其中每个点仍安全。若该离散区域为空,优先加密或回到解析候选盘,不把离散失败误报为真实问题无解。
|
|
||||||
|
|
||||||
## 10. 未来读数的保守区间评估
|
|
||||||
|
|
||||||
直接枚举少量假定源位置和误差端点,只得到被枚举情形的最大值,可能漏掉真正最坏读数。为了使评估输出具有上界意义,可以划分全部可能方位角,而非仅点采样。
|
|
||||||
|
|
||||||
将整周按圆周意义划分为若干区间 $I_j$,中心为 $\beta_j$,宽度为 $h_j$,要求 $\delta+h_j/2<90^\circ$。跨越 $0^\circ$ 的区间按圆周距离处理。
|
|
||||||
|
|
||||||
**命题2:** 对任意 $\beta\in I_j$,有 $W(q,\beta,\delta)\subseteq W(q,\beta_j,\delta+h_j/2)$。
|
|
||||||
|
|
||||||
**证明:** 对左侧任意非顶点位置,其方向到 $\beta$ 的圆周距离不超过 $\delta$;而 $\beta$ 到区间中心的距离不超过 $h_j/2$。由圆周距离的三角不等式,其方向到中心的距离不超过两者之和。顶点在两个闭角域中均被保留。证毕。
|
|
||||||
|
|
||||||
因此定义 $U_j(q)=\widetilde K_1\cap W(q,\beta_j,\delta+h_j/2)$,则任何落在该区间的真实读数所对应的保守后验,都包含于 $U_j(q)$,从而 $\rho(K_d(q,\beta))\le\rho(U_j(q))$。
|
|
||||||
|
|
||||||
对于 `near` 分支,可以取统一上界 $\min\{5,\rho(\widetilde K_1)\}$。该上界不需要精确计算圆弧交集;即使某点实际不会触发 `near`,纳入此上界只增加保守性。
|
|
||||||
|
|
||||||
令 $\overline J(q)$ 等于所有非空 $U_j(q)$ 的最小包围半径,以及上述 `near` 上界的最大值,即得到 $J(q)\le\overline J(q)$。该结论在精确几何计算下成立。浮点实现还需给出包含性和数值误差处理,不能把无误差预算的计算值称为机器可验证的严格上界。
|
|
||||||
|
|
||||||
通过将某个角区间二分,子区间扩张后的角域包含于父区间的扩张角域,所以相应方向上界不会增大。通过保留旧切线并增加新切线,也可使外包多边形嵌套缩小。这给出稳定的自适应加密方向,但没有在本文中证明连续选点的统一收敛速率。
|
|
||||||
|
|
||||||
该评估可能较慢,实际可先用少量读数采样粗筛,再对入围点使用完整角区间上界。前一阶段仅决定计算资源分配;最后报告的保守上界必须来自完整覆盖的区间,不能来自粗筛样本最大值。
|
|
||||||
|
|
||||||
## 11. 可执行的第二点选择算法
|
|
||||||
|
|
||||||
**算法2:安全区域内的有限候选主动测向。**
|
|
||||||
|
|
||||||
1. 输入 $s,\theta,\delta$,核验首次观测为同一全向源的有效示向度,构造 $K_1$ 或其保守表示。
|
|
||||||
2. 计算 $a=1500/(2\cos\delta)$、$c=s+au(\theta)$、$b=1000-a$,选择满足误差预算的缩小半径 $b-\eta$。
|
|
||||||
3. 构造有限候选集:包含圆心 $c$,并取 $q_{\ell j}=c+r_\ell[\cos\psi_j\,u+\sin\psi_j\,u_\perp]$,其中 $0<r_\ell\le b-\eta$、$\psi_j=2\pi j/N_\psi$、$u_\perp=(-\sin\theta,\cos\theta)$。所有候选点自动满足接收距离保证。
|
|
||||||
4. 对每个候选点构造第9节的外包后验,按第10节评估 $\overline J(q)$,保存最坏角区间及对应包围圆作为评估依据。
|
|
||||||
5. 优先选择 $\overline J$ 较小的点;按预先声明的 $\tau$ 筛选近优点,再按移动检测代价选择,必要时用固定顺序消除完全同分。
|
|
||||||
6. 在现实计算预算内,对入围候选附近加密位置、细分最坏角区间并增加外包切线。保留当前已验证安全的可用点,预算耗尽时返回当前结果。
|
|
||||||
7. 在所选位置测量同一频道。若为 `near`,在当前位置清除;若为 `direction`,用实际读数更新候选集合并复算最小包围圆;若其半径仍大于20米,继续后续测向,不能宣称两次定位已经完成。
|
|
||||||
8. 若在距离保证条件下意外得到 `no_signal`,核查动作是否被接受、频道是否正确、源是否仍存在及坐标和模型是否一致。未知原因解决前不按正常 `direction` 分支更新位置候选。
|
|
||||||
|
|
||||||
例如可从3层半径、每层16个方向及1个圆心开始,共49个候选点;这是位置搜索的数值分辨率示例,与第三问49点全域覆盖网格无关,也不是已优化参数。外包切线数、角区间宽度、加密次数及 $\tau$ 均应在论文实验部分显式记录。
|
|
||||||
|
|
||||||
设候选数为 $N_q$、角区间数为 $N_\beta$、每个后验的半平面数为 $k$。复用第一问的边界枚举时,主计算量约为 $O(N_qN_\beta k^3)$,另加顶点直径或最小圆计算。该方法提供清楚的正确性结构,但需通过缓存首次约束、局部加密和计算预算控制实现成本。不能用“只需一次新的测量”忽略选点器自身的运行时间。
|
|
||||||
|
|
||||||
算法输出保证的是:所选点位于已证明安全的区域,并在给定有限候选及评估精度下按既定规则择优。本文未证明 $q\mapsto J(q)$ 是凸函数,也未证明有限候选的最优点就是整个 $\mathcal Q(K_1)$ 中的全局最优点。
|
|
||||||
|
|
||||||
## 12. 边界情形与适用范围
|
|
||||||
|
|
||||||
| 情形 | 正确处理 |
|
|
||||||
| --- | --- |
|
|
||||||
| $K_1$ 为空 | 报告模型或数据不一致,不构造虚假圆心 |
|
|
||||||
| 首次结果已经为 `near` | 直接清除,不再套用“已知示向度”的第二问流程 |
|
|
||||||
| 一般集合满足 $\rho(K)=1000$ | 安全区域为最小包围圆中心这个单点 |
|
|
||||||
| 一般集合满足 $\rho(K)>1000$ | 不存在对该集合全部位置保证接收的点;圆心仅是最小化最坏距离的探索选择 |
|
|
||||||
| 外包圆半径大于1000 | 只能判定该证书不足,不能直接判真实安全区域为空 |
|
|
||||||
| 测量轴接近 $0^\circ/360^\circ$ | 使用向量约束和圆周区间,避免角度断点错误 |
|
|
||||||
| 两次测向交会较差 | 保留完整后验并继续测量,不将小面积当成小直径 |
|
|
||||||
| 源类型为定向 | 距离证书仍成立,但接收还受朝向限制,不能直接沿用本问的接收保证 |
|
|
||||||
|
|
||||||
对于一般集合无安全点的情形,最小包围圆中心确实解 $\min_q\max_{g\in K}\lVert q-g\rVert$,但其最坏距离仍可能大于1000米。改善交会角若要求偏离该中心,还会牺牲最坏距离最优性,必须明确是另一个多目标探索策略,不能把两项互相冲突的要求同时称为已保证。
|
|
||||||
|
|
||||||
## 13. 验证设计及当前实现边界
|
|
||||||
|
|
||||||
本问的验证分为数学证书与策略性能两层。数学层检查:截断角域被解析圆覆盖;安全候选到所有允许位置的距离不超过1000米;外包离散不删除真实点;角区间扩张包含所有区间内读数。数值抽样只能辅助检查这些证明,不能取代它们。
|
|
||||||
|
|
||||||
性能层应在相同自建源位置与确定的空间误差场上,比较轴向点、两个横向点、有限候选最坏后验策略。误差场在同一位置保持固定;不得让每次调用重新独立生成误差。记录第二次测量类型、后验直径和包围半径、额外移动、计算耗时及是否达到20米清除阈值。至少包含误差边界、源域边界、接收半径1000米、近距离和近共线案例。没有这些实验前,不报告未经验证的性能提升比例。
|
|
||||||
|
|
||||||
目前 [planning.py](C:/Users/HelixCopex/code/MATH/geometry/planning.py) 中的 `first_bearing_candidate_disk` 已实现第5至6节的解析证书;问题一内核可用于纯半平面区域的顶点和最小圆计算。**本仓库第二问交付的定位是"安全选点的启发式基线"**:解析安全候选盘证书已实现并证明(选中点必能收到信号),而选点评分采用边界采样点 × 读数区间端点的有限枚举近似(含 near 分支)。第9至11节描述的完整选点器数学方案,特别是第10节覆盖全部未来读数的保守区间上界,尚未在现有仓库中实现;采样最大值只用于候选点之间的相对比较与粗筛,不得当作严格最坏情形上界报告,也没有相应正式成绩。该实现边界不影响解析候选区域的证明。
|
|
||||||
|
|
||||||
对后续实现而言,应新增接收任意半平面约束的交集入口,或使用独立的多边形裁剪函数,再复用第一问的最小包围圆。不能把圆盘先验伪装成额外测向观测传入现有 `solve(measurements)` 接口。
|
|
||||||
|
|
||||||
## 14. 结论
|
|
||||||
|
|
||||||
第二问的候选区域可以明确取为前方约750米处、半径约250米的圆盘,其解析式为 $\mathcal Q_0=B(s+au(\theta),1000-a)$,其中 $a=1500/(2\cos\delta)$。这一候选区域对题设全向源提供接收保证,且在首次有效测向条件下严格非空。
|
|
||||||
|
|
||||||
在该区域内,以最坏保守后验最小包围半径为主指标、移动代价为次指标,采用有限候选和逐步加密进行选择。交会角解释局部几何优劣,外包多边形和读数区间扩张保证不低估相关后验集合;全局最优和“两次即可清除”均不作为未经证明的结论。
|
|
||||||
|
|
||||||
## 参考文献
|
|
||||||
|
|
||||||
1. 全国大学生数学建模竞赛组委会. 2026年高教社杯全国大学生数学建模竞赛B题:无线电干扰源的快速自动定位与清除[Z]. 2026. [本地题面](C:/Users/HelixCopex/code/MATH/issue/B题.pdf),问题2、附录2及第4页坐标约束。
|
|
||||||
2. 模拟器配套材料. 附件2:模拟器通信接口说明及编程指南[Z]. 2026. [本地附件](C:/Users/HelixCopex/code/MATH/issue/附件/附件2.docx)。用于 `direction`、`near`、`no_signal` 等程序观测字段与动作接口的对应。
|
|
||||||
3. BOYD S, VANDENBERGHE L. Convex Optimization[M]. Cambridge: Cambridge University Press, 2004. [作者公开版本](https://web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf),第3章、第6.4节。用于凸性及鲁棒建模的一般背景,不作为本题候选圆盘公式的出处。
|
|
||||||
4. 本项目. 问题一:有界测向误差下定位区域的直径与圆覆盖[Z]. 2026. [algo-1.md](C:/Users/HelixCopex/code/MATH/docs/algo-1.md)。用于角域半平面表示、顶点判定和最小包围圆的衔接。
|
|
||||||
|
|
||||||
**来源说明:** 第5节的截断角域最小圆及第6节的安全圆盘,是结合题设参数在本文中推导的结果;第8节的交会角关系由方位函数一阶展开推得;第9至11节是据集合包含关系构造的保守计算方案。以上陈述说明本项目的推导路径,不宣称这些一般几何思想在既有文献中首次出现。
|
|
||||||
@@ -1,138 +0,0 @@
|
|||||||
# 算法说明:问题3 贝叶斯闭环(`bayes` 策略)
|
|
||||||
|
|
||||||
对应实现:`src/mcm26b/particles.py`(感知层)、`src/mcm26b/planner/bayes_loop.py`
|
|
||||||
(决策层)、`scripts/benchmark_q3_bayes.py`(消融)、`scripts/tune_q3_bayes.py`
|
|
||||||
(Optuna 调参)。基线对比:`docs/algo-3.md` 的七点批量(`seven`,A2)。
|
|
||||||
|
|
||||||
## 1. 建模定位
|
|
||||||
|
|
||||||
问题3是部分可观察的在线决策问题:频道数未知(10–16/20)、位置未知、有效
|
|
||||||
接收半径未知(1000–1500m)、测向误差 ±1°(服务器保留两位小数)。策略层
|
|
||||||
只能拿到 `/measure` 与 `/clear` 的响应,目标是最小化"发现—定位—清除"的
|
|
||||||
虚拟总时间。`bayes` 策略把它分解为三层滚动时域闭环:
|
|
||||||
|
|
||||||
1. **感知层**:每频道一个贝叶斯后验(网格幸存集),融合全部正/负观测;
|
|
||||||
2. **决策层**:站点扫频、定位测量、清除三类任务统一建表,开放路径
|
|
||||||
最近邻 + 2-opt 排序,每个动作后滚动重排(动态 TSP);
|
|
||||||
3. **选点层**:默认按期望log幸存占比和“到检测点、再接近源”的移动代价评分。
|
|
||||||
已停靠位置可逐频道补交会观测,真实清除始终由完整角域证书批准。
|
|
||||||
|
|
||||||
2026-09-11 当前修订的审核与配对验收见 [三四问算法审核与优化](算法审核与优化-20260911.md)。
|
|
||||||
本文件第5节是早期版本的历史结果,不应当作当前默认参数的复算结果。
|
|
||||||
|
|
||||||
## 2. 网格幸存集滤波与真源保留定理
|
|
||||||
|
|
||||||
每频道维护 Ω 上间距 h 的网格(h=14.65m,约 4.7 万格),`alive` 为幸存格
|
|
||||||
集合。Voronoi 裕量 m = √2/2·h 是格心到格内任一点的最大距离;所有删除
|
|
||||||
判定都内缩 m,即**仅当整格与可行集不相交时才删格**:
|
|
||||||
|
|
||||||
| 观测 | 题面语义 | 删除判定 |
|
|
||||||
|---|---|---|
|
|
||||||
| `no_signal`@s | 距离 > r_eff ≥ 1000 | 删格心距 s ≤ 1000 − m 的格 |
|
|
||||||
| `direction`@s | 距离 ≤ 1500,\|读数−真值\| ≤ δ_eff | 删角向超出 δ_eff + asin(m/(d−m)) 或距 s > 1500 + m 的格 |
|
|
||||||
| `near`@s | 距离 ≤ 5 | 删格心距 s > 5 + m 的格 |
|
|
||||||
|
|
||||||
**定理(真源保留)**:真源 P 满足全部题面约束;P 所在格的格心 g 满足
|
|
||||||
|g−P| ≤ m,故"整格不相交"判定永不命中该格。因此任意观测序列后 P ∈
|
|
||||||
幸存格的并集,且:
|
|
||||||
|
|
||||||
- **缺席证明**:幸存集为空 ⟹ 可行集为空 ⟹ 该频道无源(严格);
|
|
||||||
- **清除证书**:MEC(幸存).R + m ≤ 20 − 工程余量 ⟹ 真源距清除点 ≤ 20;
|
|
||||||
- **跳测规则**:幸存格到测点最小距离 > 1500 + m ⟹ 该测量必 no_signal
|
|
||||||
且无新排除,可跳过。
|
|
||||||
|
|
||||||
性质测试:`tests/test_particles.py`(随机源 × 随机测点 × 随机合法误差,
|
|
||||||
真源格永不被删;`tests/test_bayes_loop_q3.py` 端到端零异常)。
|
|
||||||
|
|
||||||
与 `belief.CandidateRegion`(保守凸外包)的分工:凸表示负责**清除证书**
|
|
||||||
(精确角域裁剪、收敛后触发),网格负责凸表示做不到的三件事——非凸负
|
|
||||||
观测挖洞(no_signal 排除盘)、缺席提前证毕、跳测判定。两者同读一套
|
|
||||||
响应流(`_record_measure`),任何一方证毕即收尾。
|
|
||||||
|
|
||||||
## 3. 信息增益选点
|
|
||||||
|
|
||||||
候选点集(二选一,按保证接收盘是否非空):
|
|
||||||
|
|
||||||
- **保证接收盘** B(MEC_poly 圆心, 1000 − ρ_poly)(盘内必收 direction/near,
|
|
||||||
几何同 `docs/algo-2.md` 定理1):环形采样(`search.candidate_rings`×12 方向);
|
|
||||||
- **宽候选集**(ρ_poly > 1000 时):PF MEC 的 1.0/1.5/2.0 倍探索环。
|
|
||||||
|
|
||||||
评分(`BayesConfig.score_mode`):
|
|
||||||
|
|
||||||
- `radius`(可选):期望后验半径 —— 对 K 个代表假设(幸存格均匀抽样)
|
|
||||||
各自模拟一次测量的幸存分支,分支半径用幸存子采样的质心最大距离近似,
|
|
||||||
r_eff~U(1000,1500) 的不确定性解析积分(p_no_signal = (d−1000)/500);
|
|
||||||
总分 = E[半径] + λ·移动秒数(λ=0.1);
|
|
||||||
- `entropy`(当前默认,λ=0.0105):期望log幸存占比,加上λ乘以
|
|
||||||
当前点→候选检测点→候选源中心的移动秒数。来向对称候选补充固定全局方向网格。
|
|
||||||
|
|
||||||
这里的均匀先验、零误差代表读数和均匀接收半径是选点评分的工程假设,
|
|
||||||
不属于题面给定的概率模型;只有完整±1.005°角域与距离界参与安全证明。
|
|
||||||
|
|
||||||
λ 与半径同量纲,量级必须小:λ 过大时终局阶段"走 300m"的代价压过
|
|
||||||
"半径 35m→25m"的收益,选点器原地重测、收敛停滞(消融实测 λ≥0.5 时
|
|
||||||
单源定位步数翻倍)。
|
|
||||||
|
|
||||||
## 4. 统一任务循环(动态 TSP)
|
|
||||||
|
|
||||||
每个决策点构建任务表并排序执行首个任务,随后滚动重排:
|
|
||||||
|
|
||||||
- **站点任务**:七站(原点 + 当前1159.7m环六点)上的UNKNOWN频道;
|
|
||||||
构造时验证全向覆盖解析界小于1000m,跳测规则与覆盖账本过滤;
|
|
||||||
- **定位任务**:DETECTED 且无证书的频道,位置由信息增益选点产生;
|
|
||||||
- **清除任务**:有证书(凸或网格)的频道,可沿当前位置方向移动证书圆心,
|
|
||||||
但平移量与原半径之和不得超过清除证书阈值,节省最后一段接近路程。
|
|
||||||
|
|
||||||
排序 = 开放路径最近邻打底 + 2-opt 改进(`two_opt_passes` 轮,成本含
|
|
||||||
移动 + 换频 + 动作耗时;换频按路径顺序逐步传递当前频道,clear保持频道;
|
|
||||||
终点自由不回起点)。这是 A2"站内最近邻服务
|
|
||||||
队列"的推广:消融显示距离缩短约 24% 是主要收益来源。
|
|
||||||
|
|
||||||
停止条件与基线一致:清满 16(数量上界)或全部频道 CLEARED/ABSENT,
|
|
||||||
`stop_reason=all_resolved` 即停并 `/exit`——**虚拟时间即评测成绩口径**
|
|
||||||
[用户决策修订 2026-09-11]。复扫保险模式(`mcm26b run --persistent`,
|
|
||||||
原默认行为):找全后继续只复扫未清除频道直到清除数达 16、实机预算
|
|
||||||
耗尽或虚拟安全余量(`search.virtual_reserve_s=10000s`)不足,供需要
|
|
||||||
"防缺席证明假设偏差"保险的场景显式开启。
|
|
||||||
|
|
||||||
## 5. 消融结果(自建模拟器,persistent 关,对齐找全口径)
|
|
||||||
|
|
||||||
12 随机场景(6 种子 × 10/16 源)+ 2 边界场景,与 SevenBatch 配对;
|
|
||||||
bayes 参数为 Optuna 回填后的库默认值:
|
|
||||||
|
|
||||||
| 指标 | SevenBatch | bayes |
|
|
||||||
|---|---|---|
|
|
||||||
| 有效运行(全清+缺席正确+零异常+正常退出) | 14/14 | **14/14** |
|
|
||||||
| 平均虚拟时间 | 5352.7s | **3726.2s(−30.0%)** |
|
|
||||||
| 配对降幅(最差 / 最好) | — | +7% / −41% |
|
|
||||||
| 平均移动距离 | 23413m | **15050m(−36%)** |
|
|
||||||
| 平均检测次数 | 102.4 | 110.0 |
|
|
||||||
| 单局实机计算墙钟 | 1.3s | 1.9s |
|
|
||||||
|
|
||||||
复现:`uv run python scripts/benchmark_q3_bayes.py --seeds 0,1,2,3,4,5`
|
|
||||||
(逐场景数据与场景 JSON 见 `output/q3/bayes-ablation/`)。
|
|
||||||
|
|
||||||
## 6. Optuna 调参
|
|
||||||
|
|
||||||
`scripts/tune_q3_bayes.py`:TPE(dev 依赖 `optuna`,缺失时自动退化为
|
|
||||||
随机搜索),目标 = 场景子集平均虚拟时间 + 10⁶×失败惩罚。搜索空间:
|
|
||||||
λ、代表点数、子采样规模、网格间距、站点环半径、2-opt 轮数、评分模式。
|
|
||||||
最优组合(entropy 评分、λ=0.0105、h=14.65m、代表点 7、2-opt 4 轮)
|
|
||||||
已按验收流程回填为 `config.BayesConfig` 默认值:全量基准 3726s/−30.0%
|
|
||||||
优于回填前的 4277s/−19.5%。两处人工修订:
|
|
||||||
- `station_ring_radius_m` 保留 1200(Optuna 建议 1159.7 虽再快约 60s,
|
|
||||||
但七站排除盘对最外圈格心的覆盖差 3.3m,PF 无法独立证明缺席,
|
|
||||||
只能靠覆盖账本兜底——设计性质优先于 1.7% 的均值差异);
|
|
||||||
- 评分模式在 entropy(信息增益)与 radius(期望后验半径)之间由调参
|
|
||||||
数据决定,两者实现均保留(`BayesConfig.score_mode`)。
|
|
||||||
调参记录见 `output/q3/bayes-tuning/best_params.json`。
|
|
||||||
|
|
||||||
## 7. 已知边界
|
|
||||||
|
|
||||||
- 检测次数略多于 A2(109.6 vs 102.4):定位收敛多用 1-2 次测量换距离
|
|
||||||
大幅缩短,净收益为正;跳测规则在 UNKNOWN 阶段(先验全域)暂无收益
|
|
||||||
面,收益集中在定位与复扫阶段;
|
|
||||||
- 网格清除证书(h=25m 时阈值 ≤1.8m)极少触发,作为凸证书的补位保险;
|
|
||||||
- 调参与消融基于自建模拟器(逐点固定 ±1° 误差场),不代表官方误差
|
|
||||||
分布;真源保留定理只依赖题面界(±1°、r_eff∈[1000,1500]),不依赖
|
|
||||||
误差分布假设。
|
|
||||||
@@ -1,414 +0,0 @@
|
|||||||
# 问题三:具有覆盖证明的多源搜索与总耗时优化
|
|
||||||
|
|
||||||
## 摘要
|
|
||||||
|
|
||||||
针对源数为10至16、频道互异、位置未知的全向无线电干扰源,建立“发现—定位—清除—完整性证明”的在线决策模型,以全部清除为约束、以移动、检测、换频道和清除的虚拟总耗时为优化目标。沿用问题一的角域交与最小包围圆、问题二的安全接收区域,将改进重点放在全域覆盖规模与多源任务调度。首先从官方演练日志识别移动与无源频道验证的主要开销;随后证明中心加六个环形检测点即可覆盖题设圆域,并提出同站批量扫频、发现任务入队、就近定位清除的可执行基线。进一步规划利用无信号观测维护剩余区域、复用顺路检测点、优化安全清除位置及滚动比较剩余任务耗时的方法。给出停止条件、几何保守性、算法复杂度和分阶段验收方案。12个自建场景的配对消融表明,七点批量策略全部清除成功,平均逐局虚拟时间降幅为58.55%;该结果用于选择下一步实现方向,不作为官方成绩或全局最优性证明。
|
|
||||||
|
|
||||||
**关键词:** 全向源搜索;覆盖证书;集合定位;任务调度;虚拟总耗时;滚动规划。
|
|
||||||
|
|
||||||
> **延伸实现(2026-09-11)**:本文规划的无信号负观测更新、开放路径 2-opt
|
|
||||||
> 任务排序等已落地为贝叶斯闭环策略 `bayes`(网格幸存集滤波 + 信息增益
|
|
||||||
> 选点 + 滚动任务调度,参数经 Optuna 回填),自建消融相对本文七点批量
|
|
||||||
> 策略平均虚拟时间再降 30.0%(均值 3726s)。设计、严格性证明与消融数据
|
|
||||||
> 见 [algo-3-bayes.md](algo-3-bayes.md)。
|
|
||||||
|
|
||||||
## 1. 问题界定与思路来源
|
|
||||||
|
|
||||||
第三问要求在不知道干扰源位置和具体数量的条件下,自动发现并清除全部全向源,尽量缩短总时间。每个频道最多一个源,因此本题的数据关联由频道确定;机器狗无需解决无法区分多个信号身份的问题。源位于半径1800米的圆域内,最小有效接收半径为1000米。这两个尺度之间的关系使稀疏、有证明的覆盖成为可能。[题面](C:/Users/HelixCopex/code/MATH/issue/B题.pdf)、[接口规则](C:/Users/HelixCopex/code/MATH/docs/协议规则表与状态机.md)
|
|
||||||
|
|
||||||
本文与前两问分工如下:问题一回答“当前观测允许源在哪里、能否一次清除”;问题二回答“下一次去哪里测才安全且有效”;问题三回答“先搜哪些位置、扫哪些频道、何时中断搜索去清除,以及何时能够确信任务结束”。全局调度会调用前两问的几何内核,但不能只把第二问的局部精度目标逐个重复就视为总时间优化。
|
|
||||||
|
|
||||||
参考本项目[问题3—4论文列表](C:/Users/HelixCopex/code/MATH/docs/B题问题3-4相关论文列表.md),选取并核对以下相关思想。
|
|
||||||
|
|
||||||
| 来源 | 本文借鉴的内容 | 与本题的区别 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| Bayram、Vander Hook、Isler,2016,列表第10项 | 联合规划测向位置和访问顺序,同时计入移动时间与测量时间 | 原文以GDOP描述不确定度;其近似比不能转移为本文有界角域和清除任务的近似保证 |
|
|
||||||
| Olofsson等,2020,列表第22项 | 根据已观测区域分配后续搜索资源,在有限预算下规划路径 | 原文使用PHD和期望发现数;本文用确定性的逐频道剩余区域,不用概率很小替代无源证明 |
|
|
||||||
| Perera等,2023,列表第4项 | 将稀疏覆盖路线与无线电源定位结合,并分别评价路径与采样代价 | 原文依赖RSSI;本题接口没有RSS/RSSI数值,不能直接使用其估计器 |
|
|
||||||
|
|
||||||
上述内容分别见[大学研究记录及论文摘要](https://experts.umn.edu/en/publications/gathering-bearing-data-for-target-localization-6/)、[作者公开论文](https://torarnj.folk.ntnu.no/AURO2020a.pdf)、[arXiv原文入口](https://arxiv.org/abs/2312.03493)。这里只迁移任务组织方法,以下七点几何证明和题目化调度公式在本文独立推导。
|
|
||||||
|
|
||||||
论文列表中建议的RSS梯度逼近不能直接用于本题:`/measure` 只返回无信号、近距离或示向度,没有连续场强值。Atanasov等的源搜索也依赖场信号、随机梯度或测量模型,其收敛结论不证明本题仅测向闭环收敛。[原论文摘要](https://arxiv.org/abs/1402.0051) 本文也不假定源位置均匀分布、每次误差独立重抽样或某一交会角在所有场景下最优。
|
|
||||||
|
|
||||||
## 2. 现有方案的实测瓶颈
|
|
||||||
|
|
||||||
官方问题3演练 `DHFK-PHD2-SR2P-FXK9` 已证明现有实现能在该局全清10个源,完整数据见[演练验证报告](C:/Users/HelixCopex/code/MATH/output/q3/practice/20260911-port2026/report.md)。该局在策略运行结束后才读取官方源数,源真值没有进入决策。
|
|
||||||
|
|
||||||
| 分项 | 本局数值 | 对改进的含义 |
|
|
||||||
| --- | ---: | --- |
|
|
||||||
| 总虚拟时间 | 16217.454814秒 | 作为官方基线,不与自建场景混算 |
|
|
||||||
| 移动距离 / 耗时 | 64737.274米 / 12947.454814秒 | 移动约占79.84%,应优先减少站点和往返 |
|
|
||||||
| 检测次数 / 耗时 | 540次 / 2700秒 | 无源频道各扫49点,共490次,占全部检测90.74% |
|
|
||||||
| 换频道耗时 | 520秒 | 可以优化,但节省一次换频仅相当于少走5米 |
|
|
||||||
| 清除耗时 | 50秒,10次全部成功 | 清除可靠性已得到单局支持,无需先追求更小定位半径 |
|
|
||||||
| 最后一个源清除时刻 | 8454.332399秒 | 其后7763.122415秒用于剩余任务,约占总时间47.87% |
|
|
||||||
|
|
||||||
现有 `OmnidirectionalLoop._coverage_phase` 的结构还引入额外往返:在一个覆盖站按频道扫描,遇到 `direction` 就立即定位清除,再回原覆盖站继续下一频道。由原始动作日志统计,从非网格点返回网格检测点共10次,累计约9996.714米、1999.343秒。这是实际行程分类,不能全部当成可直接删除的收益,因为改序后仍需访问下一任务;但它明确说明同站任务应先批量处理。
|
|
||||||
|
|
||||||
当前49点网格同时服务第三问和第四问。它的定向覆盖证明要求更强的几何条件;第三问无需为未知发射朝向付出同样的采样代价。改进第三问时,应显式区分全向策略和第四问策略,不能全局替换公用网格。
|
|
||||||
|
|
||||||
## 3. 状态、信息与优化目标
|
|
||||||
|
|
||||||
### 3.1 符号与可用信息
|
|
||||||
|
|
||||||
| 符号 | 含义 |
|
|
||||||
| --- | --- |
|
|
||||||
| $\Omega=B(0,R)$,$R=1800$ | 源位置区域,单位米 |
|
|
||||||
| $R_-=1000$,$R_+=1500$ | 有效接收半径下界、上界 |
|
|
||||||
| $p,f,t$ | 当前机器人位置、测向频道、官方虚拟时刻 |
|
|
||||||
| $K_c$ | 已发现频道 $c$ 的保守位置候选集 |
|
|
||||||
| $E_c$ | 尚未发现频道 $c$ 仍可能存在源的位置集合 |
|
|
||||||
| $\mathcal U,\mathcal D,\mathcal L,\mathcal C,\mathcal A$ | 未发现、待定位、可保证清除、已清除、已证明无源频道集 |
|
|
||||||
| $\mathcal P$ | 曾获得有效存在证据的不同频道集,包含已清除频道 |
|
|
||||||
| $\delta=1.005^\circ$ | 题设1°误差加两位小数舍入裕量 |
|
|
||||||
| $S$ | 具有全域覆盖证明的检测站集合 |
|
|
||||||
| $L,N_m,N_s,N_c^+,N_c^-$ | 移动长度、检测数、换频数、成功与失败清除数 |
|
|
||||||
|
|
||||||
源静止、同位置同频道的测向误差固定。只有该频道实际收到的观测才能更新其状态;经过一个位置不代表在那里扫过所有频道。不同频道的无信号证据不能互相替代。
|
|
||||||
|
|
||||||
### 3.2 统一的时间口径
|
|
||||||
|
|
||||||
忽略微秒量化时,整局虚拟耗时为
|
|
||||||
|
|
||||||
$$T=\frac{L}{5}+5N_m+N_s+5N_c^++3N_c^-.$$
|
|
||||||
|
|
||||||
`/clear` 的目标频道不改变测向机频道,因而不引入换频代价;`/exit` 不要求回到原点,也不增加虚拟时间。因此访问顺序是从当前位置出发、终点自由的**开放路径**问题,不能默认使用需要返回起点的旅行商回路。
|
|
||||||
|
|
||||||
官方内部按微秒累计,验收时按每次移动耗时量化到整数微秒,再累加检测、换频和清除的整数秒。连续实数公式用于规划,逐动作微秒公式用于复算。原演练汇总的541处偏差已查明为累计浮点与微秒精度口径不同,详见[独立审计](C:/Users/HelixCopex/code/MATH/output/q3/practice/20260911-port2026/verification.json)。
|
|
||||||
|
|
||||||
优化目标按优先级定义为:保持真源候选和有效完成条件;在现实1200秒、虚拟360000秒上限内全清;在可完成策略中降低 $T$。现实计算和网络耗时单独约束,不加进虚拟时间公式。由于源场景和误差场未知,理想模型可写为对允许场景集合 $\Xi$ 的 $\inf_\pi\sup_{\xi\in\Xi}T(\pi,\xi)$,但本文不声称解出了这个连续在线极小极大问题,也不声称已证明任意合法场景都能在两个预算内完成。
|
|
||||||
|
|
||||||
## 4. 逐频道证据与安全停止
|
|
||||||
|
|
||||||
### 4.1 观测更新
|
|
||||||
|
|
||||||
首次 `direction` 在 $s$ 返回 $\theta$ 时,建立
|
|
||||||
|
|
||||||
$$K_c=\Omega\cap B(s,R_+)\cap W(s,\theta,\delta).$$
|
|
||||||
|
|
||||||
以后每次有效测向再交入相应距离上界和角域。`near` 时交入 $B(s,5)$,当前检测点本身就满足20米清除条件。角域的半平面表达、保守圆盘外包和最小包围圆计算沿用[问题一](C:/Users/HelixCopex/code/MATH/docs/algo-1.md)、[问题二](C:/Users/HelixCopex/code/MATH/docs/algo-2.md)。
|
|
||||||
|
|
||||||
全向源在 $s$ 返回 `no_signal`,意味着若该频道仍存在未清除源,则其距离严格大于实际接收半径,进而大于1000米。因此对未发现频道可维护
|
|
||||||
|
|
||||||
$$E_c=\Omega\setminus\bigcup_{s\in\mathcal N_c}B(s,R_-),$$
|
|
||||||
|
|
||||||
其中 $\mathcal N_c$ 只含该频道实际测得无信号的位置。有限精度实现可只排除 $B(s,R_- -\eta)$,$\eta>0$ 是有依据的数值裕量;少删不会漏源。该负观测更新仅用于第三问,不能直接用于第四问的定向源。
|
|
||||||
|
|
||||||
圆盘差通常非凸。不能把扣除圆盘后的集合强行表示成单个凸多边形,更不能丢弃狭窄或小面积分量。第一阶段保留当前凸定位内核,仅在未知频道的覆盖账本中使用负观测;后续如把无信号用于已发现源的精定位,应使用多片区域或再取保守凸外包。
|
|
||||||
|
|
||||||
### 4.2 完成与计数推理
|
|
||||||
|
|
||||||
安全停止条件是 $\mathcal C\cup\mathcal A=\{1,\ldots,20\}$,且本局 `/exit` 已被接受。无源证明可来自完整覆盖、剩余集合的可靠判空,或下述数量上界。
|
|
||||||
|
|
||||||
由于每频道至多一个源且总数不超过16,当 $|\mathcal P|=16$ 时,所有未出现过有效信号的频道即可由数量上界判为无源,**不必等待16个都清除才停止扫未知频道**。随后仍须清除 $\mathcal P\setminus\mathcal C$,不能直接退出。成功清除16个则立即满足全清条件。
|
|
||||||
|
|
||||||
只发现或清除10个不够,因为10是下界。反过来,若无源证据已排除10个频道,则其余10个频道都必须有源,但仍需获取其定位观测;这种计数推理不能替代位置搜索。若已知存在与无源证据互相矛盾,或可存在频道数不足10,应报告协议、模型或数值不一致,不能把矛盾解释为成功。
|
|
||||||
|
|
||||||
## 5. 用七个检测站替代49点网格
|
|
||||||
|
|
||||||
### 5.1 布点
|
|
||||||
|
|
||||||
取原点及半径 $a$ 圆周上的六个等角点:
|
|
||||||
|
|
||||||
$$S(a)=\{(0,0)\}\cup\{a(\cos(k\pi/3),\sin(k\pi/3)):k=0,\ldots,5\}.$$
|
|
||||||
|
|
||||||
推荐首个工程版本固定 $a=1200$ 米。站点坐标为 $(0,0)$、$(1200,0)$、$(600,\pm600\sqrt3)$、$(-600,\pm600\sqrt3)$、$(-1200,0)$。这些点全部位于源圆域内;允许域外检测这一规则仍然保留,但本方案不需要依赖它。
|
|
||||||
|
|
||||||
### 5.2 连续覆盖证明
|
|
||||||
|
|
||||||
**定理1:** 若 $0<a/\sqrt3\le R$,则 $S(a)$ 对 $B(0,R)$ 的覆盖距离满足
|
|
||||||
|
|
||||||
$$\max_{g\in\Omega}\min_{s\in S(a)}\|g-s\|\le D(a):=\max\left\{\frac a{\sqrt3},\sqrt{R^2+a^2-\sqrt3Ra}\right\}.$$
|
|
||||||
|
|
||||||
**证明:** 任意 $g$ 写成极坐标 $(r,\theta)$。它与最近环上站点的夹角 $\varphi$ 不超过 $\pi/6$。令 $r_0=a/\sqrt3$。若 $r\le r_0$,选择原点,距离至多 $r_0$。若 $r\in[r_0,R]$,选择最近环站,有
|
|
||||||
|
|
||||||
$$\|g-s\|^2=r^2+a^2-2ar\cos\varphi\le r^2+a^2-\sqrt3ar.$$
|
|
||||||
|
|
||||||
右侧关于 $r$ 为凸二次函数,在闭区间最大值出现在端点。代入 $r_0$ 得 $a^2/3$,代入 $R$ 得第二项平方,从而得到结论。证毕。
|
|
||||||
|
|
||||||
代入 $R=1800$、$a=1200$,得到 $r_0=692.820323$ 米,$D(a)=968.901572$ 米,距离接收下界有31.098428米余量。因此每个合法全向源至少可在七站之一被检测到,不依赖位置概率、源数或源频道。
|
|
||||||
|
|
||||||
这是连续圆域的证明,不是“抽样没看到空洞”。此外用130501个极坐标采样点复算,最大最近站距为968.901572米,与解析值一致;该数值检查仅辅助发现公式或实现错误,见[覆盖校核数据](C:/Users/HelixCopex/code/MATH/output/q3/search-ablation/benchmark.json)。
|
|
||||||
|
|
||||||
**推论:** 对某频道七站全部测得无信号,就能证明该频道不存在源。若真实有源,覆盖定理给出一个距其小于1000米的站,在该站不可能返回无信号,矛盾。对已发现或已清除频道可以停止剩余覆盖检测,必须在逐频道账本中保存其原因。
|
|
||||||
|
|
||||||
### 5.3 环半径与时间的权衡
|
|
||||||
|
|
||||||
在本七点族内,若要求覆盖距离至多 $d\le1000$,外边界约束为
|
|
||||||
|
|
||||||
$$a^2-\sqrt3Ra+R^2-d^2\le0,$$
|
|
||||||
|
|
||||||
同时要求 $a/\sqrt3\le d$。当 $d\ge R/2$ 时,环半径的外边界允许区间为
|
|
||||||
|
|
||||||
$$R\cos(\pi/6)-\sqrt{d^2-R^2/4}\le a\le R\cos(\pi/6)+\sqrt{d^2-R^2/4}.$$
|
|
||||||
|
|
||||||
只按1000米边界、零裕量计算,最小 $a$ 约为1122.955832米;保留1米覆盖裕量时为1125.254906米。1200米不是最短路线的解析最优参数,而是在站距与覆盖裕量之间采用的透明工程选择。较小 $a$ 缩短站间路线,却改变后续发现时的交会几何和定位路程;应在独立场景上比较,不能仅由扫描路长选全局最优值。
|
|
||||||
|
|
||||||
从原点先到任一环站,再依次访问相邻五站,不返回原点,纯站间路长为 $6a=7200$ 米。每站最坏扫描20个频道,发现阶段最多140次检测,顺序扫描的换频次数至多139。因此这一**不含定位清除插入**的纯覆盖路线有上界
|
|
||||||
|
|
||||||
$$T_{\rm cover}\le7200/5+140\times5+139=2279\text{秒}.$$
|
|
||||||
|
|
||||||
不能把2279秒当成全清总耗时上界;定位插入还会改变站间行程。对本次官方案例的10个无源频道,完整覆盖所需检测可从490次降为70次,差420次、2100秒检测时间。这是覆盖账本的解析差额,不是已在相同官方案例实测的新算法收益。
|
|
||||||
|
|
||||||
七点既未被证明是最少站数,也未被证明在全部可行布点中路线最短。第四问边界朝外的定向源可看不到这些内侧站点,所以该定理仅进入第三问专用策略。
|
|
||||||
|
|
||||||
## 6. 同站批量扫频与定位任务队列
|
|
||||||
|
|
||||||
### 6.1 先完成本站,再离站
|
|
||||||
|
|
||||||
推荐的第一阶段策略如下:到达一个覆盖站,先对尚需在该站搜索的全部未知频道各测一次。若当前测向频道在待测集合中,将其排第一以节省一次换频,其余频道按固定顺序扫描。`direction` 只更新候选集并加入定位队列;`near` 可以在当前站立即清除,因为不需增加移动。完成本站的频道批次后,再决定离站执行哪些定位任务。
|
|
||||||
|
|
||||||
这保留每次请求的串行语义,也避免“查出一个频道—离站—返回—再查下一个频道”的结构性往返。全局频道分组,即先把某频道扫遍全域再换下一频道,虽然省换频,却可能把路径重复十余遍;每次检测移动只有超过5米,其耗时就已超过一次换频,应以空间批处理优先。
|
|
||||||
|
|
||||||
### 6.2 队列中的基本排序
|
|
||||||
|
|
||||||
第一版对待定位队列按当前点到候选集最小包围圆中心的距离选择最近频道,完成该频道的安全测向和清除后重新排序,然后访问仍有未知频道待测的最近覆盖站。圆心距离只是一种便宜的排序代理,不是实际完成该频道的精确剩余成本。
|
|
||||||
|
|
||||||
相比按频道编号处理,重新排序能考虑清除后的新位置;相比扫完七站才定位,同站发现后的批量服务能避免把所有局部信息拖到远处再处理。第12节的消融支持先采用这一方案,但最近优先没有全局最优或对所有场景更快的保证。
|
|
||||||
|
|
||||||
同一轮每个待定位频道最多调用一次既有定位子循环;该子循环每轮最多追加8次检测。未解决的频道保留在队列,不能忙等或重复清除同一份失败证书。覆盖阶段结束后再处理未解决任务;预算不足时明确记为未完成。
|
|
||||||
|
|
||||||
### 6.3 后续将队列代价改成“插入耗时”
|
|
||||||
|
|
||||||
设当前点为 $p$,下一计划覆盖站为 $b$。若某待清除目标允许的位置集合为 $\mathcal C_c$,其插入路径代价可写为
|
|
||||||
|
|
||||||
$$\Delta L_c=\min_{q\in\mathcal C_c}\bigl(\|p-q\|+\|q-b\|\bigr)-\|p-b\|.$$
|
|
||||||
|
|
||||||
再加5秒清除时间,即可与直接前往下一覆盖站比较。待定位目标用一次或两次安全测向的短程预演估计对应代价。存在多个目标时,采用最近插入、开放路径2-opt或限宽束搜索重排;测量产生新候选集后只执行当前最佳方案的第一步,再重规划。缺少未来目标真值时,这些都是显式的在线启发式。
|
|
||||||
|
|
||||||
“把所有新发现目标都做完再去下一站”是第一版规则,后续可允许代价过高的目标暂存,但要设置可审计的最大延后次数,并在搜索终止后清空队列,防止某个难目标长期得不到处理。
|
|
||||||
|
|
||||||
## 7. 无信号区域复用与自适应跳站
|
|
||||||
|
|
||||||
七点是固定的完成保证,负观测区域允许进一步减少实际检测。在定位、清除行程的已到达位置,可以评估是否顺路测量少量未知频道;每个额外频道仍需5秒,不能把“已到达”解释为“免费探测”。
|
|
||||||
|
|
||||||
### 7.1 具有保守性的区域表示
|
|
||||||
|
|
||||||
对每个未知频道以方形单元并集 $\widetilde E_c$ 外包 $E_c$。初始保留与 $\Omega$ 可能相交的单元。设单元中心为 $z$、半对角线为 $h$,只有满足 $\|z\|-h>1800$ 的单元才可直接判为域外;边界相交不确定时继续保留或细分。
|
|
||||||
|
|
||||||
一次该频道无信号观测位于 $s$,若整个单元满足
|
|
||||||
|
|
||||||
$$\|z-s\|+h\le1000-\eta,$$
|
|
||||||
|
|
||||||
则单元全部落入保证可收盘,可以安全删除。不得只检查单元中心,也不得用近似覆盖面积达到100%作为判空证据。若单元仍与真实残余相交,就保留它,直至可给出整单元删除证书。
|
|
||||||
|
|
||||||
**命题2:** 以上规则维持 $E_c\subseteq\widetilde E_c$,故 $\widetilde E_c=\varnothing$ 足以证明无源。反过来,$\widetilde E_c\ne\varnothing$ 可能只是离散保守性,不能据此断言有源。
|
|
||||||
|
|
||||||
七点有31.098米几何余量;可使最终方格边长不超过20米,其直径不超过28.285米。对任意与 $\Omega$ 相交的单元,取其中一个域内点,该点距某站不超过968.902米;单元全部点距该站不超过997.186米。因此在工程裕量小于约2.81米且正确处理边界相交的情况下,七站无信号足以最终删除这些单元。这里用整单元的最大距离证书;若只用 $\|z-s\|+h$ 的较松证书仍未通过,继续细分或直接使用七点账本证明,不错误地停在粗格残片上。
|
|
||||||
|
|
||||||
### 7.2 候选点与频道选择
|
|
||||||
|
|
||||||
新增候选点来自:未完成的七个锚点、当前位置、已规划的定位点/清除点、残余区域边界附近点。对 $q$ 和频道集合 $F$,定义
|
|
||||||
|
|
||||||
$$G(q,F)=\sum_{c\in F}\operatorname{area}\bigl(\widetilde E_c\cap B(q,1000-\eta)\bigr),$$
|
|
||||||
|
|
||||||
并以 $G(q,F)/(\|p-q\|/5+5|F|+N_{\rm switch}(F))$ 作为探索排序指标。面积是搜索潜力代理,不是发现概率或保证的信息增益;面积计算可近似,但只影响候选排序。无源判定仍由整区域覆盖证书给出。对极小、线状或退化残余,还要保留单元数、最远未覆盖距离及锚点完成优先级,不能因面积接近零而永久忽略。
|
|
||||||
|
|
||||||
在当前位置按每个候选频道的 $G(q,\{c\})$ 与5秒检测、可能1秒换频排序,只有优于当前预演方案时才添加。未来站点若要删除,必须重新证明该频道的剩余 $\widetilde E_c$ 被保留站点的保证接收盘覆盖;一次扫描所得“没有发现”只删该次盘内区域,不能整片按经验跳过。
|
|
||||||
|
|
||||||
### 7.3 完备后备
|
|
||||||
|
|
||||||
七点中未完成的“站点—频道”记录始终保留。自适应探索若连续不产生新的可靠覆盖、计算超时或动态证书不确定,则恢复固定七点访问。设置有限的额外探测额度或要求每次替换都完成至少一个新的覆盖记录,使启发式不能无限拖延覆盖完成。
|
|
||||||
|
|
||||||
这给出确定性的搜索后备:自适应部分只允许节省已证明冗余的动作,不允许删除尚未证明冗余的覆盖责任。该设计尚未进入当前生产实现,也未包含在第12节的七点消融中。
|
|
||||||
|
|
||||||
## 8. 定位和清除也应优化剩余时间
|
|
||||||
|
|
||||||
### 8.1 定位到“够清除”就停止
|
|
||||||
|
|
||||||
设保守多边形 $\widetilde K_c$ 的最小包围圆为 $B(m_c,\rho_c)$。清除阈值使用 $r_{\rm safe}=20-\varepsilon$,其中 $\varepsilon$ 覆盖实际计算和坐标提交误差。若 $\rho_c\le r_{\rm safe}$,就具有一次清除证书;没有必要为了获得更小半径继续增加检测或横移。
|
|
||||||
|
|
||||||
外包多边形本身已经包含真集,它的多余面积使决策更保守;不能把“外包多边形与原圆盘的径向差”未经传播分析当作浮点误差保证。现有实现还扣除了 `slack_m` 和工程清除余量,本次消融完整保留其行为;后续统一外包与数值误差口径时另行验收。
|
|
||||||
|
|
||||||
### 8.2 在所有保证清除点中选择短路径位置
|
|
||||||
|
|
||||||
若 $V_c$ 为 $\widetilde K_c$ 的顶点,则
|
|
||||||
|
|
||||||
$$\mathcal C_c=\bigcap_{v\in V_c}B(v,r_{\rm safe})$$
|
|
||||||
|
|
||||||
是凸集,非空当且仅当 $\rho(\widetilde K_c)\le r_{\rm safe}$。圆盘凸性保证覆盖全部顶点等价于覆盖整个多边形,故任意 $q\in\mathcal C_c$ 都能清除真源。
|
|
||||||
|
|
||||||
无后续任务时,选择 $\arg\min_{q\in\mathcal C_c}\|q-p\|$;已计划下一站 $b$ 时选择 $\arg\min_{q\in\mathcal C_c}(\|p-q\|+\|q-b\|)$。两者都是凸优化问题,可用二阶锥形式表达,也可在圆盘交的候选边界上求解后逐顶点复核。
|
|
||||||
|
|
||||||
轻量实现可先使用内部安全圆盘 $B(m_c,r_{\rm safe}-\rho_c)\subseteq\mathcal C_c$:将 $p$ 投影到该圆盘即可得到一个不远于前往 $m_c$ 的保证清除点。这只是对该充分圆盘的最近点,并非对整个 $\mathcal C_c$ 最优。若圆盘半径为0就退化到 $m_c$。
|
|
||||||
|
|
||||||
### 8.3 安全测点的目标由半径改为任务耗时
|
|
||||||
|
|
||||||
问题二提供的安全区域为 $\mathcal Q(K_c)=\bigcap_{g\in K_c}B(g,1000)$,可用解析盘或保守多边形构造充分区域。选点仍必须先满足接收保证,不能为走近一个猜测坐标而接受未经评估的失联风险。
|
|
||||||
|
|
||||||
在可安全测量的候选点中,使用以秒计量的短程代价
|
|
||||||
|
|
||||||
$$J_H(q)=\frac{\|p-q\|}{5}+5+\mathbf1_{f\ne c}+\max_{z\in\mathcal Z(q)}\widehat V_{H-1}(K_c\mid q,z;q,c),$$
|
|
||||||
|
|
||||||
其中 $z$ 包含 `near` 及允许的示向度,$\widehat V$ 估计完成该源及返回后续任务的时间。若某分支已能保证清除,其终端代价包括移动至 $\mathcal C_c$ 的时间和5秒清除;若未能清除,可继续一层安全测向,或赋予经过标定的剩余定位代价。未来测点、清除位置与访问顺序共同影响 $\widehat V$。
|
|
||||||
|
|
||||||
这个形式解释了为什么“后验半径更小”不一定“完成更快”:走远很久将半径降到5米,可能劣于近处测量后已经达到19米。所有实际比较项统一为秒,避免随意相加米、面积和时间。有限候选和有限视野只给出预演策略的启发式排序。
|
|
||||||
|
|
||||||
若要把 $\max_z$ 报告为严格上界,必须采用问题二第10节覆盖全部读数的角区间扩张,并对区域误差与终端代价也作保守上界。当前“边界位置采样×误差端点”并无该保证,不能仅因取了样本最大值就声称最坏总时间已受控。推荐先保留现有局部选点,验证搜索调度收益,再单独启用这一成本模型。
|
|
||||||
|
|
||||||
## 9. 保守性、有限结束与预算边界
|
|
||||||
|
|
||||||
**命题3(不漏发现):** 固定七点对每个仍未知频道完成扫描,或由可靠的残余覆盖/数量证书替代相应扫描,必能发现所有合法全向源。
|
|
||||||
|
|
||||||
**证明:** 固定点由定理1保证;动态替代保持该频道覆盖域包含所有仍可能位置;数量证书只在已有16个不同源的存在证据时排除其他频道。因此真源不可能被当作无源跳过。证毕。
|
|
||||||
|
|
||||||
**命题4(证书清除):** 若维护的外包集合包含真源,实际提交点满足对该外包的20米清除约束,则在题设规则下 `/clear` 必成功。几何证书通过而官方失败时必须记录异常并检查模型、数值及协议状态,不能在同一证书上循环重试。
|
|
||||||
|
|
||||||
上述命题不证明任意安全测点序列都会有限步收缩到20米。现有每轮8次测量是工程限额,不能作为收敛定理。拟在后续增加有限后备:对已发现频道的有界外包区域,用边长20米方格的中心覆盖所有相交格,任意格内点至格心不超过 $10\sqrt2<20$ 米;遍历该有限清除候选即可在模型成立时清除源。单元相交计算必须向保留更多格的方向保守。
|
|
||||||
|
|
||||||
后备仅在定位停滞时使用,并须先检查实际枚举格数、路径和预算。设当前到首格及格间的计划路长为 $L_f$,共 $M_f$ 格,最迟第 $M_f$ 格成功的虚拟耗时上界为
|
|
||||||
|
|
||||||
$$T_f\le L_f/5+3(M_f-1)+5.$$
|
|
||||||
|
|
||||||
使用相交格数硬顶、现实高分位单请求估计 $M_f\,t_{\rm RTT}^{95}$ 加退出预留,以及虚拟剩余预算共同筛选。现有第四问中的后备格算法可供复用,但不能跳过第三问的验证。硬顶或预算不允许时,保留“未完成”,不将耗尽预算说成证明无源。
|
|
||||||
|
|
||||||
因此本文区分三层结论:覆盖与证书的数学安全性;预算足够且正确遍历有限后备时的有限完成性;现实/虚拟双预算内的性能,目前由实验评价,尚无所有合法场景的统一完成上界。
|
|
||||||
|
|
||||||
## 10. 推荐算法与伪代码
|
|
||||||
|
|
||||||
**算法3A:七点覆盖+同站批量扫频+就近定位清除(优先落地版本)。**
|
|
||||||
|
|
||||||
```text
|
|
||||||
读取第三问参数,生成七点 S(1200),初始化逐频道观测和覆盖账本
|
|
||||||
调用 /enter,记录官方时间预算
|
|
||||||
while 尚有未知频道的站点记录未完成:
|
|
||||||
若预算不足:标记未完成,转退出
|
|
||||||
选择仍有未知频道待测的最近站点 s
|
|
||||||
在 s 批量测量待查频道(当前测向频道若在其中,优先测)
|
|
||||||
no_signal:记录该频道在 s 的覆盖证据
|
|
||||||
direction:更新该频道 K,加入待定位队列
|
|
||||||
near:在 s 清除并依据响应更新状态
|
|
||||||
对本站结束后的待定位队列:
|
|
||||||
按当前位置到候选圆心距离选最近频道
|
|
||||||
调用问题二安全选点与问题一清除证书完成其定位子循环
|
|
||||||
清除成功后重新排序;未完成者保留,单轮不无限重试
|
|
||||||
若已清除16个:结束任务
|
|
||||||
根据逐频道七点账本标记无源;继续处理尚未清除的已发现频道
|
|
||||||
仅在全频道均已清除/有无源证明时标记完成
|
|
||||||
调用 /exit;退出响应失败单独记录,不能宣称正常结束
|
|
||||||
```
|
|
||||||
|
|
||||||
**算法3B:在3A之上逐项增加的完整改进规划。** 每次 `direction/near` 更新存在集合 $\mathcal P$,达到16时提前结束未知频道搜索;在各实际测量点更新负观测区域并进行有证书的站点替代;用插入耗时比较“先搜下一站”与“先做某个源”;对候选路线重排;以预计剩余时间选择安全测点,在可清除区域中选择省路位置;定位停滞时按预算调用有限后备。每执行一个动作就用真实响应更新状态,禁止整段盲执行预测的后续动作。
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
flowchart TD
|
|
||||||
A[进入并读取预算] --> B[更新逐频道证据与完成条件]
|
|
||||||
B -->|已全清且无遗漏证明完整| X[退出并保存日志]
|
|
||||||
B -->|预算不足| Y[按未完成退出]
|
|
||||||
B -->|仍有任务| C[候选覆盖站与定位清除任务]
|
|
||||||
C --> D[比较短程总耗时并保持覆盖责任]
|
|
||||||
D --> E[同站批量扫描或执行一次定位清除动作]
|
|
||||||
E --> F[接收官方响应并验证候选及证书]
|
|
||||||
F --> B
|
|
||||||
```
|
|
||||||
|
|
||||||
第一版和后续规划分别命名,防止把3B尚未实现的负观测跳站、时间型选点和后备算法算进3A的测试成绩。
|
|
||||||
|
|
||||||
## 11. 计算量与工程实现
|
|
||||||
|
|
||||||
七点固定账本最多 $7\times20=140$ 个布尔记录。最近站选择检查7个点,每次按至多20个频道统计待测项;16个源的贪心任务队列重排规模很小。固定站路线的开放路径最优排序如需精确解,可使用子集动态规划,规模为 $O(k^2 2^k)$、$k\le7$;但加入观测依赖的定位任务后不再是同一个静态问题。
|
|
||||||
|
|
||||||
定位计算仍主要消耗在多个候选点、候选源见证点、读数分支的几何裁剪和最小圆计算。假设候选测点 $Q$ 个、读数区间 $B$ 个、外包顶点 $V$ 个,单层保守评估包含 $QB$ 次裁剪和最小圆计算,可表示为 $O(QB[V+T_{\rm MEC}(V)])$;两层分支不能简单称为线性。复用候选集缓存、先粗筛少量入围点,再完整区间验证,能够控制现实计算预算。
|
|
||||||
|
|
||||||
残余区域若使用 $H$ 个单元,20频道掩码空间为 $O(20H)$,一次频道负观测朴素检查 $O(H)$;可以预计算七锚点的单元覆盖掩码,并通过空间索引限制动态点的更新范围。分辨率只控制证书的保守程度,不得因内存不足删除尚未证实的残余格。
|
|
||||||
|
|
||||||
| 模块 | 当前事实 | 建议改动 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| `coverage` | 共用49点与逐频道账本 | 新增第三问七点构造;保留第四问网格及其独立证明 |
|
|
||||||
| `planner.OmnidirectionalLoop` | 发现后立即离站定位 | 把“本站扫频”与“队列服务”拆开,引入第三问策略选项 |
|
|
||||||
| `belief` | 无信号不裁剪候选 | 增加第三问独立残余覆盖层,避免破坏第四问朝向语义 |
|
|
||||||
| `geometry/planning`、`planner` | 有安全选点与最小圆证书 | 后续增加最近安全清除点和时间型候选评分 |
|
|
||||||
| `evaluation` | 浮点累计、固定微秒容差 | 单独兼容官方逐步微秒时钟和自建连续时钟,保留两种原始口径 |
|
|
||||||
| `protocol` | 串行、幂等、预算退出、JSONL日志 | 延用;增加的动作仍走同一客户端,不能并发测多个频道 |
|
|
||||||
|
|
||||||
实际路径分别位于 [coverage](C:/Users/HelixCopex/code/MATH/src/mcm26b/coverage/__init__.py)、[planner](C:/Users/HelixCopex/code/MATH/src/mcm26b/planner/__init__.py)、[belief](C:/Users/HelixCopex/code/MATH/src/mcm26b/belief/__init__.py)、[evaluation](C:/Users/HelixCopex/code/MATH/src/mcm26b/evaluation/__init__.py)。前两问文档中部分旧路径仍写为根目录 `geometry`,复用时以当前 `src/mcm26b/geometry` 为准。
|
|
||||||
|
|
||||||
## 12. 已完成的自建配对消融
|
|
||||||
|
|
||||||
### 12.1 实验口径
|
|
||||||
|
|
||||||
为验证优先级,新增独立脚本 [benchmark_q3_search.py](C:/Users/HelixCopex/code/MATH/scripts/benchmark_q3_search.py),只连接进程内 `LocalSimulator`,不连接官方端口、不修改生产策略。数据保存在 [search-ablation](C:/Users/HelixCopex/code/MATH/output/q3/search-ablation/benchmark.json),同时逐局保存源场景、固定误差场种子、接受动作日志与哈希。
|
|
||||||
|
|
||||||
共12个场景:源数10和16各一组,每组包含 `random_omni_scene` 种子0、1、2、3、4的5个场景,以及1个源位于1800米边界、接收半径均为1000米的场景。随机生成器径向采样不是圆域面积均匀分布,并特意含近边界源,不将其称为真实场景分布。各变体使用同一局源坐标、接收半径、频道和固定空间误差场;不同位置的合成误差机制不代表官方误差场。边界例包含扇区接缝附近的源。
|
|
||||||
|
|
||||||
比较四种版本,均沿用现有安全选点与清除内核、舍入裕量0.005°和8次追加检测限额:
|
|
||||||
|
|
||||||
| 版本 | 唯一涉及的搜索与调度变化 |
|
|
||||||
| --- | --- |
|
|
||||||
| A0:49点即时定位 | 当前生产基线 |
|
|
||||||
| A1:七点即时定位 | 只把覆盖点换成七点,仍发现即离站 |
|
|
||||||
| A2:七点本站批量 | 本站扫频完成后,按最近候选圆心服务队列;当前频道优先 |
|
|
||||||
| A3:七点全域先扫 | 扫完所有必要覆盖站后,再按最近候选圆心定位;near仍原地清除 |
|
|
||||||
|
|
||||||
A2/A3都包含当前频道优先这一小优化,因此A1与A2之差不是“纯粹只改变一个排序变量”的严格单因素实验。后续应再拆分消融换频顺序。3B的动态残余区域、16个已发现源提前停止搜索、时间型选点、最近安全清除点及后备均未在这组实验启用。
|
|
||||||
|
|
||||||
### 12.2 全部12个场景结果
|
|
||||||
|
|
||||||
| 版本 | 全清且正常完成 | 平均虚拟时间 / 秒 | 平均检测数 | 平均移动距离 / 米 | 平均逐局时间降幅 |
|
|
||||||
| --- | ---: | ---: | ---: | ---: | ---: |
|
|
||||||
| A0 | 12/12 | 13788.04 | 418.00 | 56183.95 | — |
|
|
||||||
| A1 | 12/12 | 7476.09 | 100.42 | 34146.70 | 43.25% |
|
|
||||||
| A2 | 12/12 | 5496.20 | 100.92 | 24177.66 | **58.55%** |
|
|
||||||
| A3 | 12/12 | 6094.73 | 101.67 | 27164.04 | 53.90% |
|
|
||||||
|
|
||||||
每个版本共清除156个源,48局合计624个源全部清除,无失败清除、无错误缺席判定、无定位异常。A2相对A0的逐局降幅范围为37.50%至70.84%。降幅按 $\frac1n\sum_i(1-T_{A2,i}/T_{A0,i})$ 计算,不能与两个均值之比混称同一个指标。
|
|
||||||
|
|
||||||
另以保存的自建场景真值独立复核48局动作日志,逐步检查正观测后的候选保留真源、清除证书及实际清除距离、全清集合、计时、检测数、退出响应与日志哈希,全部通过,见[证据复核结果](C:/Users/HelixCopex/code/MATH/output/q3/search-ablation/evidence-audit.json)。这些真值只用于离线验收,不进入策略。
|
|
||||||
|
|
||||||
| 源数(每组6场景) | A0平均时间 / 秒 | A1平均时间 / 秒 | A2平均时间 / 秒 | A3平均时间 / 秒 |
|
|
||||||
| --- | ---: | ---: | ---: | ---: |
|
|
||||||
| 10 | 15516.58 | 6313.47 | **4836.11** | 5467.38 |
|
|
||||||
| 16 | 12059.50 | 8638.71 | **6156.28** | 6722.08 |
|
|
||||||
|
|
||||||
10源时,未知频道的无源证明开销较大,所以七点替换收益明显;16源时,可通过清除数量上界提前停止,原网格未必扫完,但批量调度仍显著减少移动。A1与A2检测数相近,A2平均移动距离进一步下降,表明减少往返比单纯少测一次更有价值。这组自建证据支持优先实现A2,而非先投入复杂概率图、强化学习或全局非线性优化。
|
|
||||||
|
|
||||||
四版本平均本地计算墙钟约1.7至1.8秒/局,记录在数据中;它不含官方网络、真实程序截止或官方UI开销,不能当作新方案官方现实耗时。原官方动作日志只能验证旧路径上的响应,不能用它推断新测点的读数。只有在官方新演练执行新策略后,才能报告官方提速。
|
|
||||||
|
|
||||||
### 12.3 复现
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
.venv/Scripts/python.exe scripts/benchmark_q3_search.py --seeds 0,1,2,3,4
|
|
||||||
```
|
|
||||||
|
|
||||||
也可使用 `uv run python` 调用同一脚本。输出包含原始逐局数据,失败不会从汇总中剔除。当前实验是小规模方案筛选,不能证明所有合法场景、所有固定误差场或不同环半径下的性能。
|
|
||||||
|
|
||||||
## 13. 分阶段改进与验收计划
|
|
||||||
|
|
||||||
| 阶段 | 交付 | 必须通过的验收 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| I:七点+本站批量 | 将A2接入第三问CLI选项,保留A0可切换;原始日志格式兼容 | 七点连续覆盖证明与坐标误差预算;10/16源及边界例全清;第四问覆盖策略未被改动 |
|
|
||||||
| II:存在计数与扫频次序 | $|\mathcal P|=16$ 提前停止未知频道扫描;同站频道优先独立消融 | 已发现数、已清除数不混淆;发现10个不能停;clear不改变测向频道 |
|
|
||||||
| III:残余覆盖与顺路观测 | 保守单元账本、负观测复用、有证书跳站 | 边界及单元接缝不漏;未知频道各有独立覆盖责任;启发式停滞自动恢复七点 |
|
|
||||||
| IV:时间型局部动作 | 最近安全清除点、短程任务预演、插入排序 | 实际提交点满足全部外包顶点约束;near和跨0°读数正确;采样评分不冒充严格上界 |
|
|
||||||
| V:定位停滞与预算后备 | 有界区域有限清除覆盖,明确上限与退出 | 清除格子覆盖全部候选;格数/两种时间预算不足均记未完成;故障与失败可回放 |
|
|
||||||
|
|
||||||
每个阶段都在相同场景和同一固定误差场上进行配对比较。建议将种子0—4保留为本次开发集;最终验证另生成独立种子100—199,并分别覆盖10至16个源、接收半径1000和1500米、边界源、团簇源、同站near、接近共线读数、误差恰在±1°及空间相关误差场。所有超时、矛盾和未全清样例进入结果表,不允许只报成功局。
|
|
||||||
|
|
||||||
主要指标为全清且正常退出比例、平均/中位/P95/最大虚拟总时间、移动长度、检测数、换频数、清除失败数、证明无源的成本;同时报告最后清除时刻、现实计算时间与总请求数。小样本不确定性用逐局配对差分及其范围表达,增加样本后可在声明抽样假设的前提下给出区间估计;不从当前12例推出总体成功率为100%。
|
|
||||||
|
|
||||||
官方验收继续使用 socket 接口,逐条保存请求响应,最后保存官方结果及加密日志;优先使用官方支持的同案例复现功能进行配对,如果无法复现同一案例,就分别报告案例差异,不将两次随机局的时间差当成纯算法收益。本轮只完成方案研究与自建实验,没有再次启动官方演练。
|
|
||||||
|
|
||||||
## 14. 结论与实现边界
|
|
||||||
|
|
||||||
第三问首先应把覆盖责任从49点缩减为已证明足够的七点,并将覆盖站内扫频和离站定位拆开。该改进直接针对官方日志中的主要开销,在保持几何定位方法不变时,已经得到12个自建场景的配对支持。推荐先落地A2,再独立验证存在数量上界、残余覆盖和时间型测点/清除点优化。
|
|
||||||
|
|
||||||
初稿形成时,七点与三种调度变体存在于离线消融脚本,官方仅验证A0;随后A2已通过下述一次官方演练。生产 `src/mcm26b` 默认策略仍未修改,A2由独立运行脚本调用。3B给出了可实现的进一步规划,但没有将其预期收益写成已测结果。固定覆盖、观测集合和清除证书负责可靠性;候选评分、任务排序和半径调参负责效率,二者的保证范围分别陈述。
|
|
||||||
|
|
||||||
## 15. 补充:A2官方演练已通过
|
|
||||||
|
|
||||||
在方案研究之后,用户启动新的问题3演练,于2026-09-11通过2026端口实际执行A2。案例 `J4ER-Y9EP-Q379-UPFA` 的官方源数为12,12个全部清除,109次检测、12次清除无失败,现实耗时3.406秒,总虚拟耗时5232.132109秒(1小时27分12秒),移动22645.661米。其余8个频道各有完整七点无信号记录,最终正常退出。
|
|
||||||
|
|
||||||
123个请求响应已严格离线回放,清除证书和官方微秒计时全部通过复核。原始数据、官方产物、运行代码哈希及复现入口见[本局验证报告](C:/Users/HelixCopex/code/MATH/output/q3/practice/20260911-seven-batch-01/report.md)。因此A2现已有自建配对实验及一个官方案例的有效性证据。
|
|
||||||
|
|
||||||
相较之前A0官方10源案例的16217.454814秒,本局虚拟时间少67.74%,但案例和源数不同,不能把该差异称为严格算法提速率;第12节的58.55%仍仅指12个自建场景的配对平均结果。3B的进一步改进尚未启用。
|
|
||||||
|
|
||||||
## 参考文献
|
|
||||||
|
|
||||||
1. 全国大学生数学建模竞赛组委会. 2026年高教社杯全国大学生数学建模竞赛B题:无线电干扰源的快速自动定位与清除[Z]. 2026. [题面](C:/Users/HelixCopex/code/MATH/issue/B题.pdf);模拟器配套材料《附件2:模拟器通信接口说明及编程指南》[本地文件](C:/Users/HelixCopex/code/MATH/issue/附件/附件2.docx)。
|
|
||||||
2. 本项目. 问题一:有界测向误差下定位区域的直径与圆覆盖;问题二:具有接收保证的第二检测点选择[Z]. 2026. [algo-1](C:/Users/HelixCopex/code/MATH/docs/algo-1.md)、[algo-2](C:/Users/HelixCopex/code/MATH/docs/algo-2.md)。
|
|
||||||
3. BAYRAM H, VANDER HOOK J, ISLER V. Gathering Bearing Data for Target Localization[J]. IEEE Robotics and Automation Letters, 2016, 1(1): 369–374. DOI: 10.1109/LRA.2016.2521387. [作者所在大学的研究记录](https://experts.umn.edu/en/publications/gathering-bearing-data-for-target-localization-6/)。核对题目、作者、页码及移动与测量联合代价;未套用其GDOP近似比。
|
|
||||||
4. OLOFSSON J, HENDEBY G, LAUKNES T R, JOHANSEN T A. Multi-Agent Informed Path Planning Using the Probability Hypothesis Density[J]. Autonomous Robots, 2020. [作者公开稿](https://torarnj.folk.ntnu.no/AURO2020a.pdf),第1—2节。用于未观测区域与预算路径的建模对照。
|
|
||||||
5. PERERA A, TRAN V P, ANAVATTI S, KASMARIK K, GARRATT M. Radio Source Localization using Sparse Signal Measurements from Uncrewed Ground Vehicles[EB/OL]. arXiv:2312.03493, 2023. [原文入口](https://arxiv.org/abs/2312.03493)。用于稀疏覆盖与实验设计的对照,RSSI估计器未迁移。
|
|
||||||
6. ATANASOV N A, LE NY J, PAPPAS G J. Distributed Algorithms for Stochastic Source Seeking with Mobile Robot Networks: Technical Report[EB/OL]. arXiv:1402.0051v2, 2014. [原文入口](https://arxiv.org/abs/1402.0051)。用于说明场强梯度和测量模型假设的适用边界,不引用其结论证明本算法收敛。
|
|
||||||
|
|
||||||
在线来源核对日期:2026-09-11。本文的七点构造、覆盖界和具体调度规划来自对题设参数的推导与本项目实验,不宣称一般几何和路径规划思想在文献中首次出现。
|
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
# docs/figures —— 论文插图
|
||||||
|
|
||||||
|
本目录的 10 张 PNG 全部进入论文:`docs/paper/main.tex` 用
|
||||||
|
`\graphicspath{{../figures/}}` 直接引用,论文不重绘、也不手抄图内任何数字。
|
||||||
|
全部插图由同一脚本生成:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv run python scripts/plot_paper_figures.py # 依赖 numpy 与 matplotlib
|
||||||
|
```
|
||||||
|
|
||||||
|
数据来自 `docs/paper/data/` 下的复算结果(`practice-results.json`、
|
||||||
|
`practice-geometry.json`、正式统计快照)与第四问覆盖计划;
|
||||||
|
逐图来源见 `manifest.json`。图注为中文,并注明数据取自演练局还是正式测试。
|
||||||
|
|
||||||
|
## 约定
|
||||||
|
|
||||||
|
- 默认配色与字体沿用 matplotlib 默认样式,不引入自定义调色板;
|
||||||
|
- 图内不放标题与解释性文字,只保留坐标轴、图例与必要的元素标注,含义由图注承担;
|
||||||
|
- 图例置于坐标区外,散点与角度标注按位置自动避让,保证互不重叠;
|
||||||
|
- 输出 PNG(300 dpi、白底)。
|
||||||
|
|
||||||
|
## 图清单
|
||||||
|
|
||||||
|
| 文件 | 内容 | 数据来源 | 论文位置 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| `framework-decision-loop.png` | 观测—候选集—任务—动作的闭环决策过程 | 论文问题分析的结构 | 图 1 |
|
||||||
|
| `steps-state-machine.png` | 会话状态机(未进入 / 倒计时 / 接口开放 / 关闭) | `src/mcm26b/protocol/client.py` | 图 2 |
|
||||||
|
| `timing-attachment-example-105-111-194-199.png` | 附件计时示例:逐动作耗时构成与单步合计 | 题面附件 2 的计时示例 | 图 3 |
|
||||||
|
| `geo-q1-geometry.png` | 问题一三幅几何:角域交会、定位区域放大(直径圆与最小包围圆)、等边三角形反例 | `practice-geometry.json`(演练局观测复算)、`examples/q1/triangle.json` | 图 4 |
|
||||||
|
| `geo-q2-guaranteed-reception-disk.png` | 问题二:截断角域外接圆与安全候选盘,右侧为半径分解 | `src/mcm26b/config.py` | 图 5 |
|
||||||
|
| `geo-q4-minimum-cover-31-points.png` | 问题四:31 点最小命中集分布与定向源读图约定 | `src/mcm26b/guarantee/plans/q4_mincover_v2.json` | 图 6 |
|
||||||
|
| `selfbuilt-q3-search-clear-path.png` | 问题三演练局:全向源搜索与清除路径(含每次检测的位置、结果与示向度射线) | `referee-data/sessions/<问题三主局>/log.jsonl` | 图 7 |
|
||||||
|
| `selfbuilt-q4-search-clear-path.png` | 问题四演练局:混合源路径(含定向源朝向、±90° 可见范围与检测点) | `referee-data/sessions/<问题四主局>/log.jsonl` | 图 8 |
|
||||||
|
| `practice-virtual-time.png` | 44 局演练的总虚拟时间分布与全清局均值 | `practice-results.json` | 图 9 |
|
||||||
|
| `formal-time-bars.png` | 六次正式测试的累计虚拟耗时分解 | `formal-results.csv` | 图 10 |
|
||||||
|
|
||||||
|
论文主局案例编码不写死在脚本里:`plot_paper_figures.py` 读取
|
||||||
|
`docs/paper/data/practice-macros.tex` 中的 `PractQThreeMainCase` /
|
||||||
|
`PractQFourMainCase`,与正文口径同源。
|
||||||
|
|
||||||
|
## 归档与回放
|
||||||
|
|
||||||
|
`examples/replay/` 归档了论文主局的行为日志副本,便于在没有 `referee-data/` 时仍能绘图;
|
||||||
|
`scripts/archive_replay_logs.py` 用于把新的演练局追加归档:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv run python scripts/archive_replay_logs.py --list # 本机有哪些局
|
||||||
|
uv run python scripts/archive_replay_logs.py <案例编码> # 追加归档
|
||||||
|
```
|
||||||
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 277 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 212 KiB |
@@ -0,0 +1,120 @@
|
|||||||
|
{
|
||||||
|
"generator": "scripts/plot_paper_figures.py (matplotlib)",
|
||||||
|
"command": "python scripts/plot_paper_figures.py",
|
||||||
|
"manual": "Matplotlib PNGs are generated directly; the legacy MATLAB scripts are no longer used by the paper.",
|
||||||
|
"figures": [
|
||||||
|
{
|
||||||
|
"stem": "steps-state-machine",
|
||||||
|
"png": "docs/figures/steps-state-machine.png",
|
||||||
|
"matlab": "scripts/matlab/fig_steps_state_machine.m",
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"path": "论文“计时模型与会话状态机”一节",
|
||||||
|
"sha256_12": "27c8f7051b26",
|
||||||
|
"lines": 215
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "src/mcm26b/protocol/client.py",
|
||||||
|
"sha256_12": "0e9797a85cd7",
|
||||||
|
"lines": 333
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stem": "timing-attachment-example-105-111-194-199",
|
||||||
|
"png": "docs/figures/timing-attachment-example-105-111-194-199.png",
|
||||||
|
"matlab": "scripts/matlab/fig_timing_attachment.m",
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"path": "论文“计时模型与会话状态机”一节",
|
||||||
|
"sha256_12": "27c8f7051b26",
|
||||||
|
"lines": 215
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stem": "geo-q2-guaranteed-reception-disk",
|
||||||
|
"png": "docs/figures/geo-q2-guaranteed-reception-disk.png",
|
||||||
|
"matlab": "scripts/matlab/fig_geo_q2_safe_disk.m",
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"path": "src/mcm26b/config.py",
|
||||||
|
"sha256_12": "c513450dc892",
|
||||||
|
"lines": 213
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "论文“问题二”一节",
|
||||||
|
"sha256_12": "24f3e844deb9",
|
||||||
|
"lines": 312
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stem": "geo-q4-minimum-cover-31-points",
|
||||||
|
"png": "docs/figures/geo-q4-minimum-cover-31-points.png",
|
||||||
|
"matlab": "scripts/matlab/fig_geo_q4_mincover.m",
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"path": "src/mcm26b/guarantee/plans/q4_mincover_v2.json",
|
||||||
|
"sha256_12": "71e54616ae21",
|
||||||
|
"lines": 162
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "论文“问题四”一节",
|
||||||
|
"sha256_12": "1774f8bf85db",
|
||||||
|
"lines": 485
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stem": "practice-virtual-time",
|
||||||
|
"png": "docs/figures/practice-virtual-time.png",
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"path": "docs/paper/data/practice-results.json",
|
||||||
|
"note": "自建模拟器 25 局演练复算结果"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stem": "selfbuilt-q3-search-clear-path",
|
||||||
|
"png": "docs/figures/selfbuilt-q3-search-clear-path.png",
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"path": "referee-data/sessions/QS6H-CC29-PDY3-ZA54/log.jsonl",
|
||||||
|
"note": "含真值、检测结果与示向度"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stem": "selfbuilt-q4-search-clear-path",
|
||||||
|
"png": "docs/figures/selfbuilt-q4-search-clear-path.png",
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"path": "referee-data/sessions/SWA3-C3FB-C5QC-FLW7/log.jsonl",
|
||||||
|
"note": "含定向源朝向与遮挡造成的无信号"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stem": "formal-time-bars",
|
||||||
|
"png": "(由 scripts/build_paper_support.py 生成为 LaTeX 图,不是 PNG)",
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"path": "docs/paper/data/formal-results.csv",
|
||||||
|
"note": "六次正式测试的动作计数与总虚拟时间"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stem": "geo-q1-geometry",
|
||||||
|
"png": "docs/figures/geo-q1-geometry.png",
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"path": "docs/paper/data/practice-geometry.json",
|
||||||
|
"note": "演练局 8VRC-ADW4-XDXM-F62L 频道 12 的三次示向度复算结果;(c) 为解析反例"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 439 KiB |
|
After Width: | Height: | Size: 592 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 54 KiB |
@@ -1,65 +1,107 @@
|
|||||||
# 论文(docs/paper)
|
# 论文与支撑材料
|
||||||
|
|
||||||
2026 年高教社杯全国大学生数学建模竞赛 B 题论文 LaTeX 工程,格式依据
|
论文依据赛题、2026 年格式规范及所给往届参考 PDF 编写,四问的模型、推导与结果分析
|
||||||
`issue/论文格式/附件3. 全国大学生数学建模竞赛论文格式规范.pdf`(2026 年修订稿)。
|
均以论文正文与附录为准;本文件只说明论文工程如何重算与编译。
|
||||||
|
版式采用项目原始 `mcm26b-paper.cls`。
|
||||||
|
|
||||||
## 编译
|
## 数据分工(本轮调整的核心约定)
|
||||||
|
|
||||||
需要 TeX Live(含 XeLaTeX 与 ctex)。在本目录执行:
|
| 用途 | 数据来源 | 在论文中的位置 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 机制论证与定量结论 | **自建模拟器**(`referee/`)演练局,本次采集 44 局 | 正文全部表格与插图 |
|
||||||
|
| 最优实现与朴素基线的配对对比 | `project/`(内存回环,四问同口径) | 正文“实验结果与分析” |
|
||||||
|
| 最终效果验证 | **官方模拟器**六份正式导出包,无可读真值 | 附录 A 及附录 C 数据清单 |
|
||||||
|
|
||||||
```bash
|
正文数字与插图全部由脚本从日志复算生成,不手抄:`scripts/build_practice_data.py` 复算演练局,
|
||||||
latexmk -xelatex -outdir=build main.tex
|
`scripts/plot_paper_figures.py` 据同一份数据绘图;复算累计虚拟时间与评测机日志记录的最大偏差为 0.000000 s。
|
||||||
# 或
|
|
||||||
xelatex main.tex && xelatex main.tex
|
|
||||||
```
|
|
||||||
|
|
||||||
输出 PDF:`build/main.pdf`(用第二种方式则为 `main.pdf`)。
|
演练局可重新采集(固定种子、可重放;队号运行期传入):
|
||||||
|
|
||||||
## 目录结构
|
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/<案例编码>/`。判定标准为
|
||||||
| `main.tex` | 论文源文件(摘要、正文、附录及源码引用) |
|
`清完全部源 ∧ 无缺席误判 ∧ 主动退出 ∧ 零异常 ∧ 零失败清除`:
|
||||||
| `mcm26b-paper.cls` | 论文版式模板(宏包、字体、标题、代码排版与通用命令) |
|
只看“是否清完”会放过“清完了但中途大量 /clear 打空”的无效局,
|
||||||
| `fonts/` | 从本机提取的中文字体(宋体 SC 常规/加粗、黑体 SC Light/Medium)与 Times New Roman 四体,约 150 MB,编译自包含 |
|
这类局的总虚拟时间被无效试探撑大,故不纳入统计。
|
||||||
| `figures/` | 插图目录 |
|
被排除的局保留在 `referee-data/rejected-sessions/`;
|
||||||
| `build/` | 编译产物(已 gitignore) |
|
`build_practice_data.py` 按案例编码白名单只统计论文声明的批次。
|
||||||
|
|
||||||
VS Code 工作区已在 `.vscode/settings.json` 中将 LaTeX Workshop 的默认配方设为
|
## 交付文件
|
||||||
`xelatex`;也提供 `latexmk (xelatex)` 配方用于自动处理交叉引用。
|
|
||||||
|
|
||||||
## 规范要点与工程实现
|
- main.pdf:论文、演练局数据清单、正式数据清单与四问核心函数代码附录。
|
||||||
|
- main.tex、sections/:可编辑 LaTeX 源文件。
|
||||||
|
- data/practice-results.json、practice-results.csv:44 局演练局的结构化复算结果。
|
||||||
|
- data/formal-results.json、formal-results.csv、audit.md:六份正式测试数据、复算结果与校验说明。
|
||||||
|
- support-materials.zip:源码、自建模拟器、演练局与正式日志、统计快照、论文工程及逐文件哈希清单。
|
||||||
|
- REWRITE_NOTES.md:本次修订及验证说明。
|
||||||
|
|
||||||
- A4、四边距 2.5cm:`geometry` 宏包。
|
## 正文数据
|
||||||
- 页码从摘要专用页起、页脚中部、从 1 连续编号:摘要页 `\setcounter{page}{1}`。
|
|
||||||
- 正文不要目录、不超过 30 页:未生成目录,正文当前远少于 30 页。
|
|
||||||
- **电子版第一页必须是摘要专用页**(不含承诺书与编号专用页):默认
|
|
||||||
不启用 `paper` class option。打印纸质版时将 `main.tex` 的
|
|
||||||
`\documentclass[zihao=-4,a4paper]{mcm26b-paper}` 改为
|
|
||||||
`\documentclass[zihao=-4,a4paper,paper]{mcm26b-paper}`,自动加入承诺书与编号专用页
|
|
||||||
(占位文字,须替换为组委会当年发布的专用页原文)。
|
|
||||||
- 摘要页含标题与关键词,不超过一页,无需英文。
|
|
||||||
- 摘要页、正文、附录中不得出现姓名、学校、赛区等信息。
|
|
||||||
- 附录含支撑材料文件列表与完整源码:源码以 `\lstinputlisting` 引用仓库内
|
|
||||||
`src/mcm26b/geometry/` 等模块(相对路径 `../../`),提交前须确认与支撑材料
|
|
||||||
压缩包一致。
|
|
||||||
|
|
||||||
## 待办(正文中红色【待填/待补】标记)
|
演练局问题三 15 局、问题四 29 局,源数覆盖 10 至 16,问题四定向源覆盖 3/6/8 个;
|
||||||
|
**44 局全部清完全部源且失败清除为零**,累计清除 557 个源。
|
||||||
|
问题三平均总虚拟时间 3261.579 s,问题四 8401.445 s,移动时间占比 78.1% 与 75.8%。
|
||||||
|
|
||||||
- 问题 3、4 演练统计值与正式测试结果(表 1 两张表)。
|
正式测试六次累计清除 75 个源,清除失败为零;仅用于附录中的效率与结论验证。
|
||||||
- 问题 1 定位区域图、问题 2 候选区域示意图与选点对比实验。
|
|
||||||
- 支撑材料文件列表更新;定稿前删除全部红色批注(`\todonote`)。
|
|
||||||
|
|
||||||
## 字体说明
|
## 重算与编译
|
||||||
|
|
||||||
`fonts/` 下中文 字体自 macOS 系统字体(Songti.ttc、STHeiti)提取简体字面而来,
|
在项目根目录执行:
|
||||||
授权仅限本队参赛使用。若在 Windows/Overleaf 编译,可改用系统自带中易宋体/黑体,
|
|
||||||
将导言区字体设置替换为:
|
|
||||||
|
|
||||||
```latex
|
python scripts/run_practice_episodes.py --problem 3 --seeds 300-314 # 需要时重采演练局
|
||||||
\setCJKmainfont{SimSun}
|
python scripts/build_practice_data.py # 演练局复算,生成正文数据、表格与宏
|
||||||
\setCJKsansfont{SimHei}
|
python scripts/plot_paper_figures.py # 生成正文全部插图
|
||||||
\setmainfont{Times New Roman}
|
python scripts/audit_paper_formal.py --snapshot docs/paper/data/formal-results.json
|
||||||
```
|
python scripts/build_paper_support.py # 附录正式数据表与支撑包
|
||||||
|
|
||||||
若仓库体积敏感,可将 `fonts/` 加入 `.gitignore`(此时每位队员需自备字体)。
|
`audit_paper_formal.py` 的第一种调用需要原电脑的官方统计队列;
|
||||||
|
快照模式重算统计并校验现有正式包的哈希,来源匹配仍需官方统计队列。
|
||||||
|
|
||||||
|
进入 docs/paper 执行:
|
||||||
|
|
||||||
|
latexmk -xelatex -interaction=nonstopmode -halt-on-error main.tex # 产物 main.pdf
|
||||||
|
latexmk -xelatex -interaction=nonstopmode -halt-on-error -outdir=build main.tex # 产物 build/main.pdf
|
||||||
|
|
||||||
|
两条口令都完成交叉引用所需的多遍编译,输出均为 57 页。
|
||||||
|
需要 TeX Live 的 XeLaTeX、ctex、TikZ。
|
||||||
|
|
||||||
|
字体放在 `docs/paper/fonts/`(HeitiSC / SongtiSC / Times New Roman,约 150 MB),
|
||||||
|
该目录**已在 `.gitignore` 中排除、不入库**,`mcm26b-paper.cls` 通过 `Path = fonts/` 引用。
|
||||||
|
若克隆后缺少该目录,按 `mcm26b-paper.cls` 中的「若未携带 fonts/ 目录」注释把那几行
|
||||||
|
`\setCJKmainfont` / `\setmainfont` 换成系统字体即可照常编译。
|
||||||
|
|
||||||
|
### VS Code(LaTeX Workshop)
|
||||||
|
|
||||||
|
仓库根的 `.vscode/settings.json` 已把默认配方设为
|
||||||
|
**`latexmk (xelatex, outdir=build)`**,即上面的第二条口令;
|
||||||
|
另有 `latexmk (xelatex, paper)`(就地产出 `main.pdf`)与
|
||||||
|
`xelatex (单遍,调试用)` 两个配方可手动切换。
|
||||||
|
|
||||||
|
默认配方写 `build/` 而不是就地写 `docs/paper/main.pdf`,原因是 Windows 下
|
||||||
|
PDF 预览会锁住已打开的 `main.pdf`,此时 `xdvipdfmx` 报 `gave an error` 且不产出 PDF,
|
||||||
|
表现为“保存后编译没反应”。写到 `build/` 后预览读的是 `docs/paper/build/main.pdf`,
|
||||||
|
与源码目录互不抢占,`latex-workshop.latex.autoBuild.run: onSave` 才能稳定工作。
|
||||||
|
若确需就地产出,切换配方后请先关闭 PDF 预览。
|
||||||
|
|
||||||
|
> `data/*.tex` 一律使用 LF 换行。CRLF 会让 `\input` 进表格的数据行在 TeX 缓冲中提前 `\par` 化,
|
||||||
|
> 触发 booktabs 的 “Misplaced \noalign”;表格因此整表生成,正文只 `\input` 完整 table 环境。
|
||||||
|
|
||||||
|
生成附录核心函数清单(数据源为单文件核心代码 ipynb,需先更新该 ipynb):
|
||||||
|
|
||||||
|
python scripts/build_code_appendix.py
|
||||||
|
|
||||||
|
在项目根目录生成支撑包(需要原电脑的 Jammers-simulator-full 正式包):
|
||||||
|
|
||||||
|
python scripts/build_paper_support.py --package
|
||||||
|
|
||||||
|
## 排版与复算
|
||||||
|
|
||||||
|
正文采用原模板的字体、标题、页边距及页码设置,图解与表题统一使用中文。
|
||||||
|
附录代码直接取自单文件核心代码 ipynb,数学符号由导言区的 lstlisting 样式 corecode 映射。
|
||||||
|
正文使用集合估计、凸外包、清除充分条件、网格幸存集滤波、信息增益、前向半盘最小命中集、
|
||||||
|
位置与朝向联合信念和最近邻路径排序等概念描述模型。
|
||||||
|
附录只收录四问主线的核心函数(32 个,约 1300 行),评测机、命令行外壳、采集与绘图脚本、
|
||||||
|
测试以及未被采用的方案不进入论文;完整可执行程序见支撑包的 mcm26b-核心代码.ipynb。
|
||||||
|
|||||||
@@ -0,0 +1,254 @@
|
|||||||
|
# 本次修订与验证
|
||||||
|
|
||||||
|
## 目录清理、去敏与文档合并(本轮)
|
||||||
|
|
||||||
|
### 身份信息去敏(队号改为运行期参数)
|
||||||
|
|
||||||
|
队号属身份信息,不再出现在代码、测试、示例与文档中:
|
||||||
|
|
||||||
|
- `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 样式里统一映射。
|
||||||
|
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
# 正式测试数据核对
|
||||||
|
|
||||||
|
本次汇总 `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` 表示主动退出。
|
||||||
|
实验评价采用清除数量、逐案例平均定位清除时间、程序运行时间和动作耗时分解。
|
||||||
|
扩展评价所需的源总数与配对场景设计见论文未来工作。
|
||||||
@@ -0,0 +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\% \\
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
% Generated by scripts/build_paper_support.py; 本文件是完整 table 环境,供附录直接 \input。
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering\small
|
||||||
|
\caption{六次正式测试的动作计数与移动耗时}
|
||||||
|
\setlength{\tabcolsep}{4.5pt}
|
||||||
|
\begin{tabular}{lrrrrrr}
|
||||||
|
\toprule
|
||||||
|
案例 & 检测数 & 换频数 & 失败清除 & 总虚拟时间/s & 移动时间/s & 移动占比\\
|
||||||
|
\midrule
|
||||||
|
Q3-1 & 105 & 96 & 0 & 3094.978 & 2408.978 & 77.8\% \\
|
||||||
|
Q3-2 & 117 & 108 & 0 & 3493.335 & 2725.335 & 78.0\% \\
|
||||||
|
Q3-3 & 117 & 107 & 0 & 2906.863 & 2164.863 & 74.5\% \\
|
||||||
|
Q4-1 & 349 & 275 & 0 & 9362.226 & 7277.226 & 77.7\% \\
|
||||||
|
Q4-2 & 361 & 315 & 0 & 9271.302 & 7101.302 & 76.6\% \\
|
||||||
|
Q4-3 & 264 & 213 & 0 & 8608.382 & 7005.382 & 81.4\% \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\label{tab:formalcost}
|
||||||
|
\end{table}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
\begin{longtable}{p{1.15cm}p{13.3cm}}
|
||||||
|
\caption{所选正式导出文件与完整包哈希}\label{tab:packages}\\
|
||||||
|
\toprule 案例 & 原始文件名及 SHA-256\\\midrule\endfirsthead
|
||||||
|
\toprule 案例 & 原始文件名与 SHA-256\\\midrule\endhead
|
||||||
|
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}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
\newcommand{\QThreeCount}{38}
|
||||||
|
\newcommand{\QThreeTotal}{9495.176084}
|
||||||
|
\newcommand{\QThreeWeighted}{249.873}
|
||||||
|
\newcommand{\QThreeMean}{253.884}
|
||||||
|
\newcommand{\QThreeProgramTotal}{11.300}
|
||||||
|
\newcommand{\QFourCount}{37}
|
||||||
|
\newcommand{\QFourTotal}{27241.909918}
|
||||||
|
\newcommand{\QFourWeighted}{736.268}
|
||||||
|
\newcommand{\QFourMean}{754.062}
|
||||||
|
\newcommand{\QFourProgramTotal}{19.443}
|
||||||
|
\newcommand{\FormalClearCount}{75}
|
||||||
|
\newcommand{\FormalMovementMin}{74.47}
|
||||||
|
\newcommand{\FormalMovementMax}{81.38}
|
||||||
|
\newcommand{\FormalRunMin}{2.680}
|
||||||
|
\newcommand{\FormalRunMax}{7.668}
|
||||||
|
\newcommand{\FormalVirtualTotal}{36737.086002}
|
||||||
@@ -0,0 +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 & \texttt{UVUZ-B4MQ-XSUV-HQFP} & 10 & 290.686 & 2.680 \\
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
% Generated by scripts/build_paper_support.py; 本文件是完整 table 环境,供附录直接 \input。
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering\small
|
||||||
|
\caption{问题三正式测试结果(时间单位:s)}
|
||||||
|
\setlength{\tabcolsep}{4pt}
|
||||||
|
\begin{tabularx}{\linewidth}{l X r r r}
|
||||||
|
\toprule
|
||||||
|
测试 & 测试案例编码 & 清除数 & 总虚拟时间/s & 程序运行时间/s\\
|
||||||
|
\midrule
|
||||||
|
测试 1 & \texttt{9HU7-UWJR-BPTR-VYAT} & 13 & 3094.978 & 5.596 \\
|
||||||
|
测试 2 & \texttt{7TCG-C9EC-53VF-HZ5H} & 15 & 3493.335 & 3.024 \\
|
||||||
|
测试 3 & \texttt{UVUZ-B4MQ-XSUV-HQFP} & 10 & 2906.863 & 2.680 \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabularx}
|
||||||
|
\label{tab:formal3}
|
||||||
|
\end{table}
|
||||||
@@ -0,0 +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 & \texttt{K58B-V5VC-E4EF-CRTW} & 14 & 614.884 & 6.051 \\
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
% Generated by scripts/build_paper_support.py; 本文件是完整 table 环境,供附录直接 \input。
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering\small
|
||||||
|
\caption{问题四正式测试结果(时间单位:s)}
|
||||||
|
\setlength{\tabcolsep}{4pt}
|
||||||
|
\begin{tabularx}{\linewidth}{l X r r r}
|
||||||
|
\toprule
|
||||||
|
测试 & 测试案例编码 & 清除数 & 总虚拟时间/s & 程序运行时间/s\\
|
||||||
|
\midrule
|
||||||
|
测试 1 & \texttt{VQUM-ETQ5-74PP-ZQ3J} & 13 & 9362.226 & 7.668 \\
|
||||||
|
测试 2 & \texttt{5K5T-TRWZ-BPR2-ECAV} & 10 & 9271.302 & 5.724 \\
|
||||||
|
测试 3 & \texttt{K58B-V5VC-E4EF-CRTW} & 14 & 8608.382 & 6.051 \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabularx}
|
||||||
|
\label{tab:formal4}
|
||||||
|
\end{table}
|
||||||
@@ -0,0 +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,,
|
||||||
|
@@ -0,0 +1,228 @@
|
|||||||
|
{
|
||||||
|
"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": [
|
||||||
|
"Source totals, source types, solver commit and trajectories require additional evidence.",
|
||||||
|
"Queue state confirmed records a statistics submission acknowledgement."
|
||||||
|
],
|
||||||
|
"records": [
|
||||||
|
{
|
||||||
|
"problem_no": 3,
|
||||||
|
"formal_index": 1,
|
||||||
|
"case_code": "9HU7-UWJR-BPTR-VYAT",
|
||||||
|
"client_version": "1.1.0",
|
||||||
|
"entered": 1,
|
||||||
|
"end_reason": "user_exit",
|
||||||
|
"cleared_jammer_count": 13,
|
||||||
|
"measure_accepted_count": 105,
|
||||||
|
"virtual_time_us": 3094978068,
|
||||||
|
"program_run_duration_ms": 5596,
|
||||||
|
"channel_switch_count": 96,
|
||||||
|
"clear_failure_count": 0,
|
||||||
|
"state": "confirmed",
|
||||||
|
"file": "test/q3/formal-p3-1-9HU7-UWJR-BPTR-VYAT.jlog",
|
||||||
|
"size_bytes": 106656,
|
||||||
|
"package_sha256": "fbd7ab92f78a019887f603172ab6a39e274adb1f917fc2681f1e8073ff47d911",
|
||||||
|
"activation_ticket_sha256": "41563c714553abf202fc0012fcde2503c64c6cec27a84c7229c487602b957516",
|
||||||
|
"created_at_utc": "2026-09-12T07:16:06.377Z",
|
||||||
|
"ended_at_utc": "2026-09-12T07:16:06.373Z",
|
||||||
|
"content_encryption": "aes-256-gcm-chunked",
|
||||||
|
"identity_and_ticket_content_omitted": true,
|
||||||
|
"same_as_official_original": true,
|
||||||
|
"derived": {
|
||||||
|
"virtual_time_s": "3094.978068",
|
||||||
|
"average_clear_time_s": "238.075236",
|
||||||
|
"program_run_duration_s": "5.596",
|
||||||
|
"inferred_movement_time_s": "2408.978068",
|
||||||
|
"inferred_distance_m": "12044.890340",
|
||||||
|
"movement_share_percent": "77.835061",
|
||||||
|
"source_total": null,
|
||||||
|
"clear_fraction": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"problem_no": 3,
|
||||||
|
"formal_index": 2,
|
||||||
|
"case_code": "7TCG-C9EC-53VF-HZ5H",
|
||||||
|
"client_version": "1.1.0",
|
||||||
|
"entered": 1,
|
||||||
|
"end_reason": "user_exit",
|
||||||
|
"cleared_jammer_count": 15,
|
||||||
|
"measure_accepted_count": 117,
|
||||||
|
"virtual_time_us": 3493335140,
|
||||||
|
"program_run_duration_ms": 3024,
|
||||||
|
"channel_switch_count": 108,
|
||||||
|
"clear_failure_count": 0,
|
||||||
|
"state": "confirmed",
|
||||||
|
"file": "test/q3/formal-p3-2-7TCG-C9EC-53VF-HZ5H.jlog",
|
||||||
|
"size_bytes": 106326,
|
||||||
|
"package_sha256": "5d83ce87455ce22fadbcbddb60814d9b1f0be54de7bc9d0463777ba47b3922ef",
|
||||||
|
"activation_ticket_sha256": "5f6d5ff4a369418f9f683ef0384398190bfb0b81bc71ce1c1bd6f728ff1fdf41",
|
||||||
|
"created_at_utc": "2026-09-12T07:47:20.065Z",
|
||||||
|
"ended_at_utc": "2026-09-12T07:47:20.061Z",
|
||||||
|
"content_encryption": "aes-256-gcm-chunked",
|
||||||
|
"identity_and_ticket_content_omitted": true,
|
||||||
|
"same_as_official_original": true,
|
||||||
|
"derived": {
|
||||||
|
"virtual_time_s": "3493.33514",
|
||||||
|
"average_clear_time_s": "232.889009",
|
||||||
|
"program_run_duration_s": "3.024",
|
||||||
|
"inferred_movement_time_s": "2725.33514",
|
||||||
|
"inferred_distance_m": "13626.67570",
|
||||||
|
"movement_share_percent": "78.015279",
|
||||||
|
"source_total": null,
|
||||||
|
"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,
|
||||||
|
"case_code": "VQUM-ETQ5-74PP-ZQ3J",
|
||||||
|
"client_version": "1.1.0",
|
||||||
|
"entered": 1,
|
||||||
|
"end_reason": "user_exit",
|
||||||
|
"cleared_jammer_count": 13,
|
||||||
|
"measure_accepted_count": 349,
|
||||||
|
"virtual_time_us": 9362225736,
|
||||||
|
"program_run_duration_ms": 7668,
|
||||||
|
"channel_switch_count": 275,
|
||||||
|
"clear_failure_count": 0,
|
||||||
|
"state": "confirmed",
|
||||||
|
"file": "test/q4/formal-p4-1-VQUM-ETQ5-74PP-ZQ3J.jlog",
|
||||||
|
"size_bytes": 150315,
|
||||||
|
"package_sha256": "9a102295d324b5fb5aeed1c6036d13ae7e08a7d7fddb60ceb8dead24e62b15d3",
|
||||||
|
"activation_ticket_sha256": "d02cfdf2eed65dbe3bb4c7768a263f8bf57b56bc323b6453c1dfa2aec6e24810",
|
||||||
|
"created_at_utc": "2026-09-12T07:38:51.368Z",
|
||||||
|
"ended_at_utc": "2026-09-12T07:38:51.365Z",
|
||||||
|
"content_encryption": "aes-256-gcm-chunked",
|
||||||
|
"identity_and_ticket_content_omitted": true,
|
||||||
|
"same_as_official_original": true,
|
||||||
|
"derived": {
|
||||||
|
"virtual_time_s": "9362.225736",
|
||||||
|
"average_clear_time_s": "720.171210",
|
||||||
|
"program_run_duration_s": "7.668",
|
||||||
|
"inferred_movement_time_s": "7277.225736",
|
||||||
|
"inferred_distance_m": "36386.128680",
|
||||||
|
"movement_share_percent": "77.729655",
|
||||||
|
"source_total": null,
|
||||||
|
"clear_fraction": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"problem_no": 4,
|
||||||
|
"formal_index": 2,
|
||||||
|
"case_code": "5K5T-TRWZ-BPR2-ECAV",
|
||||||
|
"client_version": "1.1.0",
|
||||||
|
"entered": 1,
|
||||||
|
"end_reason": "user_exit",
|
||||||
|
"cleared_jammer_count": 10,
|
||||||
|
"measure_accepted_count": 361,
|
||||||
|
"virtual_time_us": 9271302080,
|
||||||
|
"program_run_duration_ms": 5724,
|
||||||
|
"channel_switch_count": 315,
|
||||||
|
"clear_failure_count": 0,
|
||||||
|
"state": "confirmed",
|
||||||
|
"file": "test/q4/formal-p4-2-5K5T-TRWZ-BPR2-ECAV.jlog",
|
||||||
|
"size_bytes": 151668,
|
||||||
|
"package_sha256": "370aac9c2c5d324dd382e57e541ef0da7c5dd4759660d9ea0cba8373ce0ea9a1",
|
||||||
|
"activation_ticket_sha256": "4918e4ca6a77367dd06cd40afb28d4415246ef0437c68c052bddf613f4f914b0",
|
||||||
|
"created_at_utc": "2026-09-12T07:42:29.854Z",
|
||||||
|
"ended_at_utc": "2026-09-12T07:42:29.851Z",
|
||||||
|
"content_encryption": "aes-256-gcm-chunked",
|
||||||
|
"identity_and_ticket_content_omitted": true,
|
||||||
|
"same_as_official_original": true,
|
||||||
|
"derived": {
|
||||||
|
"virtual_time_s": "9271.30208",
|
||||||
|
"average_clear_time_s": "927.130208",
|
||||||
|
"program_run_duration_s": "5.724",
|
||||||
|
"inferred_movement_time_s": "7101.30208",
|
||||||
|
"inferred_distance_m": "35506.51040",
|
||||||
|
"movement_share_percent": "76.594442",
|
||||||
|
"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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
% Generated by scripts/build_practice_data.py; 自建模拟器演练局复算结果。 本文件是完整 table 环境,供正文直接 \input。
|
||||||
|
\begin{table}[H]
|
||||||
|
\centering\footnotesize
|
||||||
|
\caption{全部演练局的逐局复算结果(“全清”列为是否达到该局源数且无失败清除)}
|
||||||
|
\setlength{\tabcolsep}{2pt}
|
||||||
|
\begin{tabular}{lrrrrrrrrl}
|
||||||
|
\toprule
|
||||||
|
案例编码 & 问题 & 源数 & 清除数 & 失败清除 & 总虚拟时间/s & 检测数 & 换频数 & 移动/km & 全清\\
|
||||||
|
\midrule
|
||||||
|
\texttt{6LST-ZFVS-2HHW-TQQ4} & 3 & 13 & 13 & 0 & 2794.212 & 109 & 99 & 10.426 & 是 \\
|
||||||
|
\texttt{6V2P-HJCS-GJ9A-83MA} & 3 & 16 & 16 & 0 & 3174.578 & 103 & 88 & 12.458 & 是 \\
|
||||||
|
\texttt{7ZXN-N53X-HAXQ-EGY4} & 3 & 10 & 10 & 0 & 3228.653 & 119 & 105 & 12.393 & 是 \\
|
||||||
|
\texttt{8VRC-ADW4-XDXM-F62L} & 3 & 13 & 13 & 0 & 3407.039 & 102 & 93 & 13.695 & 是 \\
|
||||||
|
\texttt{ARBP-6XFZ-5YJU-STC8} & 3 & 16 & 16 & 0 & 3867.872 & 116 & 105 & 15.514 & 是 \\
|
||||||
|
\texttt{E27E-M8WQ-LDT5-2XDA} & 3 & 16 & 16 & 0 & 3531.065 & 104 & 89 & 14.210 & 是 \\
|
||||||
|
\texttt{HGBA-XGH9-UNZJ-7YQ3} & 3 & 10 & 10 & 0 & 3340.025 & 123 & 113 & 12.810 & 是 \\
|
||||||
|
\texttt{JW47-AVPH-XGHH-RLLV} & 3 & 13 & 13 & 0 & 3389.152 & 106 & 93 & 13.506 & 是 \\
|
||||||
|
\texttt{LZDX-68DJ-XM4P-A6XL} & 3 & 10 & 10 & 0 & 2954.390 & 117 & 105 & 11.072 & 是 \\
|
||||||
|
\texttt{MT3R-68KH-CNY5-6X73} & 3 & 13 & 13 & 0 & 3527.713 & 112 & 94 & 14.044 & 是 \\
|
||||||
|
\texttt{MULB-4YTU-VQYG-YAS6} & 3 & 10 & 10 & 0 & 3064.020 & 129 & 119 & 11.250 & 是 \\
|
||||||
|
\texttt{NMRC-85ZV-3FFE-GBXY} & 3 & 13 & 13 & 0 & 2860.706 & 101 & 96 & 10.974 & 是 \\
|
||||||
|
\texttt{QS6H-CC29-PDY3-ZA54} & 3 & 16 & 16 & 0 & 2987.385 & 85 & 74 & 12.042 & 是 \\
|
||||||
|
\texttt{R2N7-QMLC-26QX-RXYT} & 3 & 16 & 16 & 0 & 3556.397 & 106 & 95 & 14.257 & 是 \\
|
||||||
|
\texttt{VE37-SRPD-NCFR-4EQF} & 3 & 10 & 10 & 0 & 3240.474 & 124 & 115 & 12.277 & 是 \\
|
||||||
|
\texttt{2M5J-QWHS-BYGB-MPYF} & 4 & 13 & 13 & 0 & 9191.437 & 343 & 296 & 35.577 & 是 \\
|
||||||
|
\texttt{2Y25-4LD6-5A4P-64CV} & 4 & 16 & 16 & 0 & 6685.802 & 226 & 182 & 26.469 & 是 \\
|
||||||
|
\texttt{3XM4-65TW-CH39-XWTZ} & 4 & 16 & 16 & 0 & 7327.981 & 211 & 160 & 30.165 & 是 \\
|
||||||
|
\texttt{6LEP-YVQ6-AYP5-N359} & 4 & 16 & 16 & 0 & 7982.569 & 280 & 222 & 31.403 & 是 \\
|
||||||
|
\texttt{6US3-A76N-KC8B-DMFM} & 4 & 10 & 10 & 0 & 8171.259 & 371 & 331 & 29.676 & 是 \\
|
||||||
|
\texttt{7HG2-UEBM-K3D2-LZWT} & 4 & 10 & 10 & 0 & 8146.581 & 377 & 333 & 29.393 & 是 \\
|
||||||
|
\texttt{96M4-SK2V-PDWN-YGHB} & 4 & 13 & 13 & 0 & 9593.184 & 364 & 311 & 36.986 & 是 \\
|
||||||
|
\texttt{A5YU-4SM6-4PK7-M5H8} & 4 & 10 & 10 & 0 & 9854.818 & 382 & 327 & 37.839 & 是 \\
|
||||||
|
\texttt{B8HR-3HJH-2UYH-YDVB} & 4 & 13 & 13 & 0 & 8840.642 & 371 & 306 & 33.073 & 是 \\
|
||||||
|
\texttt{CEL3-XQV8-M7KY-3CSW} & 4 & 16 & 16 & 0 & 5806.596 & 184 & 144 & 23.313 & 是 \\
|
||||||
|
\texttt{DX2D-KDF9-BGYU-XPMG} & 4 & 13 & 13 & 0 & 8642.081 & 314 & 265 & 33.710 & 是 \\
|
||||||
|
\texttt{GSG4-6HTJ-AH5L-ZYGM} & 4 & 10 & 10 & 0 & 9488.522 & 438 & 379 & 34.348 & 是 \\
|
||||||
|
\texttt{JDAY-2SU7-RTSJ-NQFR} & 4 & 13 & 13 & 0 & 9813.925 & 351 & 283 & 38.555 & 是 \\
|
||||||
|
\texttt{JH76-MEWS-BR6Q-BQ6S} & 4 & 13 & 13 & 0 & 8732.841 & 336 & 287 & 33.504 & 是 \\
|
||||||
|
\texttt{JY84-364B-45UL-AFBK} & 4 & 10 & 10 & 0 & 8704.597 & 436 & 392 & 30.413 & 是 \\
|
||||||
|
\texttt{QDDJ-S89Y-7TKY-E6VJ} & 4 & 16 & 16 & 0 & 7316.173 & 221 & 169 & 29.811 & 是 \\
|
||||||
|
\texttt{QL6B-KEUW-DJR2-P84B} & 4 & 16 & 16 & 0 & 5229.931 & 184 & 144 & 20.430 & 是 \\
|
||||||
|
\texttt{QXVN-L63H-6WLX-KLEJ} & 4 & 10 & 10 & 0 & 9307.231 & 399 & 351 & 34.556 & 是 \\
|
||||||
|
\texttt{R2E7-LF5E-J5K6-BSVQ} & 4 & 13 & 13 & 0 & 9809.921 & 340 & 283 & 38.810 & 是 \\
|
||||||
|
\texttt{RLK4-E82Q-UHT6-2M9M} & 4 & 10 & 10 & 0 & 8342.135 & 374 & 328 & 30.471 & 是 \\
|
||||||
|
\texttt{SE9X-67GA-6YC6-QB7B} & 4 & 10 & 10 & 0 & 9241.603 & 406 & 359 & 34.013 & 是 \\
|
||||||
|
\texttt{SWA3-C3FB-C5QC-FLW7} & 4 & 16 & 16 & 0 & 4780.432 & 159 & 108 & 18.987 & 是 \\
|
||||||
|
\texttt{T5ZL-5GEP-FDCK-3P8T} & 4 & 13 & 13 & 0 & 8719.661 & 344 & 285 & 33.248 & 是 \\
|
||||||
|
\texttt{TKCY-2VT2-WYUX-2JXU} & 4 & 10 & 10 & 0 & 8260.712 & 385 & 342 & 29.719 & 是 \\
|
||||||
|
\texttt{US79-DFNV-UQVW-NPLL} & 4 & 10 & 10 & 0 & 8795.904 & 408 & 358 & 31.740 & 是 \\
|
||||||
|
\texttt{VJ68-ADZ6-STFT-LHYT} & 4 & 13 & 13 & 0 & 8783.099 & 369 & 312 & 32.805 & 是 \\
|
||||||
|
\texttt{X3Y4-S9D2-XWR9-V6CZ} & 4 & 13 & 13 & 0 & 10160.134 & 365 & 304 & 39.831 & 是 \\
|
||||||
|
\texttt{XN57-MHFY-V58F-XCMY} & 4 & 10 & 10 & 0 & 9188.211 & 438 & 397 & 32.756 & 是 \\
|
||||||
|
\texttt{ZLKB-GVZT-NQDE-CU5F} & 4 & 10 & 10 & 0 & 8723.919 & 395 & 343 & 31.780 & 是 \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\label{tab:practiceall}
|
||||||
|
\end{table}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
% Generated by scripts/build_practice_data.py; 自建模拟器演练局复算结果。 本文件是完整 table 环境,供正文直接 \input。
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering\small
|
||||||
|
\caption{演练全清局的动作耗时分解,括号内为占总虚拟时间的比例}
|
||||||
|
\setlength{\tabcolsep}{3pt}
|
||||||
|
\begin{tabular}{lrrrrr}
|
||||||
|
\toprule
|
||||||
|
问题 & 局数 & 移动/s(占比) & 检测/s(占比) & 换频/s(占比) & 清除/s(占比)\\
|
||||||
|
\midrule
|
||||||
|
问题三(全向源) & 15 & 38185.679(78.1\%) & 8280.000(16.9\%) & 1483.000(3.0\%) & 975.000(2.0\%) \\
|
||||||
|
问题四(混合源) & 29 & 184675.902(75.8\%) & 48855.000(20.1\%) & 8301.000(3.4\%) & 1810.000(0.7\%) \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\label{tab:cost}
|
||||||
|
\end{table}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
% Generated by scripts/build_practice_data.py; 自建模拟器演练局复算结果。 本文件是完整 table 环境,供正文直接 \input。
|
||||||
|
\begin{table}[H]
|
||||||
|
\centering\footnotesize
|
||||||
|
\caption{演练局逐局动作耗时分解(时间单位:s)}
|
||||||
|
\setlength{\tabcolsep}{2pt}
|
||||||
|
\begin{tabular}{lrrrrrrrrr}
|
||||||
|
\toprule
|
||||||
|
编号 & 总虚拟时间 & 移动 & 占比 & 检测 & 占比 & 换频 & 占比 & 清除 & 占比\\
|
||||||
|
\midrule
|
||||||
|
Q3-1 & 2794.212 & 2085.212 & 74.6\% & 545.000 & 19.5\% & 99.000 & 3.5\% & 65.000 & 2.3\% \\
|
||||||
|
Q3-2 & 3174.578 & 2491.578 & 78.5\% & 515.000 & 16.2\% & 88.000 & 2.8\% & 80.000 & 2.5\% \\
|
||||||
|
Q3-3 & 3228.653 & 2478.653 & 76.8\% & 595.000 & 18.4\% & 105.000 & 3.3\% & 50.000 & 1.5\% \\
|
||||||
|
Q3-4 & 3407.039 & 2739.039 & 80.4\% & 510.000 & 15.0\% & 93.000 & 2.7\% & 65.000 & 1.9\% \\
|
||||||
|
Q3-5 & 3867.872 & 3102.872 & 80.2\% & 580.000 & 15.0\% & 105.000 & 2.7\% & 80.000 & 2.1\% \\
|
||||||
|
Q3-6 & 3531.065 & 2842.065 & 80.5\% & 520.000 & 14.7\% & 89.000 & 2.5\% & 80.000 & 2.3\% \\
|
||||||
|
Q3-7 & 3340.025 & 2562.025 & 76.7\% & 615.000 & 18.4\% & 113.000 & 3.4\% & 50.000 & 1.5\% \\
|
||||||
|
Q3-8 & 3389.152 & 2701.152 & 79.7\% & 530.000 & 15.6\% & 93.000 & 2.7\% & 65.000 & 1.9\% \\
|
||||||
|
Q3-9 & 2954.390 & 2214.390 & 75.0\% & 585.000 & 19.8\% & 105.000 & 3.6\% & 50.000 & 1.7\% \\
|
||||||
|
Q3-10 & 3527.713 & 2808.713 & 79.6\% & 560.000 & 15.9\% & 94.000 & 2.7\% & 65.000 & 1.8\% \\
|
||||||
|
Q3-11 & 3064.020 & 2250.020 & 73.4\% & 645.000 & 21.1\% & 119.000 & 3.9\% & 50.000 & 1.6\% \\
|
||||||
|
Q3-12 & 2860.706 & 2194.706 & 76.7\% & 505.000 & 17.7\% & 96.000 & 3.4\% & 65.000 & 2.3\% \\
|
||||||
|
Q3-13 & 2987.385 & 2408.385 & 80.6\% & 425.000 & 14.2\% & 74.000 & 2.5\% & 80.000 & 2.7\% \\
|
||||||
|
Q3-14 & 3556.397 & 2851.397 & 80.2\% & 530.000 & 14.9\% & 95.000 & 2.7\% & 80.000 & 2.2\% \\
|
||||||
|
Q3-15 & 3240.474 & 2455.474 & 75.8\% & 620.000 & 19.1\% & 115.000 & 3.5\% & 50.000 & 1.5\% \\
|
||||||
|
Q4-16 & 9191.437 & 7115.437 & 77.4\% & 1715.000 & 18.7\% & 296.000 & 3.2\% & 65.000 & 0.7\% \\
|
||||||
|
Q4-17 & 6685.802 & 5293.802 & 79.2\% & 1130.000 & 16.9\% & 182.000 & 2.7\% & 80.000 & 1.2\% \\
|
||||||
|
Q4-18 & 7327.981 & 6032.981 & 82.3\% & 1055.000 & 14.4\% & 160.000 & 2.2\% & 80.000 & 1.1\% \\
|
||||||
|
Q4-19 & 7982.569 & 6280.569 & 78.7\% & 1400.000 & 17.5\% & 222.000 & 2.8\% & 80.000 & 1.0\% \\
|
||||||
|
Q4-20 & 8171.259 & 5935.259 & 72.6\% & 1855.000 & 22.7\% & 331.000 & 4.1\% & 50.000 & 0.6\% \\
|
||||||
|
Q4-21 & 8146.581 & 5878.581 & 72.2\% & 1885.000 & 23.1\% & 333.000 & 4.1\% & 50.000 & 0.6\% \\
|
||||||
|
Q4-22 & 9593.184 & 7397.184 & 77.1\% & 1820.000 & 19.0\% & 311.000 & 3.2\% & 65.000 & 0.7\% \\
|
||||||
|
Q4-23 & 9854.818 & 7567.818 & 76.8\% & 1910.000 & 19.4\% & 327.000 & 3.3\% & 50.000 & 0.5\% \\
|
||||||
|
Q4-24 & 8840.642 & 6614.642 & 74.8\% & 1855.000 & 21.0\% & 306.000 & 3.5\% & 65.000 & 0.7\% \\
|
||||||
|
Q4-25 & 5806.596 & 4662.596 & 80.3\% & 920.000 & 15.8\% & 144.000 & 2.5\% & 80.000 & 1.4\% \\
|
||||||
|
Q4-26 & 8642.081 & 6742.081 & 78.0\% & 1570.000 & 18.2\% & 265.000 & 3.1\% & 65.000 & 0.8\% \\
|
||||||
|
Q4-27 & 9488.522 & 6869.522 & 72.4\% & 2190.000 & 23.1\% & 379.000 & 4.0\% & 50.000 & 0.5\% \\
|
||||||
|
Q4-28 & 9813.925 & 7710.925 & 78.6\% & 1755.000 & 17.9\% & 283.000 & 2.9\% & 65.000 & 0.7\% \\
|
||||||
|
Q4-29 & 8732.841 & 6700.841 & 76.7\% & 1680.000 & 19.2\% & 287.000 & 3.3\% & 65.000 & 0.7\% \\
|
||||||
|
Q4-30 & 8704.597 & 6082.597 & 69.9\% & 2180.000 & 25.0\% & 392.000 & 4.5\% & 50.000 & 0.6\% \\
|
||||||
|
Q4-31 & 7316.173 & 5962.173 & 81.5\% & 1105.000 & 15.1\% & 169.000 & 2.3\% & 80.000 & 1.1\% \\
|
||||||
|
Q4-32 & 5229.931 & 4085.931 & 78.1\% & 920.000 & 17.6\% & 144.000 & 2.8\% & 80.000 & 1.5\% \\
|
||||||
|
Q4-33 & 9307.231 & 6911.231 & 74.3\% & 1995.000 & 21.4\% & 351.000 & 3.8\% & 50.000 & 0.5\% \\
|
||||||
|
Q4-34 & 9809.921 & 7761.921 & 79.1\% & 1700.000 & 17.3\% & 283.000 & 2.9\% & 65.000 & 0.7\% \\
|
||||||
|
Q4-35 & 8342.135 & 6094.135 & 73.1\% & 1870.000 & 22.4\% & 328.000 & 3.9\% & 50.000 & 0.6\% \\
|
||||||
|
Q4-36 & 9241.603 & 6802.603 & 73.6\% & 2030.000 & 22.0\% & 359.000 & 3.9\% & 50.000 & 0.5\% \\
|
||||||
|
Q4-37 & 4780.432 & 3797.432 & 79.4\% & 795.000 & 16.6\% & 108.000 & 2.3\% & 80.000 & 1.7\% \\
|
||||||
|
Q4-38 & 8719.661 & 6649.661 & 76.3\% & 1720.000 & 19.7\% & 285.000 & 3.3\% & 65.000 & 0.7\% \\
|
||||||
|
Q4-39 & 8260.712 & 5943.712 & 72.0\% & 1925.000 & 23.3\% & 342.000 & 4.1\% & 50.000 & 0.6\% \\
|
||||||
|
Q4-40 & 8795.904 & 6347.904 & 72.2\% & 2040.000 & 23.2\% & 358.000 & 4.1\% & 50.000 & 0.6\% \\
|
||||||
|
Q4-41 & 8783.099 & 6561.099 & 74.7\% & 1845.000 & 21.0\% & 312.000 & 3.6\% & 65.000 & 0.7\% \\
|
||||||
|
Q4-42 & 10160.134 & 7966.134 & 78.4\% & 1825.000 & 18.0\% & 304.000 & 3.0\% & 65.000 & 0.6\% \\
|
||||||
|
Q4-43 & 9188.211 & 6551.211 & 71.3\% & 2190.000 & 23.8\% & 397.000 & 4.3\% & 50.000 & 0.5\% \\
|
||||||
|
Q4-44 & 8723.919 & 6355.919 & 72.9\% & 1975.000 & 22.6\% & 343.000 & 3.9\% & 50.000 & 0.6\% \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\label{tab:practicecost}
|
||||||
|
\end{table}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
% Generated by scripts/build_practice_data.py; 自建模拟器演练局复算结果。 本文件是完整 table 环境,供正文直接 \input。
|
||||||
|
\begin{table}[H]
|
||||||
|
\centering\small
|
||||||
|
\caption{演练局的真值规模与程序运行时间}
|
||||||
|
\setlength{\tabcolsep}{4pt}
|
||||||
|
\begin{tabular}{lrrrrrr}
|
||||||
|
\toprule
|
||||||
|
案例编码 & 源数 & 接收半径范围/m & 定向源数 & 清除数 & 示向度观测数 & 程序运行时间/s\\
|
||||||
|
\midrule
|
||||||
|
\texttt{6LST-ZFVS-2HHW-TQQ4} & 13 & 1025.6--1479.2 & 0 & 13 & 42 & 2.040 \\
|
||||||
|
\texttt{6V2P-HJCS-GJ9A-83MA} & 16 & 1032.7--1455.4 & 0 & 16 & 55 & 2.361 \\
|
||||||
|
\texttt{7ZXN-N53X-HAXQ-EGY4} & 10 & 1110.1--1403.3 & 0 & 10 & 34 & 2.086 \\
|
||||||
|
\texttt{8VRC-ADW4-XDXM-F62L} & 13 & 1017.3--1460.8 & 0 & 13 & 40 & 2.024 \\
|
||||||
|
\texttt{ARBP-6XFZ-5YJU-STC8} & 16 & 1020.3--1465.0 & 0 & 16 & 50 & 1.952 \\
|
||||||
|
\texttt{E27E-M8WQ-LDT5-2XDA} & 16 & 1027.5--1464.0 & 0 & 16 & 51 & 2.405 \\
|
||||||
|
\texttt{HGBA-XGH9-UNZJ-7YQ3} & 10 & 1018.0--1487.3 & 0 & 10 & 35 & 1.997 \\
|
||||||
|
\texttt{JW47-AVPH-XGHH-RLLV} & 13 & 1018.6--1446.7 & 0 & 13 & 40 & 2.146 \\
|
||||||
|
\texttt{LZDX-68DJ-XM4P-A6XL} & 10 & 1011.8--1441.2 & 0 & 10 & 30 & 1.784 \\
|
||||||
|
\texttt{MT3R-68KH-CNY5-6X73} & 13 & 1021.0--1457.9 & 0 & 13 & 44 & 2.150 \\
|
||||||
|
\texttt{MULB-4YTU-VQYG-YAS6} & 10 & 1016.1--1460.3 & 0 & 10 & 32 & 1.636 \\
|
||||||
|
\texttt{NMRC-85ZV-3FFE-GBXY} & 13 & 1010.4--1489.9 & 0 & 13 & 39 & 1.858 \\
|
||||||
|
\texttt{QS6H-CC29-PDY3-ZA54} & 16 & 1026.0--1475.3 & 0 & 16 & 55 & 2.052 \\
|
||||||
|
\texttt{R2N7-QMLC-26QX-RXYT} & 16 & 1007.2--1491.1 & 0 & 16 & 57 & 1.991 \\
|
||||||
|
\texttt{VE37-SRPD-NCFR-4EQF} & 10 & 1009.5--1433.1 & 0 & 10 & 34 & 2.106 \\
|
||||||
|
\texttt{2M5J-QWHS-BYGB-MPYF} & 13 & 1070.6--1495.1 & 6 & 13 & 43 & 5.040 \\
|
||||||
|
\texttt{2Y25-4LD6-5A4P-64CV} & 16 & 1004.9--1458.7 & 8 & 16 & 57 & 5.260 \\
|
||||||
|
\texttt{3XM4-65TW-CH39-XWTZ} & 16 & 1004.4--1454.0 & 8 & 16 & 58 & 6.208 \\
|
||||||
|
\texttt{6LEP-YVQ6-AYP5-N359} & 16 & 1008.9--1463.6 & 8 & 16 & 61 & 5.584 \\
|
||||||
|
\texttt{6US3-A76N-KC8B-DMFM} & 10 & 1008.3--1464.1 & 3 & 10 & 30 & 3.814 \\
|
||||||
|
\texttt{7HG2-UEBM-K3D2-LZWT} & 10 & 1114.6--1481.9 & 3 & 10 & 37 & 4.436 \\
|
||||||
|
\texttt{96M4-SK2V-PDWN-YGHB} & 13 & 1020.4--1492.3 & 6 & 13 & 51 & 4.853 \\
|
||||||
|
\texttt{A5YU-4SM6-4PK7-M5H8} & 10 & 1139.5--1478.2 & 3 & 10 & 43 & 4.675 \\
|
||||||
|
\texttt{B8HR-3HJH-2UYH-YDVB} & 13 & 1012.1--1489.1 & 6 & 13 & 58 & 5.794 \\
|
||||||
|
\texttt{CEL3-XQV8-M7KY-3CSW} & 16 & 1045.9--1497.6 & 8 & 16 & 54 & 5.568 \\
|
||||||
|
\texttt{DX2D-KDF9-BGYU-XPMG} & 13 & 1023.5--1360.2 & 6 & 13 & 49 & 5.272 \\
|
||||||
|
\texttt{GSG4-6HTJ-AH5L-ZYGM} & 10 & 1001.6--1484.7 & 3 & 10 & 48 & 5.235 \\
|
||||||
|
\texttt{JDAY-2SU7-RTSJ-NQFR} & 13 & 1018.3--1401.1 & 6 & 13 & 63 & 5.774 \\
|
||||||
|
\texttt{JH76-MEWS-BR6Q-BQ6S} & 13 & 1042.8--1495.8 & 6 & 13 & 45 & 5.772 \\
|
||||||
|
\texttt{JY84-364B-45UL-AFBK} & 10 & 1003.1--1498.9 & 3 & 10 & 38 & 13.713 \\
|
||||||
|
\texttt{QDDJ-S89Y-7TKY-E6VJ} & 16 & 1018.9--1422.8 & 8 & 16 & 59 & 5.495 \\
|
||||||
|
\texttt{QL6B-KEUW-DJR2-P84B} & 16 & 1001.7--1490.9 & 8 & 16 & 60 & 5.873 \\
|
||||||
|
\texttt{QXVN-L63H-6WLX-KLEJ} & 10 & 1030.0--1485.5 & 3 & 10 & 38 & 4.514 \\
|
||||||
|
\texttt{R2E7-LF5E-J5K6-BSVQ} & 13 & 1055.1--1474.8 & 6 & 13 & 56 & 5.223 \\
|
||||||
|
\texttt{RLK4-E82Q-UHT6-2M9M} & 10 & 1052.3--1496.4 & 3 & 10 & 36 & 4.395 \\
|
||||||
|
\texttt{SE9X-67GA-6YC6-QB7B} & 10 & 1040.8--1476.5 & 3 & 10 & 39 & 4.463 \\
|
||||||
|
\texttt{SWA3-C3FB-C5QC-FLW7} & 16 & 1025.8--1458.5 & 8 & 16 & 72 & 6.598 \\
|
||||||
|
\texttt{T5ZL-5GEP-FDCK-3P8T} & 13 & 1032.4--1491.3 & 6 & 13 & 56 & 5.763 \\
|
||||||
|
\texttt{TKCY-2VT2-WYUX-2JXU} & 10 & 1032.2--1492.3 & 3 & 10 & 35 & 5.028 \\
|
||||||
|
\texttt{US79-DFNV-UQVW-NPLL} & 10 & 1107.6--1451.4 & 3 & 10 & 40 & 4.565 \\
|
||||||
|
\texttt{VJ68-ADZ6-STFT-LHYT} & 13 & 1016.6--1491.9 & 6 & 13 & 58 & 5.691 \\
|
||||||
|
\texttt{X3Y4-S9D2-XWR9-V6CZ} & 13 & 1022.1--1395.5 & 6 & 13 & 55 & 6.694 \\
|
||||||
|
\texttt{XN57-MHFY-V58F-XCMY} & 10 & 1022.1--1499.2 & 3 & 10 & 31 & 4.568 \\
|
||||||
|
\texttt{ZLKB-GVZT-NQDE-CU5F} & 10 & 1099.5--1417.7 & 3 & 10 & 45 & 4.398 \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\label{tab:practicedetail}
|
||||||
|
\end{table}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
% Generated by scripts/build_practice_data.py; 问题一交会算例复算值。
|
||||||
|
\newcommand{\ExOneChannel}{12}
|
||||||
|
\newcommand{\ExOneVertices}{5}
|
||||||
|
\newcommand{\ExOneDiameter}{22.187}
|
||||||
|
\newcommand{\ExOneRadius}{11.094}
|
||||||
|
\newcommand{\ExOneExceed}{4.140}
|
||||||
|
\newcommand{\ExOneMec}{11.677}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
{
|
||||||
|
"case_code": "8VRC-ADW4-XDXM-F62L",
|
||||||
|
"channel": 12,
|
||||||
|
"half_angle_deg": 1.0,
|
||||||
|
"measurements": [
|
||||||
|
{
|
||||||
|
"x": 579.8500000000001,
|
||||||
|
"y": -1004.3296607688135,
|
||||||
|
"bearing_deg": 269.75
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 115.54237972985288,
|
||||||
|
"y": -1240.6286932057417,
|
||||||
|
"bearing_deg": 324.35
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 186.45417332320125,
|
||||||
|
"y": -1758.222760355536,
|
||||||
|
"bearing_deg": 26.5
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"vertices": [
|
||||||
|
[
|
||||||
|
567.3643714616223,
|
||||||
|
-1576.537915688301
|
||||||
|
],
|
||||||
|
[
|
||||||
|
587.2166596490906,
|
||||||
|
-1567.0688599548057
|
||||||
|
],
|
||||||
|
[
|
||||||
|
587.2107677439651,
|
||||||
|
-1566.6187772674052
|
||||||
|
],
|
||||||
|
[
|
||||||
|
573.1672250497825,
|
||||||
|
-1556.9126876083646
|
||||||
|
],
|
||||||
|
[
|
||||||
|
567.7308446306516,
|
||||||
|
-1559.7426881288288
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"diameter_circle_centre": [
|
||||||
|
577.2875696027937,
|
||||||
|
-1571.578346477853
|
||||||
|
],
|
||||||
|
"diameter_m": 22.18713033289069,
|
||||||
|
"diameter_circle_radius_m": 11.093565166445345,
|
||||||
|
"exceed_m": 4.1399107767441805,
|
||||||
|
"mec_centre": [
|
||||||
|
575.6576957672258,
|
||||||
|
-1568.3172646521614
|
||||||
|
],
|
||||||
|
"mec_radius_m": 11.677257019347309,
|
||||||
|
"vertex_count": 5
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
% Generated by scripts/build_practice_data.py; 自建模拟器演练局统计。
|
||||||
|
\newcommand{\PractQThreeCases}{15}
|
||||||
|
\newcommand{\PractQFourCases}{29}
|
||||||
|
\newcommand{\PractTotalCases}{44}
|
||||||
|
\newcommand{\PractQThreeComplete}{15}
|
||||||
|
\newcommand{\PractQFourComplete}{29}
|
||||||
|
\newcommand{\PractTotalComplete}{44}
|
||||||
|
\newcommand{\PractQThreeSources}{195}
|
||||||
|
\newcommand{\PractQFourSources}{362}
|
||||||
|
\newcommand{\PractTotalSources}{557}
|
||||||
|
\newcommand{\PractQThreeCleared}{195}
|
||||||
|
\newcommand{\PractQFourCleared}{362}
|
||||||
|
\newcommand{\PractTotalCleared}{557}
|
||||||
|
\newcommand{\PractTotalFailures}{0}
|
||||||
|
\newcommand{\PractQThreeMean}{3261.579}
|
||||||
|
\newcommand{\PractQFourMean}{8401.445}
|
||||||
|
\newcommand{\PractQThreeMin}{2794.212}
|
||||||
|
\newcommand{\PractQThreeMax}{3867.872}
|
||||||
|
\newcommand{\PractQFourMin}{4780.432}
|
||||||
|
\newcommand{\PractQFourMax}{10160.134}
|
||||||
|
\newcommand{\PractQThreeMeanClear}{258.782}
|
||||||
|
\newcommand{\PractQFourMeanClear}{708.350}
|
||||||
|
\newcommand{\PractQThreeMove}{12.729}
|
||||||
|
\newcommand{\PractQFourMove}{31.841}
|
||||||
|
\newcommand{\PractQThreeRun}{2.039}
|
||||||
|
\newcommand{\PractQFourRun}{5.526}
|
||||||
|
\newcommand{\PractQThreeMeasures}{110.4}
|
||||||
|
\newcommand{\PractQFourMeasures}{336.9}
|
||||||
|
\newcommand{\PractQThreeSwitches}{98.9}
|
||||||
|
\newcommand{\PractQFourSwitches}{286.2}
|
||||||
|
\newcommand{\PractMaxGap}{0.000000}
|
||||||
|
\newcommand{\PractQThreeMoveShare}{78.1\%}
|
||||||
|
\newcommand{\PractQThreeMeasureShare}{16.9\%}
|
||||||
|
\newcommand{\PractQThreeSwitchShare}{3.0\%}
|
||||||
|
\newcommand{\PractQThreeClearShare}{2.0\%}
|
||||||
|
\newcommand{\PractQFourMoveShare}{75.8\%}
|
||||||
|
\newcommand{\PractQFourMeasureShare}{20.1\%}
|
||||||
|
\newcommand{\PractQFourSwitchShare}{3.4\%}
|
||||||
|
\newcommand{\PractQFourClearShare}{0.7\%}
|
||||||
|
\newcommand{\PractQThreeMainCase}{QS6H-CC29-PDY3-ZA54}
|
||||||
|
\newcommand{\PractQThreeMainSources}{16}
|
||||||
|
\newcommand{\PractQThreeMainTime}{2987.385}
|
||||||
|
\newcommand{\PractQThreeMainMove}{12.042}
|
||||||
|
\newcommand{\PractQThreeMainMeasures}{85}
|
||||||
|
\newcommand{\PractQThreeMainSwitches}{74}
|
||||||
|
\newcommand{\PractQThreeMainRun}{2.052}
|
||||||
|
\newcommand{\PractQFourMainCase}{SWA3-C3FB-C5QC-FLW7}
|
||||||
|
\newcommand{\PractQFourMainSources}{16}
|
||||||
|
\newcommand{\PractQFourMainDirectional}{8}
|
||||||
|
\newcommand{\PractQFourMainTime}{4780.432}
|
||||||
|
\newcommand{\PractQFourMainMove}{18.987}
|
||||||
|
\newcommand{\PractQFourMainMeasures}{159}
|
||||||
|
\newcommand{\PractQFourMainSwitches}{108}
|
||||||
|
\newcommand{\PractQFourMainRun}{6.598}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
% Generated by scripts/build_practice_data.py; 自建模拟器演练局复算结果。 本文件是完整 table 环境,供正文直接 \input。
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering\small
|
||||||
|
\caption{问题三:全向源演练局结果(按总虚拟时间升序)}
|
||||||
|
\setlength{\tabcolsep}{2pt}
|
||||||
|
\begin{tabular}{lrrrrrrrr}
|
||||||
|
\toprule
|
||||||
|
序号 & 案例编码 & 源数 & 清除数 & 总虚拟时间/s & 移动/km & 检测数 & 换频数 & 平均清除/(s/个)\\
|
||||||
|
\midrule
|
||||||
|
1 & \texttt{6LST-ZFVS-2HHW-TQQ4} & 13 & 13 & 2794.212 & 10.426 & 109 & 99 & 214.939 \\
|
||||||
|
2 & \texttt{NMRC-85ZV-3FFE-GBXY} & 13 & 13 & 2860.706 & 10.974 & 101 & 96 & 220.054 \\
|
||||||
|
3 & \texttt{LZDX-68DJ-XM4P-A6XL} & 10 & 10 & 2954.390 & 11.072 & 117 & 105 & 295.439 \\
|
||||||
|
4 & \texttt{QS6H-CC29-PDY3-ZA54} & 16 & 16 & 2987.385 & 12.042 & 85 & 74 & 186.712 \\
|
||||||
|
5 & \texttt{MULB-4YTU-VQYG-YAS6} & 10 & 10 & 3064.020 & 11.250 & 129 & 119 & 306.402 \\
|
||||||
|
6 & \texttt{6V2P-HJCS-GJ9A-83MA} & 16 & 16 & 3174.578 & 12.458 & 103 & 88 & 198.411 \\
|
||||||
|
7 & \texttt{7ZXN-N53X-HAXQ-EGY4} & 10 & 10 & 3228.653 & 12.393 & 119 & 105 & 322.865 \\
|
||||||
|
8 & \texttt{VE37-SRPD-NCFR-4EQF} & 10 & 10 & 3240.474 & 12.277 & 124 & 115 & 324.047 \\
|
||||||
|
9 & \texttt{HGBA-XGH9-UNZJ-7YQ3} & 10 & 10 & 3340.025 & 12.810 & 123 & 113 & 334.003 \\
|
||||||
|
10 & \texttt{JW47-AVPH-XGHH-RLLV} & 13 & 13 & 3389.152 & 13.506 & 106 & 93 & 260.704 \\
|
||||||
|
11 & \texttt{8VRC-ADW4-XDXM-F62L} & 13 & 13 & 3407.039 & 13.695 & 102 & 93 & 262.080 \\
|
||||||
|
12 & \texttt{MT3R-68KH-CNY5-6X73} & 13 & 13 & 3527.713 & 14.044 & 112 & 94 & 271.363 \\
|
||||||
|
13 & \texttt{E27E-M8WQ-LDT5-2XDA} & 16 & 16 & 3531.065 & 14.210 & 104 & 89 & 220.692 \\
|
||||||
|
14 & \texttt{R2N7-QMLC-26QX-RXYT} & 16 & 16 & 3556.397 & 14.257 & 106 & 95 & 222.275 \\
|
||||||
|
15 & \texttt{ARBP-6XFZ-5YJU-STC8} & 16 & 16 & 3867.872 & 15.514 & 116 & 105 & 241.742 \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\label{tab:q3practice}
|
||||||
|
\end{table}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
% Generated by scripts/build_practice_data.py; 自建模拟器演练局复算结果。 本文件是完整 table 环境,供正文直接 \input。
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering\small
|
||||||
|
\caption{问题四:混合源演练局结果(按总虚拟时间升序)}
|
||||||
|
\setlength{\tabcolsep}{2pt}
|
||||||
|
\begin{tabular}{lrrrrrrrr}
|
||||||
|
\toprule
|
||||||
|
序号 & 案例编码 & 源数 & 清除数 & 总虚拟时间/s & 移动/km & 检测数 & 换频数 & 平均清除/(s/个)\\
|
||||||
|
\midrule
|
||||||
|
1 & \texttt{SWA3-C3FB-C5QC-FLW7} & 16 & 16 & 4780.432 & 18.987 & 159 & 108 & 298.777 \\
|
||||||
|
2 & \texttt{QL6B-KEUW-DJR2-P84B} & 16 & 16 & 5229.931 & 20.430 & 184 & 144 & 326.871 \\
|
||||||
|
3 & \texttt{CEL3-XQV8-M7KY-3CSW} & 16 & 16 & 5806.596 & 23.313 & 184 & 144 & 362.912 \\
|
||||||
|
4 & \texttt{2Y25-4LD6-5A4P-64CV} & 16 & 16 & 6685.802 & 26.469 & 226 & 182 & 417.863 \\
|
||||||
|
5 & \texttt{QDDJ-S89Y-7TKY-E6VJ} & 16 & 16 & 7316.173 & 29.811 & 221 & 169 & 457.261 \\
|
||||||
|
6 & \texttt{3XM4-65TW-CH39-XWTZ} & 16 & 16 & 7327.981 & 30.165 & 211 & 160 & 457.999 \\
|
||||||
|
7 & \texttt{6LEP-YVQ6-AYP5-N359} & 16 & 16 & 7982.569 & 31.403 & 280 & 222 & 498.911 \\
|
||||||
|
8 & \texttt{7HG2-UEBM-K3D2-LZWT} & 10 & 10 & 8146.581 & 29.393 & 377 & 333 & 814.658 \\
|
||||||
|
9 & \texttt{6US3-A76N-KC8B-DMFM} & 10 & 10 & 8171.259 & 29.676 & 371 & 331 & 817.126 \\
|
||||||
|
10 & \texttt{TKCY-2VT2-WYUX-2JXU} & 10 & 10 & 8260.712 & 29.719 & 385 & 342 & 826.071 \\
|
||||||
|
11 & \texttt{RLK4-E82Q-UHT6-2M9M} & 10 & 10 & 8342.135 & 30.471 & 374 & 328 & 834.214 \\
|
||||||
|
12 & \texttt{DX2D-KDF9-BGYU-XPMG} & 13 & 13 & 8642.081 & 33.710 & 314 & 265 & 664.775 \\
|
||||||
|
13 & \texttt{JY84-364B-45UL-AFBK} & 10 & 10 & 8704.597 & 30.413 & 436 & 392 & 870.460 \\
|
||||||
|
14 & \texttt{T5ZL-5GEP-FDCK-3P8T} & 13 & 13 & 8719.661 & 33.248 & 344 & 285 & 670.743 \\
|
||||||
|
15 & \texttt{ZLKB-GVZT-NQDE-CU5F} & 10 & 10 & 8723.919 & 31.780 & 395 & 343 & 872.392 \\
|
||||||
|
16 & \texttt{JH76-MEWS-BR6Q-BQ6S} & 13 & 13 & 8732.841 & 33.504 & 336 & 287 & 671.757 \\
|
||||||
|
17 & \texttt{VJ68-ADZ6-STFT-LHYT} & 13 & 13 & 8783.099 & 32.805 & 369 & 312 & 675.623 \\
|
||||||
|
18 & \texttt{US79-DFNV-UQVW-NPLL} & 10 & 10 & 8795.904 & 31.740 & 408 & 358 & 879.590 \\
|
||||||
|
19 & \texttt{B8HR-3HJH-2UYH-YDVB} & 13 & 13 & 8840.642 & 33.073 & 371 & 306 & 680.049 \\
|
||||||
|
20 & \texttt{XN57-MHFY-V58F-XCMY} & 10 & 10 & 9188.211 & 32.756 & 438 & 397 & 918.821 \\
|
||||||
|
21 & \texttt{2M5J-QWHS-BYGB-MPYF} & 13 & 13 & 9191.437 & 35.577 & 343 & 296 & 707.034 \\
|
||||||
|
22 & \texttt{SE9X-67GA-6YC6-QB7B} & 10 & 10 & 9241.603 & 34.013 & 406 & 359 & 924.160 \\
|
||||||
|
23 & \texttt{QXVN-L63H-6WLX-KLEJ} & 10 & 10 & 9307.231 & 34.556 & 399 & 351 & 930.723 \\
|
||||||
|
24 & \texttt{GSG4-6HTJ-AH5L-ZYGM} & 10 & 10 & 9488.522 & 34.348 & 438 & 379 & 948.852 \\
|
||||||
|
25 & \texttt{96M4-SK2V-PDWN-YGHB} & 13 & 13 & 9593.184 & 36.986 & 364 & 311 & 737.937 \\
|
||||||
|
26 & \texttt{R2E7-LF5E-J5K6-BSVQ} & 13 & 13 & 9809.921 & 38.810 & 340 & 283 & 754.609 \\
|
||||||
|
27 & \texttt{JDAY-2SU7-RTSJ-NQFR} & 13 & 13 & 9813.925 & 38.555 & 351 & 283 & 754.917 \\
|
||||||
|
28 & \texttt{A5YU-4SM6-4PK7-M5H8} & 10 & 10 & 9854.818 & 37.839 & 382 & 327 & 985.482 \\
|
||||||
|
29 & \texttt{X3Y4-S9D2-XWR9-V6CZ} & 13 & 13 & 10160.134 & 39.831 & 365 & 304 & 781.549 \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\label{tab:q4practice}
|
||||||
|
\end{table}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
problem_no,case_code,module,seed,source_total,directional_total,r_eff_min_m,r_eff_max_m,cleared_jammer_count,all_cleared,complete,measure_accepted_count,direction_measure_count,channel_switch_count,clear_failure_count,virtual_time_s,move_time_s,move_distance_m,measure_time_s,switch_time_s,clear_time_s,program_run_duration_s,average_clear_time_s,end_reason,max_recorded_gap_s
|
||||||
|
3,6LST-ZFVS-2HHW-TQQ4,q3_practice,310,13,0,1025.565,1479.16,13,True,True,109,42,99,0,2794.211708,2085.211708,10426.059,545,99.0,65.0,2.04,214.939362,user_exit,0.0
|
||||||
|
3,6V2P-HJCS-GJ9A-83MA,q3_practice,305,16,0,1032.735,1455.427,16,True,True,103,55,88,0,3174.57833,2491.57833,12457.892,515,88.0,80.0,2.361,198.411146,user_exit,0.0
|
||||||
|
3,7ZXN-N53X-HAXQ-EGY4,q3_practice,309,10,0,1110.109,1403.33,10,True,True,119,34,105,0,3228.653175,2478.653175,12393.266,595,105.0,50.0,2.086,322.865318,user_exit,0.0
|
||||||
|
3,8VRC-ADW4-XDXM-F62L,q3_practice,301,13,0,1017.333,1460.77,13,True,True,102,40,93,0,3407.038502,2739.038502,13695.193,510,93.0,65.0,2.024,262.079885,user_exit,0.0
|
||||||
|
3,ARBP-6XFZ-5YJU-STC8,q3_practice,302,16,0,1020.28,1464.97,16,True,True,116,50,105,0,3867.871913,3102.871913,15514.36,580,105.0,80.0,1.952,241.741995,user_exit,0.0
|
||||||
|
3,E27E-M8WQ-LDT5-2XDA,q3_practice,308,16,0,1027.493,1463.979,16,True,True,104,51,89,0,3531.064575,2842.064575,14210.323,520,89.0,80.0,2.405,220.691536,user_exit,0.0
|
||||||
|
3,HGBA-XGH9-UNZJ-7YQ3,q3_practice,306,10,0,1018.005,1487.291,10,True,True,123,35,113,0,3340.02512,2562.02512,12810.126,615,113.0,50.0,1.997,334.002512,user_exit,0.0
|
||||||
|
3,JW47-AVPH-XGHH-RLLV,q3_practice,313,13,0,1018.607,1446.721,13,True,True,106,40,93,0,3389.151979,2701.151979,13505.76,530,93.0,65.0,2.146,260.703998,user_exit,0.0
|
||||||
|
3,LZDX-68DJ-XM4P-A6XL,q3_practice,312,10,0,1011.801,1441.227,10,True,True,117,30,105,0,2954.389763,2214.389763,11071.949,585,105.0,50.0,1.784,295.438976,user_exit,0.0
|
||||||
|
3,MT3R-68KH-CNY5-6X73,q3_practice,307,13,0,1021.012,1457.861,13,True,True,112,44,94,0,3527.712508,2808.712508,14043.563,560,94.0,65.0,2.15,271.362501,user_exit,0.0
|
||||||
|
3,MULB-4YTU-VQYG-YAS6,q3_practice,303,10,0,1016.095,1460.312,10,True,True,129,32,119,0,3064.020357,2250.020357,11250.102,645,119.0,50.0,1.636,306.402036,user_exit,0.0
|
||||||
|
3,NMRC-85ZV-3FFE-GBXY,q3_practice,304,13,0,1010.416,1489.87,13,True,True,101,39,96,0,2860.706202,2194.706202,10973.531,505,96.0,65.0,1.858,220.054323,user_exit,0.0
|
||||||
|
3,QS6H-CC29-PDY3-ZA54,q3_practice,314,16,0,1025.989,1475.263,16,True,True,85,55,74,0,2987.384891,2408.384891,12041.924,425,74.0,80.0,2.052,186.711556,user_exit,0.0
|
||||||
|
3,R2N7-QMLC-26QX-RXYT,q3_practice,311,16,0,1007.2,1491.089,16,True,True,106,57,95,0,3556.396565,2851.396565,14256.983,530,95.0,80.0,1.991,222.274785,user_exit,0.0
|
||||||
|
3,VE37-SRPD-NCFR-4EQF,q3_practice,300,10,0,1009.526,1433.065,10,True,True,124,34,115,0,3240.473597,2455.473597,12277.368,620,115.0,50.0,2.106,324.04736,user_exit,0.0
|
||||||
|
4,2M5J-QWHS-BYGB-MPYF,q4_practice,404,13,6,1070.641,1495.106,13,True,True,343,43,296,0,9191.436652,7115.436652,35577.183,1715,296.0,65.0,5.04,707.033589,user_exit,0.0
|
||||||
|
4,2Y25-4LD6-5A4P-64CV,q4_practice,411,16,8,1004.93,1458.657,16,True,True,226,57,182,0,6685.801927,5293.801927,26469.01,1130,182.0,80.0,5.26,417.86262,user_exit,0.0
|
||||||
|
4,3XM4-65TW-CH39-XWTZ,q4_practice,420,16,8,1004.366,1454.027,16,True,True,211,58,160,0,7327.980928,6032.980928,30164.905,1055,160.0,80.0,6.208,457.998808,user_exit,0.0
|
||||||
|
4,6LEP-YVQ6-AYP5-N359,q4_practice,432,16,8,1008.896,1463.598,16,True,True,280,61,222,0,7982.568866,6280.568866,31402.844,1400,222.0,80.0,5.584,498.910554,user_exit,0.0
|
||||||
|
4,6US3-A76N-KC8B-DMFM,q4_practice,409,10,3,1008.26,1464.117,10,True,True,371,30,331,0,8171.259372,5935.259372,29676.297,1855,331.0,50.0,3.814,817.125937,user_exit,0.0
|
||||||
|
4,7HG2-UEBM-K3D2-LZWT,q4_practice,433,10,3,1114.562,1481.86,10,True,True,377,37,333,0,8146.580541,5878.580541,29392.903,1885,333.0,50.0,4.436,814.658054,user_exit,0.0
|
||||||
|
4,96M4-SK2V-PDWN-YGHB,q4_practice,407,13,6,1020.414,1492.263,13,True,True,364,51,311,0,9593.183569,7397.183569,36985.918,1820,311.0,65.0,4.853,737.937198,user_exit,0.0
|
||||||
|
4,A5YU-4SM6-4PK7-M5H8,q4_practice,412,10,3,1139.46,1478.185,10,True,True,382,43,327,0,9854.818271,7567.818271,37839.091,1910,327.0,50.0,4.675,985.481827,user_exit,0.0
|
||||||
|
4,B8HR-3HJH-2UYH-YDVB,q4_practice,416,13,6,1012.067,1489.111,13,True,True,371,58,306,0,8840.641969,6614.641969,33073.21,1855,306.0,65.0,5.794,680.049382,user_exit,0.0
|
||||||
|
4,CEL3-XQV8-M7KY-3CSW,q4_practice,426,16,8,1045.853,1497.562,16,True,True,184,54,144,0,5806.59591,4662.59591,23312.98,920,144.0,80.0,5.568,362.912244,user_exit,0.0
|
||||||
|
4,DX2D-KDF9-BGYU-XPMG,q4_practice,425,13,6,1023.466,1360.172,13,True,True,314,49,265,0,8642.080868,6742.080868,33710.404,1570,265.0,65.0,5.272,664.775451,user_exit,0.0
|
||||||
|
4,GSG4-6HTJ-AH5L-ZYGM,q4_practice,403,10,3,1001.593,1484.685,10,True,True,438,48,379,0,9488.521663,6869.521663,34347.608,2190,379.0,50.0,5.235,948.852166,user_exit,0.0
|
||||||
|
4,JDAY-2SU7-RTSJ-NQFR,q4_practice,434,13,6,1018.26,1401.084,13,True,True,351,63,283,0,9813.925336,7710.925336,38554.627,1755,283.0,65.0,5.774,754.917334,user_exit,0.0
|
||||||
|
4,JH76-MEWS-BR6Q-BQ6S,q4_practice,413,13,6,1042.824,1495.794,13,True,True,336,45,287,0,8732.841353,6700.841353,33504.207,1680,287.0,65.0,5.772,671.757027,user_exit,0.0
|
||||||
|
4,JY84-364B-45UL-AFBK,q4_practice,400,10,3,1003.128,1498.908,10,True,True,436,38,392,0,8704.596801,6082.596801,30412.984,2180,392.0,50.0,13.713,870.45968,user_exit,0.0
|
||||||
|
4,QDDJ-S89Y-7TKY-E6VJ,q4_practice,438,16,8,1018.88,1422.829,16,True,True,221,59,169,0,7316.173221,5962.173221,29810.866,1105,169.0,80.0,5.495,457.260826,user_exit,0.0
|
||||||
|
4,QL6B-KEUW-DJR2-P84B,q4_practice,435,16,8,1001.665,1490.865,16,True,True,184,60,144,0,5229.931106,4085.931106,20429.656,920,144.0,80.0,5.873,326.870694,user_exit,0.0
|
||||||
|
4,QXVN-L63H-6WLX-KLEJ,q4_practice,430,10,3,1029.996,1485.51,10,True,True,399,38,351,0,9307.230821,6911.230821,34556.154,1995,351.0,50.0,4.514,930.723082,user_exit,0.0
|
||||||
|
4,R2E7-LF5E-J5K6-BSVQ,q4_practice,419,13,6,1055.108,1474.754,13,True,True,340,56,283,0,9809.920542,7761.920542,38809.603,1700,283.0,65.0,5.223,754.609272,user_exit,0.0
|
||||||
|
4,RLK4-E82Q-UHT6-2M9M,q4_practice,418,10,3,1052.266,1496.42,10,True,True,374,36,328,0,8342.1353,6094.1353,30470.676,1870,328.0,50.0,4.395,834.21353,user_exit,0.0
|
||||||
|
4,SE9X-67GA-6YC6-QB7B,q4_practice,439,10,3,1040.839,1476.506,10,True,True,406,39,359,0,9241.602648,6802.602648,34013.013,2030,359.0,50.0,4.463,924.160265,user_exit,0.0
|
||||||
|
4,SWA3-C3FB-C5QC-FLW7,q4_practice,402,16,8,1025.798,1458.463,16,True,True,159,72,108,0,4780.431839,3797.431839,18987.159,795,108.0,80.0,6.598,298.77699,user_exit,0.0
|
||||||
|
4,T5ZL-5GEP-FDCK-3P8T,q4_practice,428,13,6,1032.374,1491.324,13,True,True,344,56,285,0,8719.661303,6649.661303,33248.306,1720,285.0,65.0,5.763,670.743177,user_exit,0.0
|
||||||
|
4,TKCY-2VT2-WYUX-2JXU,q4_practice,427,10,3,1032.206,1492.339,10,True,True,385,35,342,0,8260.712396,5943.712396,29718.562,1925,342.0,50.0,5.028,826.07124,user_exit,0.0
|
||||||
|
4,US79-DFNV-UQVW-NPLL,q4_practice,406,10,3,1107.601,1451.394,10,True,True,408,40,358,0,8795.904309,6347.904309,31739.522,2040,358.0,50.0,4.565,879.590431,user_exit,0.0
|
||||||
|
4,VJ68-ADZ6-STFT-LHYT,q4_practice,410,13,6,1016.63,1491.9,13,True,True,369,58,312,0,8783.09917,6561.09917,32805.496,1845,312.0,65.0,5.691,675.623013,user_exit,0.0
|
||||||
|
4,X3Y4-S9D2-XWR9-V6CZ,q4_practice,431,13,6,1022.115,1395.544,13,True,True,365,55,304,0,10160.134188,7966.134188,39830.671,1825,304.0,65.0,6.694,781.548784,user_exit,0.0
|
||||||
|
4,XN57-MHFY-V58F-XCMY,q4_practice,421,10,3,1022.143,1499.183,10,True,True,438,31,397,0,9188.211438,6551.211438,32756.057,2190,397.0,50.0,4.568,918.821144,user_exit,0.0
|
||||||
|
4,ZLKB-GVZT-NQDE-CU5F,q4_practice,424,10,3,1099.547,1417.736,10,True,True,395,45,343,0,8723.919348,6355.919348,31779.597,1975,343.0,50.0,4.398,872.391935,user_exit,0.0
|
||||||
|
@@ -0,0 +1,15 @@
|
|||||||
|
% Generated by scripts/build_practice_data.py; 自建模拟器演练局复算结果。 本文件是完整 table 环境,供正文直接 \input。
|
||||||
|
\begin{table}[H]
|
||||||
|
\centering\footnotesize
|
||||||
|
\caption{演练局汇总(仅统计全清且无失败清除的局)}
|
||||||
|
\setlength{\tabcolsep}{2pt}
|
||||||
|
\begin{tabular}{lrrrrrrr}
|
||||||
|
\toprule
|
||||||
|
问题 & 全清局数 & 累计清除 & 平均总虚拟时间/s & 时间区间/s & 平均定位清除时间/(s/个) & 移动占比\\
|
||||||
|
\midrule
|
||||||
|
问题三(全向源) & 15 & 195 & 3261.579 & 2794.212--3867.872 & 258.782 & 78.1\% \\
|
||||||
|
问题四(混合源) & 29 & 362 & 8401.445 & 4780.432--10160.134 & 708.350 & 75.8\% \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\label{tab:practicesummary}
|
||||||
|
\end{table}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
% Generated by scripts/build_paper_support.py from project/results/*.json.
|
||||||
|
\newcommand{\ProjQOneExampleCases}{5}
|
||||||
|
\newcommand{\ProjQOneRandomCases}{40}
|
||||||
|
\newcommand{\ProjQOneFixedStatusBase}{80.0\%}
|
||||||
|
\newcommand{\ProjQOneFixedMaeBase}{7.886}
|
||||||
|
\newcommand{\ProjQOneFixedMaeMaxBase}{10.000}
|
||||||
|
\newcommand{\ProjQOneFixedCoverBase}{33.3\%}
|
||||||
|
\newcommand{\ProjQOneFixedMsOpt}{0.064}
|
||||||
|
\newcommand{\ProjQOneFixedMsBase}{14.202}
|
||||||
|
\newcommand{\ProjQOneRandStatusBase}{100.0\%}
|
||||||
|
\newcommand{\ProjQOneRandMaeBase}{4.583}
|
||||||
|
\newcommand{\ProjQOneRandMaeMaxBase}{14.599}
|
||||||
|
\newcommand{\ProjQOneRandCoverBase}{52.5\%}
|
||||||
|
\newcommand{\ProjQOneRandMsOpt}{0.086}
|
||||||
|
\newcommand{\ProjQOneRandMsBase}{15.933}
|
||||||
|
\newcommand{\ProjQTwoCases}{30}
|
||||||
|
\newcommand{\ProjQTwoInitialRadius}{681.467}
|
||||||
|
\newcommand{\ProjQTwoGuaranteeOpt}{100.0\%}
|
||||||
|
\newcommand{\ProjQTwoGuaranteeMec}{100.0\%}
|
||||||
|
\newcommand{\ProjQTwoGuaranteePerp}{0.0\%}
|
||||||
|
\newcommand{\ProjQTwoWorstOpt}{73.890}
|
||||||
|
\newcommand{\ProjQTwoWorstRef}{75.627}
|
||||||
|
\newcommand{\ProjQTwoRatioOpt}{0.104}
|
||||||
|
\newcommand{\ProjQTwoRatioMec}{0.500}
|
||||||
|
\newcommand{\ProjQTwoWorstPerp}{80.111}
|
||||||
|
\newcommand{\ProjQTwoWorstMec}{340.747}
|
||||||
|
\newcommand{\ProjQThreeScenes}{18}
|
||||||
|
\newcommand{\ProjQThreeMeanOpt}{3188.734}
|
||||||
|
\newcommand{\ProjQThreeMeanSeven}{5361.707}
|
||||||
|
\newcommand{\ProjQThreeMeanBase}{14935.659}
|
||||||
|
\newcommand{\ProjQThreeDropOpt}{78.4\%}
|
||||||
|
\newcommand{\ProjQThreeDropMedianOpt}{80.0\%}
|
||||||
|
\newcommand{\ProjQThreeDropSeven}{63.7\%}
|
||||||
|
\newcommand{\ProjQThreeFasterOpt}{18/18}
|
||||||
|
\newcommand{\ProjQThreeMeasuresOpt}{111.111}
|
||||||
|
\newcommand{\ProjQThreeMeasuresBase}{430.556}
|
||||||
|
\newcommand{\ProjQThreeMoveOpt}{12.338}
|
||||||
|
\newcommand{\ProjQThreeMoveBase}{61.550}
|
||||||
|
\newcommand{\ProjQThreeWallOpt}{0.767}
|
||||||
|
\newcommand{\ProjQFourScenes}{11}
|
||||||
|
\newcommand{\ProjQFourMeanOpt}{9069.871}
|
||||||
|
\newcommand{\ProjQFourMeanGrid}{18179.173}
|
||||||
|
\newcommand{\ProjQFourMeanBase}{3890.801}
|
||||||
|
\newcommand{\ProjQFourClearOpt}{100.0\%}
|
||||||
|
\newcommand{\ProjQFourClearGrid}{66.6\%}
|
||||||
|
\newcommand{\ProjQFourClearBase}{77.0\%}
|
||||||
|
\newcommand{\ProjQFourAbsentBase}{24}
|
||||||
|
\newcommand{\ProjQFourMeasuresOpt}{355.636}
|
||||||
|
\newcommand{\ProjQFourMeasuresBase}{132.000}
|
||||||
|
\newcommand{\ProjQFourFallbackOpt}{24.818}
|
||||||
|
\newcommand{\ProjQFourValidOpt}{11/11}
|
||||||
|
\newcommand{\ProjQFourValidGrid}{0/11}
|
||||||
|
\newcommand{\ProjQFourRiseOpt}{142.9\%}
|
||||||
|
\newcommand{\ProjQFourMoveOpt}{34.268}
|
||||||
|
\newcommand{\ProjQFourMoveBase}{15.319}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
% Generated by scripts/build_paper_support.py from project/results/*.json.
|
||||||
|
最优(固定 5 例) & 100.0\% & 0.000 & 0.000 & 100.0\% & 0.064 \\
|
||||||
|
最优(随机 40 例) & 100.0\% & 0.000 & 0.000 & 100.0\% & 0.086 \\
|
||||||
|
基线(固定 5 例) & 80.0\% & 7.886 & 10.000 & 33.3\% & 14.202 \\
|
||||||
|
基线(随机 40 例) & 100.0\% & 4.583 & 14.599 & 52.5\% & 15.933 \\
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
% Generated by scripts/build_paper_support.py from project/results/*.json.
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering\small
|
||||||
|
\caption{问题三:三种策略在 18 个全向源场景上的对比(时间:s;三种策略的缺席误判均为 0)}
|
||||||
|
\setlength{\tabcolsep}{2pt}
|
||||||
|
\begin{tabular}{lrrrrrrrr}
|
||||||
|
\toprule
|
||||||
|
策略 & 有效局 & 全清率 & $T$ 均值 & $T$ 中位 & $T$ 最大 & 检测均值 & 位移/km & 后备清除\\
|
||||||
|
\midrule
|
||||||
|
bayes(默认策略) & 18/18 & 100.0\% & 3188.734 & 3111.256 & 3663.707 & 111.1 & 12.338 & 0.0 \\ \\
|
||||||
|
seven(七点批量) & 18/18 & 100.0\% & 5361.707 & 5367.455 & 6462.351 & 100.8 & 23.508 & 0.0 \\ \\
|
||||||
|
grid(49 点网格) & 18/18 & 100.0\% & 14935.659 & 15275.057 & 16691.406 & 430.6 & 61.550 & 0.0 \\ \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\label{tab:q3compare}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
% Generated by scripts/build_paper_support.py from project/results/*.json.
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering\small
|
||||||
|
\caption{问题四:三种策略在 11 个混合源场景上的对比(时间:s)}
|
||||||
|
\setlength{\tabcolsep}{4pt}
|
||||||
|
\begin{tabular}{lrrrrrrr}
|
||||||
|
\toprule
|
||||||
|
策略 & 有效局 & 全清率 & 缺席误判 & $T$ 均值 & $T$ 中位 & $T$ 最大 & 检测均值\\
|
||||||
|
\midrule
|
||||||
|
directional(默认策略) & 11/11 & 100.0\% & 0 & 9069.871 & 8803.261 & 12081.148 & 355.6 \\
|
||||||
|
grid(问题三网格) & 0/11 & 66.6\% & 0 & 18179.173 & 18345.164 & 20457.858 & 573.7 \\
|
||||||
|
bayes(问题三策略) & 0/11 & 77.0\% & 24 & 3890.801 & 3646.178 & 5054.382 & 132.0 \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\label{tab:q4compare}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
\begin{figure}[htbp]\centering
|
||||||
|
\begin{tikzpicture}[x=0.00108cm,y=0.85cm,font=\small]
|
||||||
|
\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};
|
||||||
|
\draw (4000,-0.25)--(4000,-0.35) node[below,font=\scriptsize] {4000};
|
||||||
|
\draw (6000,-0.25)--(6000,-0.35) node[below,font=\scriptsize] {6000};
|
||||||
|
\draw (8000,-0.25)--(8000,-0.35) node[below,font=\scriptsize] {8000};
|
||||||
|
\draw (10000,-0.25)--(10000,-0.35) node[below,font=\scriptsize] {10000};
|
||||||
|
\node[anchor=west,font=\scriptsize] at (10400,-0.65) {s};
|
||||||
|
\fill[inkblue] (0,-1.3) rectangle (350,-1.05);
|
||||||
|
\node[anchor=west] at (450,-1.175) {移动};
|
||||||
|
\fill[inkblue!50] (2600,-1.3) rectangle (2950,-1.05);
|
||||||
|
\node[anchor=west] at (3050,-1.175) {检测};
|
||||||
|
\fill[warmgray!70] (5200,-1.3) rectangle (5550,-1.05);
|
||||||
|
\node[anchor=west] at (5650,-1.175) {换频};
|
||||||
|
\fill[black!18] (7600,-1.3) rectangle (7950,-1.05);
|
||||||
|
\node[anchor=west] at (8050,-1.175) {清除};
|
||||||
|
\end{tikzpicture}
|
||||||
|
\caption{正式测试的累计虚拟耗时分解。移动时间由总耗时与各动作计数计算。}
|
||||||
|
\label{fig:costbars}\end{figure}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
\begin{figure}[htbp]\centering
|
||||||
|
\begin{tikzpicture}[x=0.00145cm,y=0.00145cm,font=\small]
|
||||||
|
\fill[inkblue!5] (0,0) circle (1800);
|
||||||
|
\draw[thick] (0,0) circle (1800);
|
||||||
|
\draw[->,warmgray] (-2900,0)--(2950,0) node[right] {$x$/m};
|
||||||
|
\draw[->,warmgray] (0,-2800)--(0,2850) node[above] {$y$/m};
|
||||||
|
\draw (-2000,-35)--(-2000,35);
|
||||||
|
\node[below,font=\scriptsize] at (-2000,-50) {-2000};
|
||||||
|
\draw (-1000,-35)--(-1000,35);
|
||||||
|
\node[below,font=\scriptsize] at (-1000,-50) {-1000};
|
||||||
|
\draw (1000,-35)--(1000,35);
|
||||||
|
\node[below,font=\scriptsize] at (1000,-50) {1000};
|
||||||
|
\draw (2000,-35)--(2000,35);
|
||||||
|
\node[below,font=\scriptsize] at (2000,-50) {2000};
|
||||||
|
\fill[inkblue] (-800.0,-200.0) circle (33);
|
||||||
|
\fill[inkblue] (800.0,200.0) circle (33);
|
||||||
|
\fill[inkblue] (-200.0,900.0) circle (33);
|
||||||
|
\fill[inkblue] (200.0,-900.0) circle (33);
|
||||||
|
\fill[inkblue] (-1200.0,700.0) circle (33);
|
||||||
|
\fill[inkblue] (1200.0,-700.0) circle (33);
|
||||||
|
\fill[inkblue] (800.0,1200.0) circle (33);
|
||||||
|
\fill[inkblue] (-1800.0,-300.0) circle (33);
|
||||||
|
\fill[inkblue] (1800.0,300.0) circle (33);
|
||||||
|
\fill[inkblue] (-400.0,1800.0) circle (33);
|
||||||
|
\fill[inkblue] (0.0,0.0) circle (33);
|
||||||
|
\fill[inkblue] (1400.0,-1400.0) circle (33);
|
||||||
|
\fill[inkblue] (-1500.0,-1300.0) circle (33);
|
||||||
|
\fill[inkblue] (1500.0,1300.0) circle (33);
|
||||||
|
\fill[inkblue] (-400.0,-1800.0) circle (33);
|
||||||
|
\fill[inkblue] (400.0,1800.0) circle (33);
|
||||||
|
\fill[inkblue] (-1800.0,400.0) circle (33);
|
||||||
|
\fill[inkblue] (1800.0,-400.0) circle (33);
|
||||||
|
\fill[inkblue] (-500.0,700.0) circle (33);
|
||||||
|
\fill[inkblue] (-700.0,-700.0) circle (33);
|
||||||
|
\fill[inkblue] (700.0,700.0) circle (33);
|
||||||
|
\fill[inkblue] (1300.0,1100.0) circle (33);
|
||||||
|
\fill[inkblue] (-1300.0,1500.0) circle (33);
|
||||||
|
\fill[inkblue] (500.0,-1800.0) circle (33);
|
||||||
|
\fill[inkblue] (-900.0,-2100.0) circle (33);
|
||||||
|
\fill[inkblue] (600.0,1900.0) circle (33);
|
||||||
|
\fill[inkblue] (-2500.0,500.0) circle (33);
|
||||||
|
\fill[inkblue] (1900.0,-900.0) circle (33);
|
||||||
|
\fill[inkblue] (-1700.0,-500.0) circle (33);
|
||||||
|
\fill[inkblue] (-700.0,-1200.0) circle (33);
|
||||||
|
\fill[inkblue] (900.0,-700.0) circle (33);
|
||||||
|
\node[anchor=west,align=left] at (3250,900) {圆域:源位置先验\\蓝点:31个检测站};
|
||||||
|
\node[anchor=west,align=left] at (3250,-700) {部分站点在圆域外\\用于接收向外发射的源};
|
||||||
|
\end{tikzpicture}
|
||||||
|
\caption{第四问集合覆盖模型得到的31个检测站及源位置区域。}
|
||||||
|
\label{fig:q4plan}\end{figure}
|
||||||
@@ -0,0 +1,205 @@
|
|||||||
|
\section{官方正式测试的效果验证}\label{app:formal}\aigcC
|
||||||
|
\subsection{数据选择及对应关系核对}
|
||||||
|
正文的机制论证与定量结论取自自建模拟器演练局,
|
||||||
|
本节则用官方模拟器的正式测试验证算法在正式环境下的效率与正文结论是否一致。
|
||||||
|
实验样本严格限定为官方模拟器
|
||||||
|
\pathtext{Jammers-simulator-full/test} 下的六份正式导出包,问题三、四各有三次。
|
||||||
|
文件名、案例编码与完整包校验值见表~\ref{tab:packages},核对说明见 \pathtext{docs/paper/data/audit.md}。
|
||||||
|
由于官方记录不公开真实源位置和机器人轨迹,本节不绘制搜索/清除路径,
|
||||||
|
只使用清除数量、总虚拟时间、程序运行时间与动作计数四类可直接观测的量。
|
||||||
|
这样处理的原因是:正式测试能够检验"算法是否在真实时限内完成清除",
|
||||||
|
但不能检验"定位是否收敛到真值",后者已由正文的演练局分析承担。
|
||||||
|
|
||||||
|
评价指标包括清除数量 $N_c^+$、总虚拟时间 $T$、程序运行时间 $T_{\mathrm{real}}$,
|
||||||
|
以及检测、换频和清除的动作次数。其中 $T$ 按整数微秒累计,
|
||||||
|
$T_{\mathrm{real}}$ 采用官方记录的毫秒值;
|
||||||
|
平均定位清除时间仅作辅助分析,不替代总虚拟时间与程序运行时间这两项直接指标。
|
||||||
|
六次测试均以主动退出(\texttt{user\_exit})结束,统计提交状态为已确认。
|
||||||
|
|
||||||
|
\subsection{问题三与问题四的正式结果}
|
||||||
|
|
||||||
|
\input{data/formal-q3-table}
|
||||||
|
|
||||||
|
|
||||||
|
三次正式测试分别清除 $13$、$15$、$10$ 个源,
|
||||||
|
总虚拟时间分别为 $3094.978$、$3493.335$、$2906.863$ s,合计 $\QThreeTotal$ s;
|
||||||
|
程序运行时间分别为 $5.596$、$3.024$、$2.680$ s,合计 $\QThreeProgramTotal$ s。
|
||||||
|
按清除数量加权的平均定位清除时间为 $\QThreeWeighted$ s/个,仅作辅助解释。
|
||||||
|
第三次的总虚拟时间最短($2906.863$ s),但其清除数也最少($10$ 个),
|
||||||
|
因此判断优化程度时应以总虚拟时间与清除数量并列报告,不能只看单一平均值。
|
||||||
|
|
||||||
|
|
||||||
|
\input{data/formal-q4-table}
|
||||||
|
|
||||||
|
|
||||||
|
表~\ref{tab:formal4} 给出问题四的三次正式结果。三次分别清除 $13$、$10$、$14$ 个源,
|
||||||
|
总虚拟时间合计 $\QFourTotal$ s,程序运行时间合计 $\QFourProgramTotal$ s,
|
||||||
|
加权平均定位清除时间 $\QFourWeighted$ s/个。
|
||||||
|
第三次清除数最多($14$ 个)且总虚拟时间最短($8608.382$ s),
|
||||||
|
与自建模拟器演练局中"可见性筛选加后备清除能够压缩定向场景耗时"的结论方向一致;
|
||||||
|
但三次案例的随机源分布与朝向不同,仍应以绝对时间与清除数量为准。
|
||||||
|
|
||||||
|
\subsection{正式测试的动作耗时分解}
|
||||||
|
按式~\eqref{eq:residual} 由动作计数反推移动时间,得到表~\ref{tab:formalcost}。
|
||||||
|
其中 Q3-1 表示问题三第一次正式测试,其余编号依此类推。
|
||||||
|
|
||||||
|
|
||||||
|
\input{data/formal-cost-table}
|
||||||
|
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.92\linewidth]{formal-time-bars.png}
|
||||||
|
\caption{六次正式测试的累计虚拟耗时分解(数据仅来自正式测试的原始动作计数与总虚拟时间)。}
|
||||||
|
\label{fig:formalbars}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
六次测试的清除失败计数均为零,移动时间占总虚拟耗时的
|
||||||
|
$\FormalMovementMin\%$ 至 $\FormalMovementMax\%$,与演练局的构成一致,
|
||||||
|
说明"移动是主要成本"这一结论在正式环境中同样成立。
|
||||||
|
由 $L_{\mathrm{eq}}=5T_{\mathrm{move}}$ 反推等效移动距离:
|
||||||
|
问题三依次为 $12.045$、$13.627$、$10.824$ km,
|
||||||
|
问题四依次为 $36.386$、$35.507$、$35.027$ km;
|
||||||
|
对照表~\ref{tab:q3practice} 与表~\ref{tab:q4practice},
|
||||||
|
正式测试的移动量级与演练局相符(问题三约 $12$--$15$ km,问题四约 $30$--$33$ km),
|
||||||
|
表明演练局并非经过挑选的乐观样本。
|
||||||
|
该等效距离由动作计数与移动速度换算得到,不是独立轨迹测得的长度。
|
||||||
|
|
||||||
|
\subsection{正式测试结论}
|
||||||
|
六次正式测试均主动退出且清除失败计数为零。
|
||||||
|
以题目要求的直接时间指标衡量:问题三累计清除 $\QThreeCount$ 个源,
|
||||||
|
总虚拟时间 $\QThreeTotal$ s,程序运行时间合计 $\QThreeProgramTotal$ s;
|
||||||
|
问题四累计清除 $\QFourCount$ 个源,总虚拟时间 $\QFourTotal$ s,
|
||||||
|
程序运行时间合计 $\QFourProgramTotal$ s;六次合计清除 $\FormalClearCount$ 个源、
|
||||||
|
总虚拟时间 $\FormalVirtualTotal$ s。
|
||||||
|
由此可得结论:
|
||||||
|
1. 全向源场景下,七点解析覆盖与逐频道网格幸存集使三次正式测试均在时限内完成,
|
||||||
|
总虚拟时间为 $2906.863$ 至 $3493.335$ s,与演练局量级一致;
|
||||||
|
2. 混合源场景下,前向半盘最小命中集、位置与朝向联合幸存集和后备清除使三次正式测试的
|
||||||
|
总虚拟时间为 $8608.382$ 至 $9362.226$ s,明显高于全向场景,
|
||||||
|
印证了正文关于"定向遮挡仍是主要时间成本"的判断;
|
||||||
|
3. 平均定位清除时间与移动时间分解只用于解释成本结构,
|
||||||
|
优化程度的结论应以总虚拟时间、程序运行时间和清除数量为准。
|
||||||
|
由于正式数据未公开源总数与类型组成,本文不据此计算全清率或做跨问题性能排名。
|
||||||
|
|
||||||
|
\input{data/formal-file-list}
|
||||||
|
|
||||||
|
\section{自建模拟器演练局数据清单}\label{app:practice}\aigcC
|
||||||
|
本节列出正文定量结论所依据的全部演练局,共 $\PractTotalCases$ 局,
|
||||||
|
由 \pathtext{scripts/run\_practice\_episodes.py} 采集、
|
||||||
|
\pathtext{scripts/build\_practice\_data.py} 从评测机行为日志复算得到,
|
||||||
|
复算口径为题面计时模型,与日志记录的最大偏差为 $\PractMaxGap$ s。
|
||||||
|
采集时以固定种子逐局运行生产策略,判定标准为
|
||||||
|
"清完全部源 $\wedge$ 无缺席误判 $\wedge$ 主动退出 $\wedge$ 零异常 $\wedge$ 零失败清除";
|
||||||
|
本表所列 $\PractTotalCases$ 局全部满足该标准。
|
||||||
|
|
||||||
|
|
||||||
|
\input{data/practice-summary-table}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\input{data/practice-all-table}
|
||||||
|
|
||||||
|
|
||||||
|
\input{data/practice-cost-table}
|
||||||
|
|
||||||
|
|
||||||
|
\section{支撑材料与运行方法}\aigcC
|
||||||
|
\begin{table}[H]
|
||||||
|
\centering\small
|
||||||
|
\caption{支撑材料目录及用途}
|
||||||
|
\begin{tabularx}{\linewidth}{p{5.8cm}X}
|
||||||
|
\toprule
|
||||||
|
文件或目录 & 用途\\
|
||||||
|
\midrule
|
||||||
|
\pathtext{src/mcm26b/} & 四问几何、信念、覆盖、调度与串行通信实现\\
|
||||||
|
\pathtext{src/mcm26b/guarantee/plans/} & 第四问已实现的覆盖计划及验证参数\\
|
||||||
|
\pathtext{project/} & 四问“最优实现 / 基线实现”配对对比框架与结果\\
|
||||||
|
\pathtext{referee/} & 自建模拟器(评测机)实现,与官方协议同一边界\\
|
||||||
|
\pathtext{referee-data/sessions/} & 正文引用的演练局行为日志(含真值)\\
|
||||||
|
\pathtext{scripts/build_practice_data.py} & 演练局计时复算与论文数据、宏文件生成\\
|
||||||
|
\pathtext{scripts/plot_paper_figures.py} & 正文插图 matplotlib 生成脚本\\
|
||||||
|
\pathtext{scripts/audit_paper_formal.py} & 正式文件对应核对、匿名快照及表格复算\\
|
||||||
|
\pathtext{docs/figures/manifest.json} & 插图来源与生成命令清单\\
|
||||||
|
\pathtext{docs/paper/data/} & 演练局与正式案例的可读统计、表格及校验值\\
|
||||||
|
\pathtext{docs/paper/sections/} & 分章论文源文件\\
|
||||||
|
\pathtext{Jammers-simulator-full/test/} & 六份原名官方正式日志\\
|
||||||
|
\pathtext{support-manifest.json} & 支撑包文件清单及逐文件 SHA-256\\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabularx}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
正文数据与插图的复算命令如下(在项目根目录执行):
|
||||||
|
|
||||||
|
\begin{lstlisting}[language={},numbers=none]
|
||||||
|
python scripts/build_practice_data.py # 演练局复算,生成正文数据与宏文件
|
||||||
|
python scripts/plot_paper_figures.py # 生成正文全部插图
|
||||||
|
python scripts/audit_paper_formal.py --snapshot docs/paper/data/formal-results.json
|
||||||
|
python scripts/build_paper_support.py # 附录正式数据表与支撑包
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
第一条命令读取 \pathtext{referee-data/sessions/} 下的行为日志,
|
||||||
|
按题面计时模型复算每局的移动、检测、换频与清除耗时,
|
||||||
|
并输出正文引用的宏、表格行与插图数据;
|
||||||
|
第二条命令据此与覆盖计划重新绘制插图,论文不手抄图内任何数字。
|
||||||
|
第三条命令按已有快照复算正式统计并核对正式包的校验值;
|
||||||
|
第四条命令生成附录的正式数据表并打包支撑材料。
|
||||||
|
|
||||||
|
Python 运行时需要 \texttt{requests},\texttt{numpy} 提供可选加速。
|
||||||
|
将 \texttt{src} 加入 Python 模块路径后,可调用
|
||||||
|
\texttt{python -m mcm26b.geometry} 进行问题一几何分析,
|
||||||
|
或通过 \texttt{mcm26b.cli} 运行在线策略。
|
||||||
|
在线测试由模拟器界面启动,接口就绪后执行策略入口。
|
||||||
|
具体运行指令和编译步骤见支撑包的 \texttt{README.md}。
|
||||||
|
|
||||||
|
\section{AIGC 使用逐节对照}\label{app:aigc}
|
||||||
|
本附录给出正文各章与 AI 工具使用情况的完整对照,供核查。
|
||||||
|
上标码 \aigcA 对应 ChatGPT/Codex 桌面版,\aigcC 对应 DeepSeek Harness,
|
||||||
|
两者的版本、开发机构与使用日期见参考文献~\cite{aigc-chatgpt,aigc-dsh}。
|
||||||
|
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering\small
|
||||||
|
\caption{各章内容与 AI 工具使用情况对照\aigcC}
|
||||||
|
\label{tab:aigc-map}
|
||||||
|
\begin{tabularx}{\linewidth}{@{}p{0.30\linewidth} c X@{}}
|
||||||
|
\toprule
|
||||||
|
\textbf{论文位置} & \textbf{标注} & \textbf{AI 参与方式、模型与日期}\\
|
||||||
|
\midrule
|
||||||
|
摘要 & \aigcC & 文字组织与润色;\texttt{deepseek-flash},2026-09-13 \\
|
||||||
|
问题重述 & \aigcC & 文字组织;\texttt{deepseek-flash},2026-09-13 \\
|
||||||
|
问题分析 & \aigcC & 思路梳理与文字组织;\texttt{deepseek-flash},2026-09-13 \\
|
||||||
|
模型假设、符号说明 & \aigcC & 文字组织与符号统一;\texttt{deepseek-flash},2026-09-13 \\
|
||||||
|
计时模型与会话状态机 & \aigcC & 由题面与接口说明整理,含公式排版;\texttt{deepseek-flash},2026-09-13 \\
|
||||||
|
问题一 & \aigcA & 推导文档整理、定理与反例的公式编排;\texttt{gpt-6-astra},2026-09-10。LaTeX 定稿改写由 \texttt{deepseek-flash} 于 2026-09-13 完成 \\
|
||||||
|
问题二 & \aigcA & 推导文档整理、解析候选盘的公式编排;\texttt{gpt-6-astra},2026-09-10。LaTeX 定稿改写由 \texttt{deepseek-flash} 于 2026-09-13 完成 \\
|
||||||
|
问题三 & \aigcC & 算法描述重写、伪代码与公式排版;\texttt{deepseek-flash},2026-09-13 \\
|
||||||
|
问题四 & \aigcC & 算法描述重写、伪代码与公式排版;\texttt{deepseek-flash},2026-09-13 \\
|
||||||
|
实验结果与分析 & \aigcC & 数据表整理、插图绘制与文字组织;\texttt{deepseek-flash},2026-09-13 \\
|
||||||
|
模型评价与推广 & \aigcC & 文字组织;\texttt{deepseek-flash},2026-09-13 \\
|
||||||
|
附录 A(正式测试验证) & \aigcC & 正式导出包核对、表格复算与文字组织;\texttt{deepseek-flash},2026-09-13 \\
|
||||||
|
附录 B(演练局数据清单) & \aigcC & 数据清单生成与文字组织;\texttt{deepseek-flash},2026-09-13 \\
|
||||||
|
附录 C(支撑材料与运行方法) & \aigcC & 运行说明整理与去敏感化;\texttt{deepseek-flash},2026-09-13 \\
|
||||||
|
附录 D(核心程序代码) & \aigcC & 代码摘录由 \pathtext{scripts/build\_core\_notebook.py} 生成;正文实现由 \texttt{deepseek-flash} 与 \texttt{gpt-6-astra} 参与编写,2026-09-10 至 2026-09-13 \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabularx}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
说明三点。
|
||||||
|
其一,表中日期为对应内容在 AI 会话中的生成或改写日期,逐条时间、提示词与操作细节
|
||||||
|
另见本项目的《AIGC 使用合规记录》(\pathtext{docs/aigc-compliance-record.tex})。
|
||||||
|
其二,上述 AI 参与均限于文字组织、公式与代码排版、程序实现和绘图;
|
||||||
|
模型的推导结论、算法取舍与实验判断由参赛队员确认,AI 生成的程序与数据均经队员
|
||||||
|
实际运行与复算(演练局复算与评测机记录的最大计时偏差为 $0.000000$ s,见附录~\ref{app:formal})。
|
||||||
|
其三,AI 客户端的内部推理过程不作为论文依据;论文中的命题均给出可复核的证明或可复现的实验,
|
||||||
|
不以 AI 输出本身作为论据。
|
||||||
|
|
||||||
|
\section{核心程序代码}\aigcC
|
||||||
|
四问的求解核心集中在约 $5000$ 行的单文件程序中,按\textbf{公共层、几何与集合估计层、
|
||||||
|
覆盖保证层、策略层}四层组织;评测机、命令行外壳、数据采集与绘图脚本、
|
||||||
|
单元测试以及未被采用的方案不属于求解核心,不在此列出。
|
||||||
|
完整可执行程序为支撑材料中的 \pathtext{mcm26b-核心代码.ipynb},
|
||||||
|
\pathtext{src/mcm26b/} 保留与之逐字对应的模块化版本,两者函数名一一对应。
|
||||||
|
下列代码为无改动的摘录:函数体与注释与程序一致,只按核心程度取舍。
|
||||||
|
未收录的部分包括独立评测机(按附件协议复现模拟器,与求解代码零耦合)、
|
||||||
|
命令行入口、数据采集与论文绘图脚本、单元测试,以及经实测未采用的候选方案。
|
||||||
|
\input{data/source-listings}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
\section{模型评价与推广}\aigcC
|
||||||
|
\subsection{模型的有效性}
|
||||||
|
本文采用集合估计处理有界测向误差,将每次观测转化为真实位置的可行约束,
|
||||||
|
这一条主线贯穿四问。
|
||||||
|
问题一通过凸包顶点计算直径,以最小包围圆半径给出清除充分条件;
|
||||||
|
问题二将接收距离要求表示为闭圆盘的交集,并由三角不等式构造显式可行子集。
|
||||||
|
几何定位、接收约束与清除距离因此由统一的集合运算联系起来,
|
||||||
|
而不是各自独立的经验规则。
|
||||||
|
|
||||||
|
多源搜索采用覆盖点集与检测状态矩阵维护各频道的搜索进度。
|
||||||
|
网格表示可处理负观测产生的非凸可行区域,
|
||||||
|
信息增益用于选择有利于收缩候选集的测点。
|
||||||
|
开放路径排序将移动、检测、换频和清除纳入统一目标,
|
||||||
|
并在新观测到来后重新求解任务次序。
|
||||||
|
|
||||||
|
对于定向源,位置与朝向的联合约束提供可见性信息,
|
||||||
|
凸组合性质给出方格点集的连续覆盖证明,
|
||||||
|
网格遍历清除则利用清除半径与方向无关的物理条件。
|
||||||
|
这些结论在自建模拟器上完成了闭环验证:本次采集的 $44$ 局演练全部清完全部源、
|
||||||
|
失败清除为零,问题三平均总虚拟时间 $\PractQThreeMean$ s、问题四 $\PractQFourMean$ s;
|
||||||
|
配对基线对比进一步说明,几何判据的精确性、覆盖证明与任务排序三者共同决定了最终效率。
|
||||||
|
六份官方正式测试则在附录~\ref{app:formal} 中提供了正式环境下的效率验证。
|
||||||
|
|
||||||
|
\subsection{参数影响的解析讨论}
|
||||||
|
主要参数的影响可由模型公式分析。
|
||||||
|
由 $a(\delta)=1500/(2\cos\delta)$ 得
|
||||||
|
$a'(\delta)=750\sec\delta\tan\delta$,其中 $\delta$ 以弧度计。
|
||||||
|
误差半角增大会扩大源位置的包围圆,并缩小保证接收圆盘。
|
||||||
|
表~\ref{tab:safeanalytic} 给出了两位小数舍入余量对首次可行区域的影响:
|
||||||
|
$1^\circ$ 与 $1.005^\circ$ 之间的差别在毫米量级,说明该判据对舍入余量稳健。
|
||||||
|
|
||||||
|
由式~\eqref{eq:coveragebound},环半径影响覆盖路径长度和最大覆盖距离。
|
||||||
|
默认半径保留约 $15.461$ m 的距离裕量。
|
||||||
|
减小网格边长可降低 $\epsilon_g$ 并收紧位置误差上界,
|
||||||
|
而二维网格数量大致与 $\ell^{-2}$ 成正比,因此应在精度、内存和计算时间间取得平衡。
|
||||||
|
同理,问题四的 $31$ 点计划在站点数量与覆盖余量之间构成一对可调参数:
|
||||||
|
设计阶段预留的 $5^\circ$ 前向角余量越大,所需站点越多,但对朝向扰动越稳健。
|
||||||
@@ -0,0 +1,197 @@
|
|||||||
|
\section{问题一:有界误差交会定位与覆盖圆}\aigcA
|
||||||
|
\subsection{从示向度到前向角域的半平面模型}
|
||||||
|
交会定位的第一个困难在于,带误差的示向度只限制方向而不唯一确定位置。
|
||||||
|
由题设可知,示向度误差不超过 $\pm1^\circ$,故给定检测点 $s_i=(s_{ix},s_{iy})$ 与读数 $\theta_i$ 后,
|
||||||
|
真实方位必然落在 $[\theta_i-\delta,\theta_i+\delta]$ 内。据此,
|
||||||
|
真实位置属于以前向方向 $u(\theta_i)$ 为中轴的角域
|
||||||
|
\begin{equation}
|
||||||
|
W_i=\left\{g:
|
||||||
|
\begin{aligned}\relax
|
||||||
|
[u(\theta_i-\delta),g-s_i]&\ge0,\\
|
||||||
|
[u(\theta_i+\delta),g-s_i]&\le0,\\
|
||||||
|
u(\theta_i)\cdot(g-s_i)&\ge0
|
||||||
|
\end{aligned}\right\}.
|
||||||
|
\label{eq:wedge}
|
||||||
|
\end{equation}
|
||||||
|
三条不等式的意义并不相同。前两条把位置限制在左右边界之间,
|
||||||
|
第三条显式保留"只在前方"这一方向性,
|
||||||
|
从而使零误差的退化情形对应一条射线而不是整条直线。
|
||||||
|
为便于统一求解,将其改写为 $a x+b y\le c$ 的形式,法向依次为
|
||||||
|
\begin{equation}
|
||||||
|
\begin{aligned}
|
||||||
|
&(\sin(\theta_i-\delta),-\cos(\theta_i-\delta)),\\
|
||||||
|
&(-\sin(\theta_i+\delta),\cos(\theta_i+\delta)),\\
|
||||||
|
&(-\cos\theta_i,-\sin\theta_i),
|
||||||
|
\end{aligned}
|
||||||
|
\end{equation}
|
||||||
|
右端为相应法向与 $s_i$ 的内积。采用正弦、余弦表示还有一个工程上的好处:
|
||||||
|
$0^\circ$ 与 $360^\circ$ 的跨界无需特判即可自动处理。
|
||||||
|
|
||||||
|
由于所有角域都是凸的半平面交,多个测点的信息可以直接合并。
|
||||||
|
问题一的多边形定位区域因此定义为
|
||||||
|
\begin{equation}
|
||||||
|
P=\bigcap_{i=1}^{n}W_i=\{g:Ag\le b\}.
|
||||||
|
\label{eq:q1set}
|
||||||
|
\end{equation}
|
||||||
|
式~\eqref{eq:q1set} 根据各次测向角域确定问题一的定位区域;
|
||||||
|
后续问题将在此基础上加入圆域 $\Omega$ 与接收距离约束。
|
||||||
|
值得先说明的是,半平面交是闭凸集,可能为空集、单点、线段、有界多边形或无界集,
|
||||||
|
这些情形必须分别处理,否则"直径"与"覆盖圆"都没有定义。
|
||||||
|
|
||||||
|
\subsection{区域构造、空集及无界情形}
|
||||||
|
要求解式~\eqref{eq:q1set},只需枚举约束边界之间的交点再筛除不可行者。
|
||||||
|
令约束数 $k=3n$,对任意两条不平行边界
|
||||||
|
$a x+b y=c$、$d x+e y=f$,候选交点为
|
||||||
|
\begin{equation}
|
||||||
|
x=\frac{ce-bf}{ae-bd},\qquad y=\frac{af-cd}{ae-bd}.
|
||||||
|
\end{equation}
|
||||||
|
仅保留满足全部不等式的交点,再经去重和单调链凸包构造即得顶点集合。
|
||||||
|
数值上,实现先平移与缩放坐标,以降低千米尺度坐标带来的误差;
|
||||||
|
同时保留近平行边界的求交,因为其远端交点可能决定细长区域的直径。
|
||||||
|
|
||||||
|
顶点集确定之后,还需判断区域是否无界。为此对非空集合定义衰退锥
|
||||||
|
\begin{equation}
|
||||||
|
\mathcal R=\{d:Ad\le0\}.
|
||||||
|
\end{equation}
|
||||||
|
若 $\mathcal R$ 含非零向量,则 $g+td\in P$ 对所有 $t\ge0$ 成立,
|
||||||
|
区域无界、直径为 $+\infty$。二维多面锥只需检查约束边界的两个切向
|
||||||
|
$(b,-a)$ 与 $(-b,a)$ 是否满足全部齐次不等式。
|
||||||
|
由于本题至少一个前向窄角域会排除直线性,非空交集必存在极点,
|
||||||
|
故在该输入族中不存在可行边界交点却判为空集的情况;无观测输入单独返回整个平面,
|
||||||
|
不按空集处理。
|
||||||
|
|
||||||
|
有界非空区域中,一个顶点对应单点,两个顶点对应线段,其余为凸多边形。
|
||||||
|
空集没有本文定义的有效直径与覆盖圆,程序以显式状态报告观测不相容,
|
||||||
|
便于检查频道、误差界或输入数据。
|
||||||
|
|
||||||
|
\subsection{直径与直径圆的判定}
|
||||||
|
题目要求计算定位区域直径,并判断以该直径为直径的圆能否覆盖整个区域。
|
||||||
|
对前者,可以证明无需在区域内部搜索。
|
||||||
|
|
||||||
|
\begin{proposition}[顶点直径]
|
||||||
|
设 $P=\operatorname{conv}\{v_1,\ldots,v_m\}$ 非空有界,则
|
||||||
|
\begin{equation}
|
||||||
|
D(P)=\max_{i,j}\norm{v_i-v_j}.
|
||||||
|
\label{eq:diameter}
|
||||||
|
\end{equation}
|
||||||
|
\end{proposition}
|
||||||
|
\begin{proof}
|
||||||
|
任意 $x,y\in P$ 可表示为凸组合
|
||||||
|
$x=\sum_i\lambda_i v_i$、$y=\sum_j\mu_jv_j$。
|
||||||
|
由于系数非负且各自和为 $1$,
|
||||||
|
\[
|
||||||
|
\norm{x-y}
|
||||||
|
=\left\|\sum_{i,j}\lambda_i\mu_j(v_i-v_j)\right\|
|
||||||
|
\le\sum_{i,j}\lambda_i\mu_j\norm{v_i-v_j}
|
||||||
|
\le\max_{i,j}\norm{v_i-v_j}.
|
||||||
|
\]
|
||||||
|
最远顶点对本身属于 $P$,故上界可达。
|
||||||
|
\end{proof}
|
||||||
|
|
||||||
|
由命题可知,只需枚举顶点对即可,计算量为 $O(m^2)$。
|
||||||
|
至于第二个问题,结论比直觉更严格:最远顶点对的中点未必能覆盖整个区域。
|
||||||
|
|
||||||
|
\begin{proposition}[直径圆覆盖的充要条件]
|
||||||
|
取最远顶点对 $a,b$,令 $D=\norm{a-b}$、$o=(a+b)/2$。
|
||||||
|
存在直径等于 $D$ 的圆盘覆盖 $P$,当且仅当
|
||||||
|
\begin{equation}
|
||||||
|
\max_{v\in V(P)}\norm{v-o}\le D/2.
|
||||||
|
\label{eq:diametercircle}
|
||||||
|
\end{equation}
|
||||||
|
\end{proposition}
|
||||||
|
\begin{proof}
|
||||||
|
若半径 $D/2$ 的圆盘中心为 $z$ 且包含 $a,b$,则
|
||||||
|
$D\le\norm{a-z}+\norm{z-b}\le D$。
|
||||||
|
等号迫使 $z=o$。反之,圆盘为凸集,包含全部顶点即包含它们的凸包。
|
||||||
|
\end{proof}
|
||||||
|
|
||||||
|
证明过程同时说明:圆心被 $a,b$ 唯一确定,因此只需逐一检查其余顶点到该中点的距离。
|
||||||
|
若条件不成立,输出圆外顶点及超出量 $e=\max_v\norm{v-o}-D/2$,
|
||||||
|
即得到可独立检查的否定证据。换言之,不能仅以直径端点在圆周上判断整个区域被覆盖。
|
||||||
|
|
||||||
|
图~\ref{fig:q1geometry}(a)(b) 给出一组三点交会算例及其实例区域的放大,
|
||||||
|
(b) 中虚线为直径圆、实线为最小包围圆。
|
||||||
|
该算例的定位区域由 $\ExOneVertices$ 个顶点确定,直径为 $\ExOneDiameter$ m,
|
||||||
|
以该直径为直径的圆半径为 $\ExOneRadius$ m,
|
||||||
|
而最远顶点到圆心的距离超出该圆 $\ExOneExceed$ m,故直径圆并不覆盖定位区域;
|
||||||
|
其最小包围圆半径为 $\ExOneMec$ m,满足 $20$ m 的清除判据。
|
||||||
|
这说明直径不超过 $40$ m 与能否清除是两个不同的判据,覆盖判定必须逐顶点检查。
|
||||||
|
|
||||||
|
\subsection{反例与可清除半径}
|
||||||
|
上述差别并非数值巧合,而是几何上的必然。为说明这一点,
|
||||||
|
构造等边三角形
|
||||||
|
\begin{equation}
|
||||||
|
A=(0,0),\qquad B=(40,0),\qquad C=(20,20\sqrt3).
|
||||||
|
\end{equation}
|
||||||
|
其直径为 $40$ m。以 $AB$ 为直径的圆心为 $(20,0)$,半径为 $20$ m,
|
||||||
|
但 $C$ 到圆心的距离为 $20\sqrt3$ m,位于圆外。
|
||||||
|
其最小包围圆圆心为 $(20,20/\sqrt3)$,半径
|
||||||
|
$40/\sqrt3\approx23.094$ m,同样大于清除半径。
|
||||||
|
图~\ref{fig:q1geometry}(c) 展示两类圆的差别。
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=\linewidth]{geo-q1-geometry.png}
|
||||||
|
\caption{问题一的几何算例。(a) 三点交会:三条浅色示向度的角域边界与它们的交集(定位区域),
|
||||||
|
观测取自自建模拟器演练局 \texttt{8VRC-ADW4-XDXM-F62L} 的频道 $\ExOneChannel$;
|
||||||
|
(b) 该定位区域的放大:虚线为直径圆、实线为最小包围圆,
|
||||||
|
几何量由生产求解器 \texttt{mcm26b.geometry.solve} 现算;
|
||||||
|
(c) 等边三角形解析反例:虚线直径圆 $r=20$ m 不覆盖顶点 $C$,
|
||||||
|
实线最小包围圆 $\rho=40/\sqrt3\approx23.094$ m 覆盖全部顶点,该图不是模拟器观测。}
|
||||||
|
\label{fig:q1geometry}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
该三角形并非人为设定的特例,它可以由题设的 $\pm1^\circ$ 角域构造出来。例如检测点
|
||||||
|
$(-1000,0)$、$(540,-500\sqrt3)$、$(520,520\sqrt3)$,
|
||||||
|
对应示向度为 $1^\circ$、$121^\circ$、$241^\circ$。
|
||||||
|
各角域的一侧边界给出三角形的三条支撑线,另一侧边界包含整个三角形,
|
||||||
|
故交集恰为上述三角形。
|
||||||
|
|
||||||
|
既然覆盖判据不足以保证清除,就需要一个与清除动作直接对应的指标。
|
||||||
|
为此对一般候选区域定义最小包围圆
|
||||||
|
\begin{equation}
|
||||||
|
\rho(P)=\min_{z\in\mathbb R^2}\max_{g\in P}\norm{g-z},\qquad
|
||||||
|
m\in\arg\min_z\max_{g\in P}\norm{g-z}.
|
||||||
|
\label{eq:mec}
|
||||||
|
\end{equation}
|
||||||
|
其边界由至多三个支撑点确定,可用 Welzl 随机增量算法计算\cite{welzl}。
|
||||||
|
实现采用固定随机种子及显式栈,并在输出前检查全部顶点的包含关系。
|
||||||
|
在精确模型中,若 $\rho(P)\le20$,于 $m$ 清除即可覆盖所有可能真源;
|
||||||
|
考虑浮点计算后采用 $\rho(P)+\eta_{\mathrm{num}}\le20$ 的充分判据。
|
||||||
|
由此可见,$D(P)\le40$ 只是必要条件,并非充分条件。
|
||||||
|
|
||||||
|
\subsection{算法一与复杂度}
|
||||||
|
将上述判定串成流程,即得问题一的求解算法。
|
||||||
|
|
||||||
|
\begin{algorithm}[htbp]
|
||||||
|
\caption{有界测向角域交会与覆盖圆判定}
|
||||||
|
\label{alg:q1}
|
||||||
|
\begin{algorithmic}[1]
|
||||||
|
\Require 同一频道的检测点、示向度和误差半角
|
||||||
|
\Ensure 区域状态、顶点、直径、直径圆判定与最小包围圆
|
||||||
|
\If{观测为空}
|
||||||
|
\State \Return 无界
|
||||||
|
\EndIf
|
||||||
|
\State 归一化坐标,生成 $3n$ 条半平面约束
|
||||||
|
\State 枚举非平行边界交点,仅保留满足全部约束的点
|
||||||
|
\If{无可行点}
|
||||||
|
\State \Return 空集
|
||||||
|
\EndIf
|
||||||
|
\State 检查衰退锥;若存在非零方向,\Return 无界及无穷直径
|
||||||
|
\State 对可行交点去重并求凸包,区分单点、线段和二维多边形
|
||||||
|
\State 枚举最远顶点对,计算 $D$ 与中点 $o$,检查全部顶点是否在 $\B(o,D/2)$ 内
|
||||||
|
\State 计算最小包围圆 $\B(m,\rho)$,复核包含关系与数值余量
|
||||||
|
\State \Return $\rho+\eta_{\mathrm{num}}\le20$ 是否成立
|
||||||
|
\end{algorithmic}
|
||||||
|
\end{algorithm}
|
||||||
|
|
||||||
|
边界交点枚举需 $O(k^2)$ 次,每点校验 $k$ 条约束,主计算量为 $O(k^3)$;
|
||||||
|
凸包最坏需 $O(k^2\log k)$,直径枚举需 $O(m^2)$。
|
||||||
|
Welzl 算法在随机排列下具有期望线性时间。该求解流程适合少量观测,
|
||||||
|
当前入口限制最多 $100$ 个检测点;更大规模可替换半平面交算法。
|
||||||
|
|
||||||
|
综上,问题一给出两点结论:1. 带误差交会定位的直径可由顶点对枚举精确得到,
|
||||||
|
覆盖判定则必须逐顶点检查;2. 与清除动作真正对应的判据是最小包围圆半径不超过 $20$ m,
|
||||||
|
直径约束只是它的必要条件。
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,198 @@
|
|||||||
|
\section{问题二:保证接收的第二检测点选择}\aigcA
|
||||||
|
\subsection{候选位置集合与安全区域}
|
||||||
|
问题一说明了如何由多次观测确定位置,问题二则提出一个更早的问题:
|
||||||
|
在只测过一次的情况下,第二点应当选在哪里。
|
||||||
|
这里存在一对相互牵制的目标:若只追求大交会角,第二点可能远离源而收不到信号;
|
||||||
|
若只求保证接收,又可能缺少横向基线。要同时处理两者,
|
||||||
|
第一步是先刻画"由首次观测能推断出哪些位置"。
|
||||||
|
设首次有效示向度为 $(s,\theta)$,则有效读数除限定角域外,
|
||||||
|
还说明源距检测点不超过接收半径上界,故
|
||||||
|
\begin{equation}
|
||||||
|
K_1=\Omega\cap W(s,\theta,\delta_{\mathrm{eff}})\cap\B(s,R_+).
|
||||||
|
\label{eq:k1}
|
||||||
|
\end{equation}
|
||||||
|
其中 $R_+=1500$ 为有效接收半径上界。
|
||||||
|
$\direction$ 对应距离大于 $5$ m;式~\eqref{eq:k1} 采用其凸松弛,
|
||||||
|
使真实可行位置始终包含在所维护的候选集合中。
|
||||||
|
采用凸松弛而非精确的"挖去 $5$ m 小圆",是为了让后续的圆盘交运算保持凸性。
|
||||||
|
|
||||||
|
有了候选集合,第二步是把"保证接收"写成集合条件。
|
||||||
|
对非空紧集 $K$ 定义
|
||||||
|
\begin{equation}
|
||||||
|
F_K(q)=\max_{g\in K}\norm{q-g},\qquad
|
||||||
|
\mathcal Q(K)=\{q:F_K(q)\le R_-\}
|
||||||
|
=\bigcap_{g\in K}\B(g,R_-).
|
||||||
|
\label{eq:exact-safe}
|
||||||
|
\end{equation}
|
||||||
|
该区域内的任何点均在所有可能真源的最小接收范围内。
|
||||||
|
$F_K$ 是凸函数且为 $1$-Lipschitz,因而 $\mathcal Q(K)$ 是闭凸集。
|
||||||
|
由式~\eqref{eq:mec} 可知
|
||||||
|
\begin{equation}
|
||||||
|
\mathcal Q(K)\ne\varnothing\quad\Longleftrightarrow\quad\rho(K)\le R_-.
|
||||||
|
\end{equation}
|
||||||
|
这一步把第二点的鲁棒可行性转化为问题一已经解决的最小包围圆判据\cite{boyd},
|
||||||
|
两个问题由此共用同一套几何工具。
|
||||||
|
|
||||||
|
在线执行时,还需把解析区域换成可快速裁剪的表示。
|
||||||
|
为此用外切正多边形表示圆盘,再逐半平面裁剪。
|
||||||
|
若边数为 $M$、圆半径为 $r$,外切多边形顶点的半径为
|
||||||
|
$r\sec(\pi/M)$,其最大径向超出量准确写为
|
||||||
|
\begin{equation}
|
||||||
|
e_M(r)=r\bigl(\sec(\pi/M)-1\bigr).
|
||||||
|
\label{eq:outer-error}
|
||||||
|
\end{equation}
|
||||||
|
默认 $M=192$。由于整个圆盘已包含在多边形中,
|
||||||
|
裁剪后得到 $K_1\subseteq P^{\mathrm{out}}$。
|
||||||
|
算法求外包多边形 $P^{\mathrm{out}}$ 的最小包围圆 $\B(m,\rho_{\mathrm{out}})$。
|
||||||
|
|
||||||
|
在此基础上,由三角不等式可直接得到一个保守但显式的安全盘。充分安全盘为
|
||||||
|
\begin{equation}
|
||||||
|
\mathcal Q_{\mathrm{in}}
|
||||||
|
=\B\!\left(m,R_- -\rho_{\mathrm{out}}-\eta\right),\qquad
|
||||||
|
\eta=10^{-3}\ {\rm m}.
|
||||||
|
\label{eq:safe-disk}
|
||||||
|
\end{equation}
|
||||||
|
任意 $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$,考虑 $S=W(s,\theta,\delta)\cap\B(s,R_+)$,
|
||||||
|
它的形状是一个被圆弧截断的角域。当 $0\le\delta\le45^\circ$,令
|
||||||
|
\begin{equation}
|
||||||
|
a=\frac{R_+}{2\cos\delta},\qquad c=s+a\,u(\theta).
|
||||||
|
\end{equation}
|
||||||
|
即可得到该区域的最小包围圆。
|
||||||
|
|
||||||
|
\begin{proposition}[截断角域最小包围圆]
|
||||||
|
上述 $S$ 的最小包围圆为 $\B(c,a)$。
|
||||||
|
\end{proposition}
|
||||||
|
\begin{proof}
|
||||||
|
任取 $g=s+t u(\theta+\varphi)$,其中 $0\le t\le R_+$、
|
||||||
|
$|\varphi|\le\delta$。有
|
||||||
|
$\norm{g-c}^2=t^2+a^2-2at\cos\varphi$。
|
||||||
|
该式关于 $t$ 为凸二次式,最大值在区间端点取得。
|
||||||
|
$t=0$ 时为 $a^2$;$t=R_+$ 时不超过
|
||||||
|
$R_+^2+a^2-2aR_+\cos\delta=a^2$,故全域被包含。
|
||||||
|
|
||||||
|
再取边界三点 $s,p_\pm=s+R_+u(\theta\pm\delta)$。
|
||||||
|
权重
|
||||||
|
$\lambda_\pm=1/(4\cos^2\delta)$、
|
||||||
|
$\lambda_0=1-1/(2\cos^2\delta)$ 非负且和为 $1$,
|
||||||
|
其加权中心为 $c$。三点均距 $c$ 为 $a$,
|
||||||
|
对任意圆心 $z$,加权平方距离等于 $a^2+\norm{z-c}^2$,
|
||||||
|
故至少一点距 $z$ 不小于 $a$。任何包含三点的圆半径均不小于 $a$。
|
||||||
|
\end{proof}
|
||||||
|
|
||||||
|
由于 $K_1\subseteq S$,于是
|
||||||
|
\begin{equation}
|
||||||
|
\boxed{
|
||||||
|
q\in\B\!\left(s+\frac{1500}{2\cos\delta}u(\theta),
|
||||||
|
1000-\frac{1500}{2\cos\delta}\right)}
|
||||||
|
\label{eq:q2-answer}
|
||||||
|
\end{equation}
|
||||||
|
即为题目所求的一种明确候选区域,实际使用时再内缩 $1$ mm。
|
||||||
|
该圆盘构成 $\mathcal Q(K_1)$ 的一个显式凸子集。
|
||||||
|
表~\ref{tab:safeanalytic} 给出两种误差半角下的具体数值。
|
||||||
|
可以看到,误差从 $1^\circ$ 放宽到 $1.005^\circ$ 时,
|
||||||
|
圆心偏移仅增加约 $0.001$ m,候选盘半径仅减少约 $0.001$ m,
|
||||||
|
说明该判据对题设的舍入余量并不敏感。
|
||||||
|
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering\small
|
||||||
|
\caption{解析安全盘参数,由式~\eqref{eq:q2-answer} 直接计算}
|
||||||
|
\begin{tabular}{lrr}
|
||||||
|
\toprule
|
||||||
|
误差半角 & 中心沿首次方向偏移 $a$/m & 候选盘半径/m\\
|
||||||
|
\midrule
|
||||||
|
$1^\circ$ & 750.114246 & 249.885754\\
|
||||||
|
$1.005^\circ$ & 750.115391 & 249.884609\\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\label{tab:safeanalytic}
|
||||||
|
\end{table}
|
||||||
|
在线算法继续使用 $\Omega$ 裁剪后的完整候选形状,
|
||||||
|
通常能够获得更紧的源包围圆与更大的充分安全盘。
|
||||||
|
两者的分工是清楚的:解析公式负责解释保证为何存在,
|
||||||
|
多边形流程负责利用已有的全部几何约束。
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.70\linewidth]{geo-q2-guaranteed-reception-disk.png}
|
||||||
|
\caption{第二点解析候选区域。左图为首次截断角域 $S$、
|
||||||
|
其最小包围圆 $\B(c,a)$ 与保证接收的候选盘 $\B(c,1000-a)$;
|
||||||
|
右图为半径分解,$a=1500/(2\cos\delta)$。取 $\delta=1^\circ$ 时
|
||||||
|
$a\approx750.114$ m、$1000-a\approx249.886$ m,与表~\ref{tab:safeanalytic} 一致。}
|
||||||
|
\label{fig:q2disk}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{定位效果指标与有限候选求解}
|
||||||
|
保证接收只解决了一半问题,另一半是"在安全区域内如何让第二次观测最有效"。
|
||||||
|
理想的鲁棒选点模型为
|
||||||
|
\begin{equation}
|
||||||
|
\min_{q\in\mathcal Q_{\mathrm{in}}}
|
||||||
|
\left(\sup_{y\in\mathcal Y(q,K_1)}\rho(K_1\cap O(q,y)),
|
||||||
|
\frac{\norm{q-p}}{5}\right)_{\mathrm{lex}},
|
||||||
|
\label{eq:q2minimax}
|
||||||
|
\end{equation}
|
||||||
|
其中 $p$ 是当前机器人位置,$y$ 表示可能观测,
|
||||||
|
$O(q,y)$ 为相应观测可行集,下标表示按字典序比较:
|
||||||
|
先最小化最坏后验半径,再减少移动耗时。
|
||||||
|
方向分支取相应角域,近距离分支取 $\B(q,5)$。
|
||||||
|
这比仅优化交会角更直接地对应最终清除需求。
|
||||||
|
|
||||||
|
连续极小极大问题求解成本较高,当前算法采用有限候选近似。
|
||||||
|
在式~\eqref{eq:safe-disk} 的盘心及半径比例
|
||||||
|
$0.4,0.75,1.0$ 的三个环上各取 $12$ 个方向,
|
||||||
|
角度为 $(k+\tfrac12)2\pi/12$,共 $37$ 点。
|
||||||
|
对每个候选 $q$,在 $P^{\mathrm{out}}$ 边界以不大于 $60$ m 的间距采样,
|
||||||
|
包含全部顶点。对边界采样点 $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{离散近似},
|
||||||
|
只用于比较有限候选点的定位效果;接收条件由式~\eqref{eq:safe-disk} 保证,
|
||||||
|
不受该近似影响。
|
||||||
|
|
||||||
|
\begin{algorithm}[htbp]
|
||||||
|
\caption{保证接收的第二检测点选择}
|
||||||
|
\label{alg:q2}
|
||||||
|
\begin{algorithmic}[1]
|
||||||
|
\Require 首次测点与示向度,或已更新的候选凸外包;当前位置
|
||||||
|
\Ensure 下一检测点、采样后验评分与接收保证状态
|
||||||
|
\State 初次调用时构造 $K_1$ 的外包多边形;后续调用沿用已有外包
|
||||||
|
\State 计算最小包围圆 $\B(m,\rho_{\mathrm{out}})$ 与安全盘半径 $b=1000-\rho_{\mathrm{out}}-10^{-3}$
|
||||||
|
\If{$b<0$}
|
||||||
|
\State 在候选区域圆心追加观测
|
||||||
|
\Else
|
||||||
|
\State 生成 $37$ 个安全候选点
|
||||||
|
\For{每个候选点 $q$}
|
||||||
|
\State 枚举外包边界样本与方向端点读数,补入近距离分支
|
||||||
|
\State 计算最坏后验半径 $\widehat J(q)$
|
||||||
|
\EndFor
|
||||||
|
\State 按后验评分优先、移动时间次优选点,并以 $15$ m 采样间距复核
|
||||||
|
\EndIf
|
||||||
|
\State 获得新观测后更新候选集
|
||||||
|
\If{观测为 $\near$}
|
||||||
|
\State 就地清除
|
||||||
|
\Else
|
||||||
|
\State 根据最小包围半径决定清除或追加测量
|
||||||
|
\EndIf
|
||||||
|
\end{algorithmic}
|
||||||
|
\end{algorithm}
|
||||||
|
|
||||||
|
若候选数为 $N_q$、边界样本数为 $N_g$、多边形顶点数为 $m$,
|
||||||
|
一次裁剪为 $O(m)$,总计算量主要为
|
||||||
|
$O(N_qN_g(m+C_{\mathrm{MEC}}(m)))$。
|
||||||
|
该算法复用问题一的角域模型与最小包围圆方法,通过多边形裁剪逐次更新候选集。
|
||||||
|
|
||||||
|
综上,问题二得到两点结论:1. "对所有可能真源均保证接收"等价于候选集合的最小包围圆半径不超过 $1000$ m,
|
||||||
|
据此可给出半径约 $249.885$ m 的显式安全候选盘;
|
||||||
|
2. 在安全盘内以最坏后验半径为第一目标、移动时间为第二目标选点,
|
||||||
|
既避免了"收不到信号"的失败模式,又保证了交会基线。
|
||||||
@@ -0,0 +1,210 @@
|
|||||||
|
\section{问题三:全向多源的网格滤波与滚动调度}\aigcC
|
||||||
|
\subsection{统一时间目标与任务状态}
|
||||||
|
问题一、二分别给出了"能否清除"与"下一点选在哪里"的判据,
|
||||||
|
问题三把它们放进一个连续运行的闭环:源的数量未知,机器人必须自己决定何时发现、何时定位、何时清除。
|
||||||
|
在这样的任务中,优化的最终标准不是某一步的精度,而是完成任务所花的虚拟时间,
|
||||||
|
因此第一步是把时间写成可优化的目标。
|
||||||
|
按式~\eqref{eq:time} 的计时记账,优化目标是在全部源清除的约束下最小化虚拟耗时 $T$。
|
||||||
|
题目统计的平均定位清除时间是 $\bar T=T/N_c^+$;
|
||||||
|
由于清除动作本身的 $5$ s 是常数,该平均值不能代替总虚拟时间作为优化目标。
|
||||||
|
清除请求中的频道是目标频道,不改变测向机频道;
|
||||||
|
进入与退出均不增加虚拟时间,因此路径终点自由,无需返回原点。
|
||||||
|
这一自由度允许我们把任务序列当作开放路径而非回路来处理。
|
||||||
|
|
||||||
|
在时间目标之外,还需要一套能表达"这条频道到底还有没有源"的状态。
|
||||||
|
为此各频道的状态按"未知、已发现、可清除、已清除、已证无源"管理。
|
||||||
|
首次获得 $\direction$ 或 $\near$ 即确立该频道存在源。
|
||||||
|
最小包围圆判据决定清除时机,成功响应将状态更新为已清除。
|
||||||
|
频道的候选集为空,或其所有覆盖站检测结果均为无信号时,可判定该频道无源。
|
||||||
|
后一条判据依赖下一小节的覆盖证明,是本问题效率的关键:
|
||||||
|
只有能够严格举证"不存在",才能放心地停止检测。
|
||||||
|
|
||||||
|
当前测试程序默认采用 \texttt{BayesLoop}:七点计划只作为解析覆盖与无源举证;
|
||||||
|
证据层同时维护便于判据计算的凸候选集与逐频道网格幸存集,
|
||||||
|
后者统一吸收正负观测,负观测按最小接收半径删除整格,
|
||||||
|
候选集为空即给出缺席证明。定位测量按信息增益与移动代价选点,
|
||||||
|
覆盖、定位与清除三类任务组成统一任务表,用开放路径 2-opt 滚动重排,
|
||||||
|
并不执行七个站点对所有频道逐一全扫描的固定流程。
|
||||||
|
|
||||||
|
\subsection{七点解析覆盖与无源证据}
|
||||||
|
"证明某频道无源"要求对圆域内任意位置都保证有站点能收到信号。
|
||||||
|
为达到这一目的,取站点集合
|
||||||
|
\begin{equation}
|
||||||
|
S(a)=\{(0,0)\}\cup
|
||||||
|
\left\{a\left(\cos\frac{k\pi}{3},\sin\frac{k\pi}{3}\right):k=0,\ldots,5\right\}.
|
||||||
|
\label{eq:seven}
|
||||||
|
\end{equation}
|
||||||
|
即原点加正六边形顶点,共七点。其覆盖能力可以精确刻画。
|
||||||
|
|
||||||
|
\begin{proposition}[七点全向覆盖]
|
||||||
|
当 $0<a/\sqrt3\le R$ 时,任意 $g\in\Omega$ 到最近站点的距离不超过
|
||||||
|
\begin{equation}
|
||||||
|
D_{\mathrm{cov}}(a)=
|
||||||
|
\max\left\{\frac a{\sqrt3},\
|
||||||
|
\sqrt{R^2+a^2-\sqrt3Ra}\right\}.
|
||||||
|
\label{eq:coveragebound}
|
||||||
|
\end{equation}
|
||||||
|
\end{proposition}
|
||||||
|
\begin{proof}
|
||||||
|
设 $g$ 距原点为 $r$,其方位与最近环站的夹角不超过 $\pi/6$。
|
||||||
|
若 $r\le a/\sqrt3$,选取原点即可。
|
||||||
|
若 $r\ge a/\sqrt3$,由余弦定理,距最近环站的平方不超过
|
||||||
|
$r^2+a^2-\sqrt3ar$。
|
||||||
|
该凸二次式在 $[a/\sqrt3,R]$ 上的最大值于端点取得,
|
||||||
|
分别为 $a^2/3$ 与 $R^2+a^2-\sqrt3aR$。
|
||||||
|
\end{proof}
|
||||||
|
|
||||||
|
命题给出了一个可调的覆盖半径。当前 \texttt{bayes} 策略取 $a=1159.7$ m,
|
||||||
|
由式~\eqref{eq:coveragebound} 得 $D_{\mathrm{cov}}=984.539136$ m,
|
||||||
|
比最小接收半径小约 $15.461$ m。
|
||||||
|
因此每个合法全向源至少在一站可被接收。
|
||||||
|
某频道在七站全部为无信号,就构成该频道不存在源的严格证据。
|
||||||
|
以"站点、频道"为索引建立检测状态矩阵,记录各站对各频道的检测结果。
|
||||||
|
该矩阵用于逐频道的严格缺席证明;实际执行不要求在每个站点重测所有频道,
|
||||||
|
可由网格幸存集证明必为无信号的(站,频道)对会被跳过。
|
||||||
|
|
||||||
|
顺次从原点访问六个环站的开放路径长为 $6a$;
|
||||||
|
任务总路径由覆盖站间移动以及定位、清除所需的局部移动共同构成。
|
||||||
|
|
||||||
|
\subsection{正负观测的双重候选表示}
|
||||||
|
覆盖证明只回答"源是否可能被听见",要把一次具体检测转化为位置信息,
|
||||||
|
还需要更新候选集合。每个已发现频道维护凸外包 $P_c^{\mathrm{out}}$。
|
||||||
|
$\direction$ 将候选集与 $\B(s,1500)$ 外切多边形及测向角域相交;
|
||||||
|
$\near$ 与 $\B(s,5)$ 外切多边形相交。
|
||||||
|
难点在于全向源的 $\sgnless$ 观测,它意味着
|
||||||
|
\begin{equation}
|
||||||
|
\norm{g-s}>r_{\mathrm{eff}}\ge1000,
|
||||||
|
\end{equation}
|
||||||
|
即排除一个圆盘。圆盘的补集不凸,直接与凸候选集求交会破坏凸性。
|
||||||
|
为此,采用网格幸存集 $\mathcal G_c$ 表示负观测带来的空间约束,
|
||||||
|
同时保留便于几何运算的凸外包:前者负责吸收负信息,后者负责快速判据与选点。
|
||||||
|
|
||||||
|
网格边长为 $\ell=14.65$ m,每格中心与格内点的最大距离为
|
||||||
|
$\epsilon_g=\ell/\sqrt2$。初始保留所有可能与 $\Omega$ 相交的格,
|
||||||
|
按以下充分排除条件更新格心 $z$:
|
||||||
|
\begin{equation}
|
||||||
|
\begin{array}{ll}
|
||||||
|
\sgnless: & \norm{z-s}\le1000-\epsilon_g\ \Rightarrow\ \text{删除};\\
|
||||||
|
\near: & \norm{z-s}>5+\epsilon_g\ \Rightarrow\ \text{删除};\\
|
||||||
|
\direction: & \norm{z-s}>1500+\epsilon_g\ \Rightarrow\ \text{删除}.
|
||||||
|
\end{array}
|
||||||
|
\label{eq:gridupdate}
|
||||||
|
\end{equation}
|
||||||
|
三式的裕量 $\epsilon_g$ 保证只有整格必然越界时才删除,故真源所在格永不被误删。
|
||||||
|
方向观测另外检查角差。若 $d=\norm{z-s}>\epsilon_g$,
|
||||||
|
源所在格引起的方位偏差可由 $\arcsin(\epsilon_g/d)$ 上界;
|
||||||
|
实现采用距离内缩后的角误差界,并在测点附近保留所有可能方位。
|
||||||
|
只有角差超过 $\delta_{\mathrm{eff}}$ 加格内角裕量时才删除。
|
||||||
|
|
||||||
|
上述排除条件保持真源所在网格的可行性。
|
||||||
|
因此网格幸存集为空时,该频道无源。
|
||||||
|
若全部候选格心均满足 $\norm{z-s}>1500+\epsilon_g$,
|
||||||
|
则在 $s$ 测量必无信号,且所有候选网格已在最小接收圆盘外,
|
||||||
|
其观测的信息增益为零,可在检测状态矩阵中标记该推断结果,
|
||||||
|
从而节省相应检测与换频时间。
|
||||||
|
|
||||||
|
\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),
|
||||||
|
\label{eq:ig}
|
||||||
|
\end{equation}
|
||||||
|
其中 $\lambda=0.05$,空分支用正的小值截断。
|
||||||
|
较小的候选集基数比对应较大信息增益,移动项限制为测量而产生的绕行。
|
||||||
|
评分最多取 $800$ 个子样本及 $7$ 个代表假设,
|
||||||
|
并以均匀 $r_{\mathrm{eff}}\in[1000,1500]$ 估计接收概率。
|
||||||
|
该决策采用离散假设上的加权期望,接收半径的均匀分布作为选点先验。
|
||||||
|
|
||||||
|
清除判断使用完整候选集合。由于清除要求在 $20$ m 内完成,
|
||||||
|
判据必须同时计入几何半径与数值余量。凸候选集的清除判据为
|
||||||
|
\begin{equation}
|
||||||
|
\rho_c+b_c+0.5\le20,
|
||||||
|
\label{eq:clearpoly}
|
||||||
|
\end{equation}
|
||||||
|
其中 $b_c\ge0$ 为代码的累计附加余量。
|
||||||
|
凸多边形包含真源,$\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$;
|
||||||
|
只要平移后的距离上界仍满足对应不等式,三角不等式便保证清除条件成立。
|
||||||
|
|
||||||
|
\subsection{开放路径上的滚动任务排序}
|
||||||
|
到这一步,每个频道都已知"是否需要检测、在哪里检测、何时清除",
|
||||||
|
剩下的问题是如何把这些动作排成一条省时的路线。
|
||||||
|
统一任务表包含三类任务:覆盖站的批量扫频、已发现源的定位测量、
|
||||||
|
满足半径条件的清除。站内检测优先使用测向机当前频道,减少换频次数。
|
||||||
|
对任务序列 $\pi$,排序代价为
|
||||||
|
\begin{equation}
|
||||||
|
C(\pi)=\frac{\norm{p-q_{\pi_1}}}{5}
|
||||||
|
+\sum_{j=1}^{k-1}\frac{\norm{q_{\pi_j}-q_{\pi_{j+1}}}}5
|
||||||
|
+\sum_{j=1}^{k}t_{\pi_j}(c_{j-1}),
|
||||||
|
\label{eq:route}
|
||||||
|
\end{equation}
|
||||||
|
其中服务时间 $t_{\pi_j}$ 依赖进入任务时的频道,清除不改变该频道。
|
||||||
|
从最近邻初序开始,默认最多进行 $4$ 轮开放路径 2-opt 改进;
|
||||||
|
每次只执行当前序列的首任务,得到新观测后重新生成和排序。
|
||||||
|
这样新发现的源、收缩后的清除点和已证无源的频道都能及时改变路线,
|
||||||
|
避免为一条已经失效的任务继续赶路。
|
||||||
|
|
||||||
|
已停靠位置可以顺带补测:要求此前未在该位置测过、距离保证成立、
|
||||||
|
尚处于定位阶段,且预测半径有足够收缩。追加测量的费用为检测与换频时间,
|
||||||
|
其收益来自节省额外移动。题设固定同地误差,因此优先选择新的检测位置。
|
||||||
|
|
||||||
|
\subsection{算法三与完成条件}
|
||||||
|
将上述模块串成闭环,即得问题三的求解算法。
|
||||||
|
|
||||||
|
\begin{algorithm}[htbp]
|
||||||
|
\caption{网格幸存集滤波、信息增益选点与滚动调度}
|
||||||
|
\label{alg:q3}
|
||||||
|
\begin{algorithmic}[1]
|
||||||
|
\Require 题设参数、七站计划与合法观测接口
|
||||||
|
\Ensure 逐频道处理状态与会话统计
|
||||||
|
\State 检验七点覆盖条件,初始化频道状态、凸候选集、网格幸存集和检测状态矩阵
|
||||||
|
\State 调用 $/enter$,记录位置、频道和剩余现实预算
|
||||||
|
\While{存在未处理频道且预算充足}
|
||||||
|
\State 构建覆盖、定位和清除三类任务
|
||||||
|
\State 用网格幸存集跳过必为无信号的检测
|
||||||
|
\State 按最近邻与开放路径 2-opt 排序任务表
|
||||||
|
\State 执行首任务,根据真实响应更新凸候选集与网格幸存集
|
||||||
|
\If{满足清除判据}
|
||||||
|
\State 执行清除;成功则更新状态,失败则追加观测
|
||||||
|
\EndIf
|
||||||
|
\If{已清除 $16$ 个源或所有频道均被清除或证明无源}
|
||||||
|
\State \Return 报告完成状态
|
||||||
|
\EndIf
|
||||||
|
\EndWhile
|
||||||
|
\State 预算不足或异常时退出并报告未解决频道
|
||||||
|
\end{algorithmic}
|
||||||
|
\end{algorithm}
|
||||||
|
|
||||||
|
"清除数达到 $16$"利用题设数量上界。
|
||||||
|
对任意已存在的 $16$ 个不同频道,也可提前排除其余未知频道,
|
||||||
|
但已发现而未清除的源仍必须继续处理。
|
||||||
|
|
||||||
|
覆盖条件用于判定搜索范围,清除充分条件用于确定操作位置。
|
||||||
|
当前每轮追加有效定位测量上限为 $8$;
|
||||||
|
停滞、协议异常或预算耗尽时,记录各频道状态并终止。
|
||||||
|
程序以接口返回的现实预算为准,并预留退出时间,
|
||||||
|
实际计时在整数微秒状态上累计,避免用实机运行秒数代替虚拟动作耗时。
|
||||||
|
|
||||||
|
综上,问题三得到三点结论:1. 七点计划在环半径 $1159.7$ m 时给出 $984.539$ m 的覆盖上界,
|
||||||
|
使"全站无信号"成为该频道缺席的严格证据;2. 网格幸存集把非凸的负观测纳入集合估计,
|
||||||
|
并使大量必然无信号的检测被跳过;3. 把覆盖、定位、清除统一为一条开放路径并滚动重排,
|
||||||
|
是压缩总虚拟时间的主要手段。
|
||||||
@@ -0,0 +1,229 @@
|
|||||||
|
\section{问题四:混合源的前向半盘覆盖与联合信念}\aigcC
|
||||||
|
\subsection{定向观测模型与无信号歧义}
|
||||||
|
在问题三中,"无信号"只有一种解释:源太远。
|
||||||
|
一旦引入定向源,这唯一的解释就被打破——源可能只是背对着检测点。
|
||||||
|
因此本问的关键在于为无信号保留第二种解释。
|
||||||
|
设定向源位于 $g$,朝向为 $\psi$。在检测点 $q$ 可见的充要条件为
|
||||||
|
\begin{equation}
|
||||||
|
\norm{q-g}\le r_{\mathrm{eff}},\qquad
|
||||||
|
(q-g)\cdot u(\psi)\ge0.
|
||||||
|
\label{eq:visibility}
|
||||||
|
\end{equation}
|
||||||
|
边界属于可见半平面。可见且距离不超过 $5$ m 时返回 $\near$,
|
||||||
|
否则返回 $\direction$;任何一个条件失败均为 $\sgnless$。
|
||||||
|
问题二的可行区域满足距离约束,定向接收还需满足前向半平面约束。
|
||||||
|
对于已发现频道,位于该区域内的负观测反映朝向遮挡,
|
||||||
|
因此不应被当作距离证据;区域外的负观测则同时包含距离与朝向两种解释。
|
||||||
|
这一区分直接决定了后续信念表示的形式。
|
||||||
|
|
||||||
|
朝向约束也改变了覆盖的要求。问题三的七点计划只保证"至少一站距离足够近";
|
||||||
|
对定向源还要求该站位于源的前向半平面内,因此需要重新设计站点集。
|
||||||
|
向外发射的边界源需要在圆域外布置接收站点。
|
||||||
|
适用于混合源的站点集合 $S$ 应满足
|
||||||
|
\begin{equation}
|
||||||
|
\forall g\in\Omega,\ \forall\psi\in[0,2\pi),\
|
||||||
|
\exists s\in S:\quad
|
||||||
|
\norm{s-g}\le1000,\quad (s-g)\cdot u(\psi)\ge0.
|
||||||
|
\label{eq:halfcover}
|
||||||
|
\end{equation}
|
||||||
|
这是一项针对"位置、朝向"二元状态的全覆盖要求,而不是对位置的单变量覆盖。
|
||||||
|
|
||||||
|
问题三的七点计划不满足式~\eqref{eq:halfcover};当前测试程序改用 $31$ 点最小命中集与(位置×朝向)联合幸存集,
|
||||||
|
定位停滞时以有限格后备清除兜底。
|
||||||
|
|
||||||
|
\subsection{方格点集的连续覆盖性}
|
||||||
|
在设计具体站点之前,先考虑一个容易证明的结构:方格点集。
|
||||||
|
取 $S_{49}=\{(700i,700j):i,j=-3,\ldots,3\}$。
|
||||||
|
其网格方域包含 $\Omega$,每个源落在某个边长为 $700$ m 的闭方格内。
|
||||||
|
方格四角恰好同时满足距离与朝向两项要求。
|
||||||
|
|
||||||
|
\begin{proposition}[方格四角的定向覆盖]
|
||||||
|
$S_{49}$ 满足式~\eqref{eq:halfcover},对全向与任意朝向的定向源均保证发现。
|
||||||
|
\end{proposition}
|
||||||
|
\begin{proof}
|
||||||
|
设包含 $g$ 的方格四角为 $v_1,\ldots,v_4$。
|
||||||
|
四角距 $g$ 均不超过对角线长 $700\sqrt2<1000$。
|
||||||
|
由于 $g$ 是四角的凸组合,存在 $\lambda_i\ge0$、
|
||||||
|
$\sum_i\lambda_i=1$ 使 $\sum_i\lambda_i(v_i-g)=0$。
|
||||||
|
对任意朝向 $u$ 取内积,得
|
||||||
|
$\sum_i\lambda_i(v_i-g)\cdot u=0$,
|
||||||
|
故不可能四个角均满足 $(v_i-g)\cdot u<0$;
|
||||||
|
至少一角处于前向闭半平面,且同时满足距离条件。
|
||||||
|
\end{proof}
|
||||||
|
|
||||||
|
证明的关键是凸组合性质:四个方向的投影不可能同时为负。
|
||||||
|
该方案具有显式站点坐标和覆盖距离上界。不过在同样覆盖 $\Omega$ 的前提下,
|
||||||
|
网格方案的站点数并不经济,因此实际选点仍需借助集合覆盖模型。
|
||||||
|
|
||||||
|
\subsection{前向半盘最小命中集的31点方案}
|
||||||
|
把"每个位置与朝向组合至少被一个站点覆盖"写成整数规划,
|
||||||
|
就可以用远比网格稀疏的站点集完成同样的任务。
|
||||||
|
当前 \texttt{directional} 实现采用 \texttt{q4\_mincover\_v2} 计划。
|
||||||
|
在候选站点 $s_j$ 和离散目标状态 $(g_i,\psi_i)$ 上定义关联矩阵
|
||||||
|
\begin{equation}
|
||||||
|
A_{ij}=\mathbf1\{
|
||||||
|
\norm{s_j-g_i}\le r_{\mathrm{design}},
|
||||||
|
\ (s_j-g_i)\cdot u(\psi_i)\ge
|
||||||
|
\norm{s_j-g_i}\sin\gamma_{\mathrm{design}}\}.
|
||||||
|
\end{equation}
|
||||||
|
其中角度余量 $\gamma_{\mathrm{design}}$ 把"恰好落在可见边界"的情形排除在外,
|
||||||
|
使站点对朝向扰动保持稳健。站点筛选可写为集合覆盖模型
|
||||||
|
\begin{equation}
|
||||||
|
\min\sum_j z_j,\qquad
|
||||||
|
\sum_jA_{ij}z_j\ge1\ \ (\forall i),\qquad z_j\in\{0,1\}.
|
||||||
|
\label{eq:setcover}
|
||||||
|
\end{equation}
|
||||||
|
采用集合覆盖的贪心算法与冗余站点删除求近似解\cite{chvatal},得到 $31$ 个站点。
|
||||||
|
设计阶段使用 $965$ m 距离与 $5^\circ$ 前向角余量,
|
||||||
|
最终按 $15$ m 位置间距、$72$ 个朝向采样复核。
|
||||||
|
验证结果覆盖全部 $3\,256\,200$ 个离散状态,
|
||||||
|
最坏覆盖距离约为 $990.051$ m。
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.72\linewidth]{geo-q4-minimum-cover-31-points.png}
|
||||||
|
\caption{31 点最小命中集的几何分布与定向源的读图约定。
|
||||||
|
实心圆点为圆域内检测站($15$ 个),空心圆点为圆域外的检测站($16$ 个),
|
||||||
|
后者用于接收向外发射的边界源;
|
||||||
|
浅色扇形区域为源位置圆域 $\Omega$。
|
||||||
|
图中左侧以一个圆外检测站为例说明定向源的观测读法:
|
||||||
|
绿箭头是该源的发射朝向、浅绿细线扇形是它的 $\pm90^\circ$ 可见范围、
|
||||||
|
红色虚线是检测站在该点测得的示向度,三者共同说明
|
||||||
|
"有朝向遮挡时同一位置也可能测不到信号"。
|
||||||
|
离散校验不等同于连续覆盖证明。}
|
||||||
|
\label{fig:q4plan}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
从离散覆盖推广到连续覆盖时,需同时计入位置与朝向的离散化误差。
|
||||||
|
设任意实际位置距某采样位置不超过 $\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$ 及其边界。本文对 $31$ 点方案采用离散集合覆盖模型,
|
||||||
|
对 $49$ 点方案采用上述连续覆盖定理;连续近似误差的控制将在未来工作中讨论。
|
||||||
|
|
||||||
|
\subsection{位置与朝向联合候选的保守更新}
|
||||||
|
站点解决"能否发现",而要完成清除还必须知道源在哪里、朝向如何。
|
||||||
|
这正是问题三的候选集表示不足以处理的部分:位置可行并不代表朝向可行。
|
||||||
|
对定向假设,在每个候选位置网格的中心 $z$ 附加 $H=24$ 个朝向档,
|
||||||
|
档宽为 $15^\circ$。令 $M_z$ 为仍可能的朝向掩码。
|
||||||
|
方向与近距离观测先更新位置约束,再保留可能覆盖检测点的朝向;
|
||||||
|
无信号时只有在整格处于 $1000$ m 保证接收盘内,才可删除必然可见的朝向。
|
||||||
|
|
||||||
|
记 $\beta=\operatorname{bearing}(z\to s)$、
|
||||||
|
$\Delta_\psi=7.5^\circ$,格内方位余量为 $\alpha_z$,
|
||||||
|
查表舍入余量为 $\eta_\psi=1.5^\circ$。
|
||||||
|
以 $d_\circ$ 表示圆周最小角差,保守保留条件为
|
||||||
|
\begin{equation}
|
||||||
|
\begin{aligned}
|
||||||
|
\text{正观测:}\quad&
|
||||||
|
d_\circ(\psi_k,\beta)\le90^\circ+\Delta_\psi+\eta_\psi+\alpha_z,\\
|
||||||
|
\text{盘内负观测:}\quad&
|
||||||
|
d_\circ(\psi_k,\beta)>90^\circ-\Delta_\psi-\eta_\psi-\alpha_z.
|
||||||
|
\end{aligned}
|
||||||
|
\label{eq:heading}
|
||||||
|
\end{equation}
|
||||||
|
第二行保留含有不可见方向的朝向区间,排除整个区间均可见的候选。
|
||||||
|
若格心距测点过近,格内方位可覆盖整个圆周,此时保留全部朝向。
|
||||||
|
在定向假设下,上述更新保持真源所在位置与朝向网格的可行性。
|
||||||
|
|
||||||
|
\subsection{可见性筛选与探点选择}
|
||||||
|
联合候选的第一个用途是给候选测点排序。
|
||||||
|
在混合场景中,一个测点是否值得去,取决于那里的候选源有多大可能正对着它。
|
||||||
|
对候选 $q$,以均匀接收半径假设给出距离权重
|
||||||
|
\begin{equation}
|
||||||
|
w_r(d)=
|
||||||
|
\begin{cases}
|
||||||
|
1,&d\le1000,\\
|
||||||
|
(1500-d)/500,&1000<d<1500,\\
|
||||||
|
0,&d\ge1500.
|
||||||
|
\end{cases}
|
||||||
|
\end{equation}
|
||||||
|
记 $\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$ 半径上的八方向环点。
|
||||||
|
排除已被遮挡的重复点后,保留评分达到当前最大值 $70\%$ 的点,
|
||||||
|
并从中选择
|
||||||
|
\begin{equation}
|
||||||
|
\frac{\norm{p-q}}5+\frac{\norm{q-m}}5+6
|
||||||
|
\label{eq:q4score}
|
||||||
|
\end{equation}
|
||||||
|
最小者。常数 $6$ 是检测加换频的选点评分费用,
|
||||||
|
真实结算仍按当时频道计算。该规则优先避免完全遮挡的点,
|
||||||
|
再减少移动及后续接近距离。
|
||||||
|
联合集不可用时,返回算法2、对跖探点和环探的确定性顺序。
|
||||||
|
持续遮挡时转入基于距离约束的网格遍历清除。
|
||||||
|
|
||||||
|
\subsection{网格遍历清除与计算预算}
|
||||||
|
遮挡可能使定位长期无法收缩,此时需要一条不依赖朝向信息的兜底路径。
|
||||||
|
注意到清除是否成功只与距离有关,与源朝向无关,
|
||||||
|
因此可以放弃"先定位再清除"的顺序,改为逐格试探。
|
||||||
|
当一轮有效定位测量达到 $8$ 次,或连续遮挡探点达到 $4$ 次且候选区域仍较大,
|
||||||
|
对保守凸候选多边形建立边长 $20$ m 的方格覆盖。
|
||||||
|
保留所有与多边形相交的格子,并以格心作为清除点。
|
||||||
|
格内任一点到格心距离满足
|
||||||
|
\begin{equation}
|
||||||
|
\norm{g-z}\le10\sqrt2<20.
|
||||||
|
\label{eq:fallback}
|
||||||
|
\end{equation}
|
||||||
|
因清除与源朝向无关,只要真源保留在多边形中,
|
||||||
|
逐格清除必有一次到达其 $20$ m 内。
|
||||||
|
按最近邻顺序访问,首次成功即停止该频道的网格遍历。
|
||||||
|
|
||||||
|
兜底方案必须受预算约束,否则会挤占其他频道的处理时间。
|
||||||
|
若外包框宽、高为 $w,h$,保守格数上界为
|
||||||
|
\begin{equation}
|
||||||
|
B_{\mathrm{cell}}=
|
||||||
|
\left(\left\lceil\frac w{20}\right\rceil+2\right)
|
||||||
|
\left(\left\lceil\frac h{20}\right\rceil+2\right).
|
||||||
|
\end{equation}
|
||||||
|
当前格数硬上限为 $400$,现实预算需覆盖
|
||||||
|
$N_{\mathrm{cell}}\,t_{\mathrm{RTT},95}+t_{\mathrm{reserve}}$。
|
||||||
|
超过格数或预算上限即跳过并报告未解决;
|
||||||
|
全部清除点失败则保留候选集并记录异常。
|
||||||
|
在\textbf{候选区域包含真源、格数满足上限且预算足够}的条件下,
|
||||||
|
逐格访问可保证完成该源的清除。
|
||||||
|
|
||||||
|
\subsection{算法四与终止条件}
|
||||||
|
\begin{algorithm}[htbp]
|
||||||
|
\caption{前向半盘最小命中集、联合信念与后备清除}
|
||||||
|
\label{alg:q4}
|
||||||
|
\begin{algorithmic}[1]
|
||||||
|
\Require 混合源接口、定向覆盖计划与预算
|
||||||
|
\Ensure 已清除频道、未解决频道与停止依据
|
||||||
|
\State 加载覆盖计划;默认 $31$ 点按 $15$ m/$72$ 档校核,$49$ 点备选有连续证明
|
||||||
|
\While{存在未解决频道且预算充足}
|
||||||
|
\State 选择最近待测站,当前频道优先,批量检测未知频道
|
||||||
|
\State 更新凸位置候选与位置乘朝向联合幸存集;首次正观测后建立朝向候选
|
||||||
|
\While{频道尚未清除}
|
||||||
|
\State 按可见性概率筛选探点,取移动最省者执行测量
|
||||||
|
\If{满足半径判据}
|
||||||
|
\State 执行清除并跳出
|
||||||
|
\ElsIf{遮挡或定位停滞}
|
||||||
|
\State 检查格数与预算,允许则执行 $20$ m 方格后备清除
|
||||||
|
\EndIf
|
||||||
|
\EndWhile
|
||||||
|
\EndWhile
|
||||||
|
\State 主动退出时报告清除数与停止依据
|
||||||
|
\end{algorithmic}
|
||||||
|
\end{algorithm}
|
||||||
|
|
||||||
|
综上,问题四得到三点结论:1. 定向源使无信号具有距离与朝向两种解释,
|
||||||
|
候选集必须由位置扩展为位置与朝向的联合表示;2. 发现条件须由位置圆盘覆盖
|
||||||
|
提升为前向半盘覆盖,$31$ 点最小命中集以远少于网格的站点数完成该任务;
|
||||||
|
3. 清除与朝向无关这一物理性质可用于构造有界预算的兜底清除,
|
||||||
|
使遮挡不再导致任务无法完成。
|
||||||
@@ -0,0 +1,240 @@
|
|||||||
|
\section{实验结果与分析}\aigcC
|
||||||
|
\subsection{实验设置与数据来源}\aigcC
|
||||||
|
本文的实验分两部分,职责严格区分。
|
||||||
|
\textbf{机制论证与定量结论}取自项目内自建模拟器
|
||||||
|
(\pathtext{referee},按题面附件 1、附件 2 复现的评测机)的演练局:
|
||||||
|
演练局可提供真实源位置、机器人轨迹和逐次检测读数,
|
||||||
|
因此能够支撑路径示意、机制分析与逐局的定量比较。
|
||||||
|
\textbf{最终效果验证}取自官方模拟器的六份正式导出包,
|
||||||
|
因无法获取真实位置点,只在附录~\ref{app:formal} 中报告清除数量、总虚拟时间与程序运行时间。
|
||||||
|
|
||||||
|
演练局由 \pathtext{scripts/run\_practice\_episodes.py} 采集:脚本启动评测机、
|
||||||
|
以固定种子开始一局演练,再用与 \texttt{mcm26b.cli run} 相同的生产策略对接接口,
|
||||||
|
真值与行为日志全部由评测机自己写入,策略端只看见 HTTP 响应。
|
||||||
|
采集批次共 $\PractTotalCases$ 局:问题三 $\PractQThreeCases$ 局全向源、问题四 $\PractQFourCases$ 局混合源,
|
||||||
|
源数覆盖 $10$ 至 $16$、接收半径覆盖 $1000$ 至 $1500$ m,问题四的定向源个数覆盖 $3$、$6$、$8$。
|
||||||
|
判定标准为"清完全部源 $\wedge$ 无缺席误判 $\wedge$ 主动退出 $\wedge$ 零异常 $\wedge$ 零失败清除",
|
||||||
|
本批 $\PractTotalComplete$ 局全部满足,因此可以直接作为当前实现的性能证据,
|
||||||
|
累计清除 $\PractTotalCleared$ 个源。
|
||||||
|
所有时间均按式~\eqref{eq:time} 的计时模型由动作序列独立复算,
|
||||||
|
复算值与评测机日志记录的\textbf{最大偏差为 $\PractMaxGap$ s},
|
||||||
|
说明本文的时间口径与模拟器实现完全一致,后文所有耗时数字均可重算。
|
||||||
|
为使"最优实现"的说法可检验,本文对每一问都准备了一个\textbf{朴素基线},
|
||||||
|
两者在同一算例上逐例配对比较:
|
||||||
|
问题一的基线用包围盒对角线代替真实直径,并以包围盒中心近似覆盖圆;
|
||||||
|
问题二的基线分别取"垂直首次示向度 $1000$ m 的 $90^\circ$ 交会点"与"候选集最小包围圆圆心";
|
||||||
|
问题三的基线用 $49$ 点($700$ m 步长)网格发现加就近服务;
|
||||||
|
问题四的基线则把问题三的两种策略原样搬用。
|
||||||
|
基线并非稻草人:它们在部分场景中有效,暴露的是"缺了哪一步"。
|
||||||
|
|
||||||
|
\subsection{问题一与问题二的配对对比}\aigcC
|
||||||
|
先看几何层的两个判据在数值上的表现。问题一用固定示例与随机交会算例
|
||||||
|
(共 $\ProjQOneExampleCases$ 例固定、$\ProjQOneRandomCases$ 例随机)对比两种实现,
|
||||||
|
见表~\ref{tab:q1compare}。
|
||||||
|
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering\small
|
||||||
|
\caption{问题一:直径与覆盖判定的实现对比(时间单位:ms/例)}
|
||||||
|
\setlength{\tabcolsep}{3pt}
|
||||||
|
\begin{tabular}{p{3.4cm}rrrrr}
|
||||||
|
\toprule
|
||||||
|
实现 & 状态正确率 & 直径平均误差/m & 直径最大误差/m & 覆盖正确率 & 平均耗时/ms\\
|
||||||
|
\midrule
|
||||||
|
最优(固定 $\ProjQOneExampleCases$ 例) & 100.0\% & 0.000 & 0.000 & 100.0\% & $\ProjQOneFixedMsOpt$ \\
|
||||||
|
最优(随机 $\ProjQOneRandomCases$ 例) & 100.0\% & 0.000 & 0.000 & 100.0\% & $\ProjQOneRandMsOpt$ \\
|
||||||
|
基线(固定 $\ProjQOneExampleCases$ 例) & $\ProjQOneFixedStatusBase$ & $\ProjQOneFixedMaeBase$ & $\ProjQOneFixedMaeMaxBase$ & $\ProjQOneFixedCoverBase$ & $\ProjQOneFixedMsBase$ \\
|
||||||
|
基线(随机 $\ProjQOneRandomCases$ 例) & $\ProjQOneRandStatusBase$ & $\ProjQOneRandMaeBase$ & $\ProjQOneRandMaeMaxBase$ & $\ProjQOneRandCoverBase$ & $\ProjQOneRandMsBase$ \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\label{tab:q1compare}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
由表可见,最优实现(半平面交 \(+\) 顶点对枚举 \(+\) 最小包围圆)
|
||||||
|
在固定与随机两类算例上的直径误差均为零、覆盖判定全部正确;
|
||||||
|
基线的直径平均绝对误差为 $\ProjQOneFixedMaeBase$ m(固定例)
|
||||||
|
与 $\ProjQOneRandMaeBase$ m(随机例),最大误差达 $\ProjQOneRandMaeMaxBase$ m,
|
||||||
|
覆盖判定正确率仅 $\ProjQOneFixedCoverBase$ 与 $\ProjQOneRandCoverBase$。
|
||||||
|
原因在于包围盒对角线只有在区域恰好与坐标轴对齐时才等于直径,
|
||||||
|
而基线的覆盖判据几乎恒判"覆盖",因此系统性偏乐观。
|
||||||
|
计算代价方向相反:最优实现平均 $\ProjQOneRandMsOpt$ ms,
|
||||||
|
基线 $\ProjQOneRandMsBase$ ms,说明精确判据并不以牺牲效率为代价。
|
||||||
|
|
||||||
|
问题二的差距出现在"保证接收"与"定位收缩"这对指标上,见表~\ref{tab:q2compare}。
|
||||||
|
入选标准是:安全盘内最坏后验半径越小越好,同时保证接收率必须为 $100\%$。
|
||||||
|
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering\small
|
||||||
|
\caption{问题二:第二检测点选点策略对比($\ProjQTwoCases$ 例随机首次示向度)}
|
||||||
|
\setlength{\tabcolsep}{3pt}
|
||||||
|
\begin{tabular}{p{3.2cm}rrrrrr}
|
||||||
|
\toprule
|
||||||
|
选点方法 & 保证接收率 & 最坏后验均值/m & 中位/m & 平均收缩/m & 终值比 & 移动均值/s\\
|
||||||
|
\midrule
|
||||||
|
算法2(默认选点) & $\ProjQTwoGuaranteeOpt$ & $\ProjQTwoWorstOpt$ & 90.899 & 607.577 & $\ProjQTwoRatioOpt$ & 170.44 \\
|
||||||
|
参考:盘内网格枚举 & 100.0\% & $\ProjQTwoWorstRef$ & 91.349 & 605.841 & 0.106 & 170.28 \\
|
||||||
|
基线:垂直 $1000$ m & $\ProjQTwoGuaranteePerp$ & $\ProjQTwoWorstPerp$ & 90.775 & 601.356 & 0.116 & 200.00 \\
|
||||||
|
基线:候选圆心 & $\ProjQTwoGuaranteeMec$ & $\ProjQTwoWorstMec$ & 375.088 & 340.721 & $\ProjQTwoRatioMec$ & 136.29 \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\label{tab:q2compare}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
初始候选半径均值为 $\ProjQTwoInitialRadius$ m。
|
||||||
|
由表~\ref{tab:q2compare} 可知:垂直 $1000$ m 基线的最坏后验半径与最优实现接近,
|
||||||
|
但保证接收率只有 $\ProjQTwoGuaranteePerp$——当真源位于角域远端时必然返回无信号,
|
||||||
|
这正是问题二所要避免的失败模式;候选圆心基线的保证接收率为 $\ProjQTwoGuaranteeMec$,
|
||||||
|
但最坏后验半径达 $\ProjQTwoWorstMec$ m,终值比 $\ProjQTwoRatioMec$,
|
||||||
|
相当于只收缩了一半,说明"保证接收"若脱离横向基线便几乎没有定位价值。
|
||||||
|
最优实现同时取得 $\ProjQTwoGuaranteeOpt$ 的保证接收率与
|
||||||
|
$\ProjQTwoWorstOpt$ m 的最坏后验均值,终值比 $\ProjQTwoRatioOpt$,
|
||||||
|
并与盘内网格枚举参考解($\ProjQTwoWorstRef$ m)相差不到 $2\%$。
|
||||||
|
|
||||||
|
\subsection{问题三:演练局结果与基线对比}\aigcC
|
||||||
|
问题三的闭环在 $18$ 个冻结场景上逐例配对运行,三种策略的结果见表~\ref{tab:q3compare}。
|
||||||
|
|
||||||
|
\input{data/project-q3-table}
|
||||||
|
|
||||||
|
三者的全清率都是 $100\%$,因此差别完全体现在代价上。
|
||||||
|
默认策略 \texttt{bayes} 的平均虚拟时间为 $\ProjQThreeMeanOpt$ s,
|
||||||
|
七点批量策略为 $\ProjQThreeMeanSeven$ s,
|
||||||
|
$49$ 点网格基线为 $\ProjQThreeMeanBase$ s;
|
||||||
|
相对基线,\texttt{bayes} 的平均降幅为 $\ProjQThreeDropOpt$、中位降幅 $\ProjQThreeDropMedianOpt$,
|
||||||
|
并在 $\ProjQThreeFasterOpt$ 个场景中全部更快。
|
||||||
|
代价的来源也很清楚:默认策略平均只需 $\ProjQThreeMeasuresOpt$ 次检测、
|
||||||
|
位移 $\ProjQThreeMoveOpt$ km,而网格基线需要 $\ProjQThreeMeasuresBase$ 次检测、
|
||||||
|
$\ProjQThreeMoveBase$ km。可见网格基线的开销主要来自"逐格走过去再检测",
|
||||||
|
而七点计划加网格幸存集把大量必然无信号的检测直接跳过,
|
||||||
|
再配合滚动任务排序把移动量压到约五分之一。
|
||||||
|
|
||||||
|
这一机制在真实演练局中得到复现。表~\ref{tab:q3practice} 给出问题三
|
||||||
|
全部 $\PractQThreeComplete$ 局全清演练局的直接统计。
|
||||||
|
|
||||||
|
|
||||||
|
\input{data/practice-q3-table}
|
||||||
|
|
||||||
|
|
||||||
|
$\PractQThreeComplete$ 局的源数覆盖 $10$ 至 $16$,全部实现清除数等于源数,
|
||||||
|
且没有一次失败清除;总虚拟时间集中在 $\PractQThreeMin$ 至 $\PractQThreeMax$ s,
|
||||||
|
平均 $\PractQThreeMean$ s,平均定位清除时间 $\PractQThreeMeanClear$ s/个。
|
||||||
|
随源数增加,总虚拟时间只从约 $3.0\times10^3$ s 增长到约 $4.0\times10^3$ s,
|
||||||
|
说明发现—定位—清除三个闭环的组织方式对源数量并不敏感。
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.94\linewidth]{selfbuilt-q3-search-clear-path.png}
|
||||||
|
\caption{自建模拟器演练局 \texttt{\PractQThreeMainCase}($\PractQThreeMainSources$ 个全向源)的搜索与清除路径。
|
||||||
|
折线为机器狗轨迹;每条浅色细射线表示一次 $\direction$ 检测测得的示向度,
|
||||||
|
射线起点即发起该次检测的位置;圆点为测到示向度的检测点($55$ 次),
|
||||||
|
菱形为测到近距离的检测点($1$ 次),灰色叉号为无信号检测点($29$ 次);
|
||||||
|
星号为成功清除点,金色叉号为干扰源真值。全部数据由自建模拟器真值输出。}
|
||||||
|
\label{fig:selfbuiltq3}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
图~\ref{fig:selfbuiltq3} 给出其中一局(\texttt{\PractQThreeMainCase},
|
||||||
|
$\PractQThreeMainSources$ 个源)的完整路径。
|
||||||
|
机器人先按七点计划完成覆盖与批量扫频,再围绕候选区域执行定位与清除;
|
||||||
|
清除点与源真值基本吻合,轨迹在多个源之间跳跃后逐步收敛。
|
||||||
|
该局共检测 $\PractQThreeMainMeasures$ 次、换频 $\PractQThreeMainSwitches$ 次,
|
||||||
|
移动 $\PractQThreeMainMove$ km,总虚拟时间 $\PractQThreeMainTime$ s,
|
||||||
|
程序运行时间仅 $\PractQThreeMainRun$ s。
|
||||||
|
|
||||||
|
\subsection{问题四:演练局结果与基线对比}\aigcC
|
||||||
|
问题四的困难来自遮挡,因此对比的重点不只是时间,还包括"是否真的全部清除"。
|
||||||
|
表~\ref{tab:q4compare} 给出三种策略在 $11$ 个混合源场景(含 $5$ 个边界定向源场景)上的结果。
|
||||||
|
|
||||||
|
|
||||||
|
\input{data/project-q4-table}
|
||||||
|
|
||||||
|
|
||||||
|
由表~\ref{tab:q4compare} 可见,把问题三的策略直接搬用会产生两类不同后果。
|
||||||
|
\texttt{bayes} 的七点全向缺席判据会把朝外发射的定向源误判为"不存在",
|
||||||
|
因而出现 $\ProjQFourAbsentBase$ 次缺席误判、全清率只有 $\ProjQFourClearBase$,
|
||||||
|
其平均虚拟时间($\ProjQFourMeanBase$ s)虽然最短,却是"快而错",
|
||||||
|
不能作为有效结果;$49$ 点网格策略的发现是完备的,
|
||||||
|
但没有后备清除,定位停滞时只能停在"已发现"状态,全清率 $\ProjQFourClearGrid$,属于"稳而不全"。
|
||||||
|
默认策略 \texttt{directional} 在全部 $\ProjQFourValidOpt$ 局有效,
|
||||||
|
全清率 $\ProjQFourClearOpt$,缺席误判为零,平均虚拟时间 $\ProjQFourMeanOpt$ s,
|
||||||
|
平均需要 $\ProjQFourFallbackOpt$ 次后备清除——正是这部分兜底动作
|
||||||
|
换来了网格与批量策略都达不到的完备性。
|
||||||
|
|
||||||
|
演练局进一步显示了遮挡造成的额外代价。表~\ref{tab:q4practice} 给出
|
||||||
|
全部 $\PractQFourComplete$ 局全清混合源演练的统计。
|
||||||
|
|
||||||
|
|
||||||
|
\input{data/practice-q4-table}
|
||||||
|
|
||||||
|
|
||||||
|
与问题三相比,混合源场景的检测次数增加约 $3$ 倍(平均 $\PractQFourMeasures$ 次
|
||||||
|
对 $\PractQThreeMeasures$ 次),移动距离约 $\PractQFourMove$ km(对 $\PractQThreeMove$ km),
|
||||||
|
总虚拟时间平均 $\PractQFourMean$ s,平均定位清除时间 $\PractQFourMeanClear$ s/个,
|
||||||
|
约为全向源场景的 $2.6$ 倍。原因在机制上是明确的:
|
||||||
|
一次无信号观测不再等于"源在远处",而可能只是朝向遮挡,
|
||||||
|
因此必须先用若干探点排除遮挡解释,才能继续收缩位置候选集。
|
||||||
|
本批 $\PractQFourComplete$ 局全部做到"清完且无失败清除",
|
||||||
|
说明可见性筛选加后备清除在定向源个数 $3$ 至 $8$ 的范围内是稳定的。
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.94\linewidth]{selfbuilt-q4-search-clear-path.png}
|
||||||
|
\caption{自建模拟器演练局 \texttt{\PractQFourMainCase}($\PractQFourMainSources$ 个源,
|
||||||
|
其中 $\PractQFourMainDirectional$ 个定向源)的搜索与清除路径。
|
||||||
|
$\mathbf{X}$ 为干扰源真值,每个定向源用"绿箭头(发射朝向)$+$ 浅绿细线扇形($\pm90^\circ$ 可见范围)$+$ 角度标注"表示;
|
||||||
|
每条浅色细射线表示一次 $\direction$ 检测测得的示向度,射线起点即发起检测的位置;
|
||||||
|
圆点为测到示向度的检测点($72$ 次),菱形为测到近距离的检测点($3$ 次),
|
||||||
|
灰色叉号为无信号检测点($84$ 次,其中相当一部分由朝向遮挡造成),星号为成功清除点。}
|
||||||
|
\label{fig:selfbuiltq4}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
图~\ref{fig:selfbuiltq4} 给出含定向源的一局(\texttt{\PractQFourMainCase},
|
||||||
|
$\PractQFourMainSources$ 个源、其中 $\PractQFourMainDirectional$ 个定向)的路径。
|
||||||
|
定向源的前向半盘造成大量无信号观测,轨迹比全向源局密集得多;
|
||||||
|
可见性筛选把探点优先放在朝向相容的位置,后备清除则在定位停滞时兜底完成清除。
|
||||||
|
该局共检测 $\PractQFourMainMeasures$ 次、换频 $\PractQFourMainSwitches$ 次,
|
||||||
|
移动 $\PractQFourMainMove$ km,总虚拟时间 $\PractQFourMainTime$ s。
|
||||||
|
|
||||||
|
\subsection{动作耗时分解}\aigcC
|
||||||
|
上面的对比说明"哪种策略更快",还需要说明"时间花在哪里"。
|
||||||
|
把式~\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}。
|
||||||
|
|
||||||
|
|
||||||
|
\input{data/practice-cost-summary-table}
|
||||||
|
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.86\linewidth]{practice-virtual-time.png}
|
||||||
|
\caption{自建模拟器演练局的总虚拟时间分布。每个点代表一局,
|
||||||
|
实线段为该问题全清局的均值;横轴取对数刻度,
|
||||||
|
问题四(混合源)的整体耗时明显高于问题三(全向源)。}
|
||||||
|
\label{fig:practicetime}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
由图~\ref{fig:practicetime} 与表~\ref{tab:cost} 可见,
|
||||||
|
两类场景中移动时间都是主要成本,分别占 $\PractQThreeMoveShare$ 与 $\PractQFourMoveShare$,
|
||||||
|
因此缩短总耗时的主攻方向是减少移动,这与问题三相对基线的降幅主要来自位移下降相互印证。
|
||||||
|
清除动作本身只占 $\PractQThreeClearShare$ 与 $\PractQFourClearShare$,
|
||||||
|
说明"清除"不是时间瓶颈,真正的成本在于把机器人送到能清除的位置。
|
||||||
|
检测与换频合计占比不高,但因换频次数与移动路径耦合,
|
||||||
|
仍需一并计入路径排序,不能单独优化。
|
||||||
|
|
||||||
|
\subsection{本节结论}\aigcC
|
||||||
|
综合以上配对对比与演练局复算,可提炼出四点结论:
|
||||||
|
1. 几何层的精确判据不需要以效率为代价——问题一的最优实现误差为零而耗时更短,
|
||||||
|
问题二则在保证接收率为 $100\%$ 的同时把最坏后验半径压到基线的约五分之一;
|
||||||
|
2. 多源搜索的效率来自"证明不需要检测",网格幸存集与七点覆盖使默认策略的检测次数
|
||||||
|
和位移相对网格基线分别降到约四分之一和五分之一,平均虚拟时间下降 $\ProjQThreeDropOpt$;
|
||||||
|
3. 混合源场景必须为无信号保留朝向解释,否则会出现缺席误判;
|
||||||
|
默认策略以全清率 $100\%$、缺席误判 $0$ 和平均 $\ProjQFourMeanOpt$ s 的代价
|
||||||
|
换取了这种完备性;
|
||||||
|
4. 本次采集的 $44$ 局演练中,两类场景的全部源都被清除且失败清除为零,
|
||||||
|
移动时间占总耗时的 $\PractQThreeMoveShare$ 与 $\PractQFourMoveShare$,
|
||||||
|
是继续优化的首要对象;清除动作本身只占 $\PractQThreeClearShare$ 与 $\PractQFourClearShare$,
|
||||||
|
不是当前的时间瓶颈。
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
\section{计时模型与会话状态机}\aigcC
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.92\linewidth]{steps-state-machine.png}
|
||||||
|
\caption{会话状态机。进入后经 $5$ s 倒计时接口开放,主动退出或断连后进入关闭状态。}
|
||||||
|
\label{fig:statemachine}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{动作耗时与累计虚拟时间}
|
||||||
|
题面将全部动作折算为虚拟耗时,见表~\ref{tab:actioncost}。
|
||||||
|
检测无论返回无信号、近距离还是示向度,均计 $5$ s;
|
||||||
|
清除成功计 $5$ s,其中光学定位 $3$ s、激光清除 $2$ s,
|
||||||
|
未命中目标时只支付光学检查的 $3$ s。
|
||||||
|
移动与换频没有独立指令,由相邻动作的位置与频道变化推断。
|
||||||
|
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering\small
|
||||||
|
\caption{动作耗时规则。移动耗时等于直线距离除以 $5$ m/s。}
|
||||||
|
\begin{tabularx}{\linewidth}{l l l X}
|
||||||
|
\toprule
|
||||||
|
动作 & 指令 & 虚拟耗时/s & 说明\\
|
||||||
|
\midrule
|
||||||
|
进入 & \texttt{/enter} & 0 & 初始位置 $(0,0)$、初始频道 $1$\\
|
||||||
|
检测 & \texttt{/measure} & $5+$移动$+$换频 & 三种检测结果耗时相同\\
|
||||||
|
清除 & \texttt{/clear} & $5+$移动/$3+$移动 & 成功/未命中目标,均不切换测向频道\\
|
||||||
|
退出 & \texttt{/exit} & 0 & 路径终点自由,无需返回原点\\
|
||||||
|
换频 & 由检测推断 & 1 & 相邻 \texttt{/measure} 的频道变化\\
|
||||||
|
移动 & 由动作推断 & 距离$/5$ & 相邻动作的位置变化\\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabularx}
|
||||||
|
\label{tab:actioncost}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
设整个会话的移动距离为 $L$,检测、换频、成功清除与失败清除的次数分别为
|
||||||
|
$N_m,N_s,N_c^+,N_c^-$。忽略每段移动时间的微秒量化时,总虚拟耗时为
|
||||||
|
\begin{equation}
|
||||||
|
T=\frac{L}{5}+5N_m+N_s+5N_c^++3N_c^-.
|
||||||
|
\label{eq:time}
|
||||||
|
\end{equation}
|
||||||
|
式~\eqref{eq:time} 是后文任务排序的服务时间来源,
|
||||||
|
也是由官方累计量反推移动时间(式~\eqref{eq:residual})的依据。
|
||||||
|
图~\ref{fig:timingexample} 用附件的五步示例说明记账方式:
|
||||||
|
首次检测含移动 $100$ s 与检测 $5$ s,单步 $105$ s;
|
||||||
|
原地换到频道 $2$ 检测单步 $6$ s,累计 $111$ s;
|
||||||
|
清除目标频道 $3$ 未命中,移动 $80$ s 加光学检查 $3$ s,单步 $83$ s,累计 $194$ s;
|
||||||
|
清除不改变测向机频道,故随后原地以频道 $2$ 复测只需 $5$ s,累计 $199$ s,与附件一致。
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.55\linewidth]{timing-attachment-example-105-111-194-199.png}
|
||||||
|
\caption{附件计时示例的逐动作构成。移动项为距离除以 $5$ m/s,标题数字为该步合计。}
|
||||||
|
\label{fig:timingexample}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{虚拟时间、现实预算与终止}
|
||||||
|
虚拟时间度量任务完成速度,现实预算约束程序能否继续发出请求,两者不能混用。
|
||||||
|
程序以 \texttt{/enter} 返回的 \texttt{remaining\_real\_duration\_s} 为准,
|
||||||
|
在每个动作前预留退出时间;虚拟时间以整数微秒累计,在线预测只用于规划与一致性核对。
|
||||||
|
因此后文的“耗时”一律指式~\eqref{eq:time} 的虚拟时间,程序运行时间在结果表中单列。
|
||||||
|
策略在预算不足或协议异常时主动退出并报告未解决频道,不以程序正常结束代替任务完成。
|
||||||
@@ -1,215 +0,0 @@
|
|||||||
# 协议规则表、字段表与状态机(P0 交付)
|
|
||||||
|
|
||||||
依据:`issue/附件/附件1.docx`《模拟器使用说明》、`issue/附件/附件2.docx`《模拟器通信接口说明及编程指南》。
|
|
||||||
本文是人类可读版本;**可执行版本**是 `src/mcm26b/protocol/rules.py`(字段表与错误语义)、
|
|
||||||
`src/mcm26b/protocol/timing.py`(计时模型)与 `src/mcm26b/config.py`(全部常量),
|
|
||||||
三者由 `tests/test_protocol_timing.py`、`tests/test_protocol_client.py` 固化验收。
|
|
||||||
|
|
||||||
## 1. 动作与耗时规则表
|
|
||||||
|
|
||||||
| 动作 | 指令 | 虚拟耗时 | 说明 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| 开始 | `POST /enter` | 0 | 初始位置 (0,0),初始频道 1;虚拟/程序时钟开始 |
|
|
||||||
| 检测 | `POST /measure` | 5 + 移动 + 换频道 | 无论结果(no_signal/near/direction)均为 5s |
|
|
||||||
| 清除 | `POST /clear` | 未发现 3 / 成功 5 + 移动 | 5 = 光学定位 3 + 激光清除 2;**不切换测向频道** |
|
|
||||||
| 结束 | `POST /exit` | 0 | 成功响应中 exit_reason 固定 `user_exit` |
|
|
||||||
| 切换频道 | 无独立指令 | 1 | 只由合法 `/measure` 的 channel 变化推断 |
|
|
||||||
| 移动 | 无独立指令 | 直线距离/5(m/s) | 由 `/measure` 或 `/clear` 的 position 推断 |
|
|
||||||
|
|
||||||
派生事实(易错点):
|
|
||||||
- 一次合法 `/measure` 完成后,测向机频道更新为本次检测频道;
|
|
||||||
- `/clear` 的 channel 只是目标频道,既不切频道、也不产生切换耗时,因此
|
|
||||||
"清除后原地再测"的耗时只取决于上一次 **/measure** 的频道;
|
|
||||||
- 只有 accepted=true 的请求推进虚拟时钟;`accepted=false` 的 virtual_time_s=0 不是当前时刻;
|
|
||||||
- 5 秒检测只是虚拟耗时,不要求现实等待。
|
|
||||||
|
|
||||||
## 2. 字段表
|
|
||||||
|
|
||||||
公共请求字段(4 条指令都必填):
|
|
||||||
|
|
||||||
| 字段 | 类型 | 约束 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| arena_id | string | 必须为 `"default"` |
|
|
||||||
| robot_id | string | 逐字节等于登录参赛队号;UTF-8 长度 1..64;无控制字符 |
|
|
||||||
| request_id | string | 会话内幂等键;UTF-8 长度 1..128;无控制字符 |
|
|
||||||
|
|
||||||
动作字段(实现见 `rules.ACTION_FIELDS`):
|
|
||||||
|
|
||||||
| 指令 | 字段 | 约束 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| /enter | (无附加) | |
|
|
||||||
| /measure | position{x,y}, channel | x/y 有限数值且 \|v\|<=2,000,000;channel 整数 1..20(1.0 亦接受,1.5 拒绝) |
|
|
||||||
| /clear | position{x,y}, channel | 同上;channel 是目标频道 |
|
|
||||||
| /exit | (无附加) | |
|
|
||||||
|
|
||||||
响应字段:
|
|
||||||
|
|
||||||
| 场景 | 字段 |
|
|
||||||
| --- | --- |
|
|
||||||
| 所有响应 | accepted, real_timestamp_ms, virtual_time_s |
|
|
||||||
| accepted=false | 仅上述 3 个字段(virtual_time_s=0) |
|
|
||||||
| /enter 成功 | + max_virtual_duration_s, max_real_duration_s, remaining_real_duration_s |
|
|
||||||
| /measure 成功 | + measure_result ∈ {no_signal, near, direction};direction 时另有 svd_deg(保留两位小数) |
|
|
||||||
| /clear 成功 | + clear_result ∈ {success, no_target_in_range} |
|
|
||||||
| /exit 成功 | + exit_reason = "user_exit" |
|
|
||||||
|
|
||||||
错误语义(必须同时检查 HTTP 状态与 accepted):
|
|
||||||
|
|
||||||
| 情形 | 结果 | 对 request_id 的影响 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| JSON 语法/重复键/缺字段/类型/坐标频道范围 | HTTP 400 | 不占用,修正后可复用 |
|
|
||||||
| 未知字段(含 position 下)、arena/robot 不匹配、测试状态拒绝 | HTTP 200, accepted=false | 不占用 |
|
|
||||||
| 动作被接受 | HTTP 200, accepted=true | 占用 |
|
|
||||||
| 同 ID 不同内容,或并发不同动作 | HTTP 409 | — |
|
|
||||||
| 网络失败重试同一动作 | 复用原 ID+原内容,服务器回放首次响应 | 不重复生效 |
|
|
||||||
| 429/500 | 可原样重试 | — |
|
|
||||||
| 404/405/413/415 | 确定性错误,不得重试 | — |
|
|
||||||
|
|
||||||
物理规则速查:Ω 半径 1800m;源数 10–16;频道 1–20;接收半径 [1000,1500]m(逐源未知);
|
|
||||||
near 阈值 5m;清除半径 20m(与定向朝向无关);定向覆盖 = 朝向两侧各 90°(含边界);
|
|
||||||
示向度误差幅度 ±1°,保留两位小数;虚拟限时 360000s;程序限时 1200s(以 /enter 的
|
|
||||||
remaining_real_duration_s 为准,不得假定恒为 1200);测试窗口 25 分钟。
|
|
||||||
|
|
||||||
## 3. 状态机
|
|
||||||
|
|
||||||
机器狗会话状态(`protocol.state.RobotState` + 客户端会话标志):
|
|
||||||
|
|
||||||
```
|
|
||||||
/enter accepted /exit accepted
|
|
||||||
[未进入] ───────────────▶ [已进入] ───────────────▶ [已退出]
|
|
||||||
│ accepted=false │ accepted=false │ 任何动作 accepted=false
|
|
||||||
└── 不变 └── 不变 └── 不变
|
|
||||||
```
|
|
||||||
|
|
||||||
[已进入] 状态内跟踪:position、测向机 channel、virtual_time_s。转移规则:
|
|
||||||
|
|
||||||
| 事件 | position | channel | virtual_time_s |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| /enter accepted | (0,0) | 1 | 0 |
|
|
||||||
| /measure accepted | ← 本次 position | ← 本次 channel | ← 响应值(=旧值+移动+切换+5) |
|
|
||||||
| /clear accepted | ← 本次 position | **不变** | ← 响应值(=旧值+移动+3或5) |
|
|
||||||
| /exit accepted | 不变 | 不变 | ← 响应值 |
|
|
||||||
| accepted=false / 网络 / 400 | 不变 | 不变 | 不变 |
|
|
||||||
|
|
||||||
虚拟时刻以最近一次 accepted=true 的响应为准;本地预测(timing 模块)只用于
|
|
||||||
规划与一致性核对,偏差记入 `RobotState.mismatches` 并写日志(strict 模式抛错)。
|
|
||||||
|
|
||||||
## 4. 计时示例逐步推演(附件1表2 = 附件2第10节)
|
|
||||||
|
|
||||||
| 步 | 指令 | 移动 | 换频道 | 动作 | 本步 | 累计 |
|
|
||||||
| --- | --- | --- | --- | --- | --- | --- |
|
|
||||||
| 1 | /enter | 0 | 0 | 0 | 0 | **0** |
|
|
||||||
| 2 | /measure (300,400) ch1 | 500m→100s | 0(初始即1) | 5 | 105 | **105** |
|
|
||||||
| 3 | /measure (300,400) ch2 | 0 | 1 | 5 | 6 | **111** |
|
|
||||||
| 4 | /clear (300,0) 目标ch3 | 400m→80s | 0(clear不切频道) | 3(未发现) | 83 | **194** |
|
|
||||||
| 5 | /measure (300,0) ch2 | 0 | 0(第3步后已是2,clear未改) | 5 | 5 | **199** |
|
|
||||||
| 6 | /exit | 0 | 0 | 0 | 0 | **199** |
|
|
||||||
|
|
||||||
验收:`uv run mcm26b sim-check` 通过完整客户端→本地模拟器链路复现
|
|
||||||
`[105, 111, 194, 199]`;`tests/test_protocol_timing.py::TimingModelTests`
|
|
||||||
逐步断言每个分项。
|
|
||||||
|
|
||||||
## 5. 客户端设计要点(P1 交付)
|
|
||||||
|
|
||||||
- **串行**:完全同步,一个动作未决不发下一个;
|
|
||||||
- **幂等重试**:请求体一次性序列化为 bytes,网络失败/429/500 时原样重发
|
|
||||||
(同 request_id 同内容),最多 `max_attempts` 次,指数退避;400/404/405/409/413/415 立即失败;
|
|
||||||
- **accepted=false**:抛 `ActionRejected`,状态不更新;virtual_time_s=0 不入时钟;
|
|
||||||
- **现实预算**:/enter 成功后 `deadline = monotonic() + remaining_real_duration_s`;
|
|
||||||
新动作前检查 `剩余 > reserve_exit_s`(默认 60s [工程]),/exit 豁免;
|
|
||||||
- **日志**:`SessionLog` 逐事件追加 JSONL(attempt/transport_error/accepted),
|
|
||||||
进程崩溃不丢已发记录,回放测试与 evaluation 复算共用同一格式;
|
|
||||||
- **本地预校验**:channel 范围、坐标有限性与 2e6 上限、robot_id/request_id 格式
|
|
||||||
在发送前拒绝(与服务器 400 语义一致,省一次往返)。
|
|
||||||
|
|
||||||
## 6. 策略层如何使用本协议(P3/P4 交付)
|
|
||||||
|
|
||||||
第 5 节的客户端是策略层唯一的事实来源;`belief`(候选集)、`planner`(选点与闭环)
|
|
||||||
不绕开它直接发请求。衔接约定:
|
|
||||||
|
|
||||||
- **串行不变**:闭环每个决策步只发一个动作,`measure`/`clear` 的返回值
|
|
||||||
(`MeasureOutcome`/`ClearOutcome`)是 belief 更新的唯一输入;
|
|
||||||
- **状态同步**:机器人位置/测向频道/虚拟时刻一律读 `client.state`,
|
|
||||||
频道规则(§3 状态机表)由状态机自动维护,策略层不自行推算;
|
|
||||||
- **预算驱动退出**:`DeadlineExceeded` 只在 `/exit` 之外的动作前抛出;
|
|
||||||
闭环捕获后立即 `/exit`(豁免检查),并把该局记为"未证明完成",
|
|
||||||
不与全清成功混记;
|
|
||||||
- **选点的接收保证**:选点器只在保证接收盘 B(mec, 1000-ρ) 内取点,
|
|
||||||
盘内任一点到候选集每点距离 < 1000 ≤ 最小接收半径,因此定位阶段
|
|
||||||
不会浪费 `no_signal`(ρ>1000 的一般候选集退化为探索 MEC 圆心,允许
|
|
||||||
no_signal,理由字段中如实标注);
|
|
||||||
- **清除证书**:候选集外包多边形半径(含近似误差与工程余量)
|
|
||||||
≤ 20m 才发起 `/clear`;证书有效但清除失败视为异常,先补测再重试,
|
|
||||||
不在同一证书上重复消耗 3 秒/次的失败清除;
|
|
||||||
- **停止条件与完成判定**(2026-09-11 用户决策后):找全证明达成
|
|
||||||
(每频道均"已清除或覆盖证明不存在",或清除数达 16 数量上界)后
|
|
||||||
**不提前退出**:按 `search.persistent_search`(默认开)只复扫未清除
|
|
||||||
频道,直到清除数达 16、实机预算耗尽或虚拟安全余量
|
|
||||||
(`virtual_reserve_s`,防触及附件2 §4.5 的 100 小时上限;
|
|
||||||
本地模拟器对达限后的动作以 accepted=false 兜底)不足——"扫到限时为止"。
|
|
||||||
summary 中 `completed` 表示任务证明完成(无中断且结束时每频道
|
|
||||||
CLEARED/ABSENT,或 16 清除);`accounted_virtual_time_s` 记录首次
|
|
||||||
证明找全的虚拟时刻(计算"平均定位清除时间"建议用它,而非复扫
|
|
||||||
耗尽后的最终时刻);`stop_reason` 记录循环结束原因。发现若干源、
|
|
||||||
连续 no_signal、候选采样为空都不是停止条件;
|
|
||||||
- **每步计时留痕**(同上决策):客户端每个被接受动作写一条 `step`
|
|
||||||
事件(实机墙钟耗时 `real_elapsed_s`/`real_since_enter_s` + 比赛虚拟
|
|
||||||
耗时分项 `virtual_cost`:移动=直线距离/5、切频道 1s、检测 5s、
|
|
||||||
清除成功 5s/未发现 3s),summary 以 `steps` 数组与 `step_totals`
|
|
||||||
汇总,并给出题面口径的 `avg_locate_clear_time_s`;
|
|
||||||
- **验收**:`tests/test_loop_q3.py` 在自建模拟器上覆盖 10/16/0 源、
|
|
||||||
近边界源、预算耗尽与故障注入;`uv run mcm26b run --robot-id <队号>
|
|
||||||
--self-test` 可离线复跑随机场景,正式模式去掉 `--self-test` 即对接
|
|
||||||
模拟器(日志用 `--log` 落盘,格式同 §5 JSONL)。
|
|
||||||
|
|
||||||
## 7. 定向扩展如何使用本协议(P5 交付)
|
|
||||||
|
|
||||||
问题4的定向源在**协议字段上与全向源完全不可区分**:`/measure` 仍只返回
|
|
||||||
no_signal/near/direction(direction 附 svd_deg),`/clear` 仍只看 20m 半径。
|
|
||||||
"该源是定向的"无法从报文读出,只能由观测推理。因此 §5/§6 的协议用法全部
|
|
||||||
照用,定向性只改变策略层的解释与决策:
|
|
||||||
|
|
||||||
- **发现阶段零改动**:49 点覆盖保证对定向源同样成立——源位于某网格单元
|
|
||||||
凸包内时,任意发射半平面(朝向 ±90°,含边界)必含至少一个顶点,且该
|
|
||||||
顶点距离 ≤ 700√2 ≈ 989.95 < 1000 ≤ 最小接收半径,覆盖阶段无需知道
|
|
||||||
源类型;
|
|
||||||
- **no_signal 联合约束基线**:定向源的 no_signal 约束的是"位置×半径×朝向"
|
|
||||||
联合假设,单独维护空间候选会被误删,基线**不据此删任何候选**
|
|
||||||
(`belief.update_measure` 对 no_signal 无操作);缺席证明仍只由完整覆盖
|
|
||||||
给出。唯一启用的推理:若 no_signal 发生在保证接收盘 B(mec, 1000-ρ) 内
|
|
||||||
(该盘内任一全向源必然可收),则只能由朝向遮挡解释 [观测推理]——该频道
|
|
||||||
记为"观测到定向",进入探点升级梯子:对 MEC 圆心取对跖方向复核(偏移
|
|
||||||
裁进保证接收盘),再绕 MEC、半径 = ρ 的圆环按 45° 步进探点。**几何边界
|
|
||||||
必须如实陈述**:环上可见弧没有下界——源可位于环上(|g−c| = ρ)且朝向
|
|
||||||
沿外切线,此时可见集退化为单个切点,固定步进环探可以全部漏过。梯子
|
|
||||||
只提高提前命中概率,不构成接收或命中保证;完备性完全由后备清除兜底。
|
|
||||||
被遮挡探点不消耗定位步数,单轮被遮挡探点(首次选点、对跖复核、环探
|
|
||||||
合计)达 `max_blocked_probes`(4 [工程])即转后备清除;
|
|
||||||
- **后备清除的协议用法**:定位停滞(候选集有界但未达 §6 清除证书)时,
|
|
||||||
对候选外包多边形构造 20m 有限圆盘覆盖(`fallback_clear_cells`:全局
|
|
||||||
半开网格索引、相交判定带正容差,格内任一点距某格心 ≤ 10√2 < 20m),
|
|
||||||
按"距机器人最近优先"逐格发 `/clear`(同频道、不同位置)——清除与朝向
|
|
||||||
无关 [题面],是定向源不依赖可见性的完备后备。两条预算硬门槛(任一
|
|
||||||
不满足即跳过并留痕,绝不盲扫):
|
|
||||||
- 格数上界:N ≤ `fallback_max_cells`(400 [工程]);外包框枚举先按
|
|
||||||
(⌈w/20⌉+2)(⌈h/20⌉+2) 做规模检查,宽候选集(如仅一次读数的 750m
|
|
||||||
截断角域,数千格)必须继续定位而非硬扫;
|
|
||||||
- 现实预算:N × `real_rtt_p95_s` + `reserve_exit_s` ≤ 剩余现实时间。
|
|
||||||
虚拟耗时上界 ≈ 移动 L/5 + 3N(全失败)或 3(N-1)+5(末次成功)。
|
|
||||||
后备 /clear 请求**计入总请求口径**:summary 的 `total_requests`
|
|
||||||
(measures+clears)与 `fallback_clear_attempts`(后备逐格尝试数)
|
|
||||||
如实上报——仅统计检测次数会明显低估现实耗时;
|
|
||||||
- **真源不误删**:no_signal、失败的 `/clear`(含后备逐格全失败)均不删
|
|
||||||
空间候选;后备全失败按守恒性破坏记异常(格心距格内任一点 < 20m,
|
|
||||||
理论上必命中);
|
|
||||||
- **停止条件与预算语义不变**:仍是清除数达 16、每频道均"已清除或覆盖
|
|
||||||
证明不存在"、现实预算耗尽(记未证明完成)三种;断连/协议错误/
|
|
||||||
守恒性破坏中断时同样尽力 /exit 并产出未完成 summary(`stop_reason`
|
|
||||||
记 `transport_failure`/`protocol_error`/`inconsistent_belief` 等,
|
|
||||||
附逐频道状态快照),不静默丢失会话;
|
|
||||||
- **验收**:`tests/test_loop_q4.py`(15 项:覆盖格无空洞与格线两侧保留、
|
|
||||||
退化多边形、格数上界公式;混合 10/16 源全清、朝向背离圆心的近边界源
|
|
||||||
不漏、批量种子回归;no_signal 不删候选;格数硬顶与预算跳过;后备
|
|
||||||
正路径命中与全失败异常留痕);`uv run mcm26b run --robot-id <队号>
|
|
||||||
--problem 4 --self-test` 可离线复跑混合场景(`--directional` 指定
|
|
||||||
定向源数),正式模式同 §6。
|
|
||||||
@@ -1,516 +0,0 @@
|
|||||||
# 第三、四问:图论与动态规划算法引入方案
|
|
||||||
|
|
||||||
- 版本:2026-09-12
|
|
||||||
- 前置文档:[第三四问架构优化与运行提速方案](第三四问架构优化与运行提速方案.md)(架构与 P0–P2 项)、
|
|
||||||
[algo-3-bayes.md](algo-3-bayes.md)(现役第三问策略)、[algo-3.md](algo-3.md)(七点覆盖证明)
|
|
||||||
- 范围:只讨论"用图论 / 动态规划类算法进一步压低**虚拟耗时**"这一件事;
|
|
||||||
题面约束、协议语义、保守性不变量全部不动
|
|
||||||
- 本文所有数字均为**本轮新增实测**(自建内存回环、冻结场景、现役代码),
|
|
||||||
复现命令见 §7
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 0. 结论先行
|
|
||||||
|
|
||||||
**可以,而且第四问的空间远大于第三问;但真正的收益不在"把巡回排得更短",而在
|
|
||||||
"把不必要的往返与盲清从决策层消掉"。**
|
|
||||||
|
|
||||||
| 判断 | 证据 | 可回收 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| 第三问**路由**已接近最优,纯图论排线几乎无空间 | 对**同一批实际作业点**求离线最优开放回路:2308 s vs 实测移动 2458 s,只剩 **6.1%(151 s)** | ≤ 150 s |
|
|
||||||
| 第三问仍有空间,但在**探测次数**(序贯决策),不在排线 | 30.8 次探测 / 13 源,且 0 次 `no_signal`——每次都在有效收缩,但次数仍偏多 | −150 ~ −250 s |
|
|
||||||
| 第四问**路由**有 20% 空间,但那是被定位/清除绕行"拖"出来的 | 离线最优 4998 s vs 实测移动 6257 s(**20.1%**);而覆盖点巡回的投影顺序 4365 s 已接近离线 31 点最优 4181 s(+4.4%) | −400 ~ −700 s |
|
|
||||||
| 第四问最大单点是**定向源定位失败导致的后备盲清** | 平均每局 **131 次清除只有 13 次成功**,`fallback_clear_attempts=125.7`,清除动作 419 s + 清除段移动 798 s ≈ **1220 s/局(14% T)** | **−800 ~ −1100 s** |
|
|
||||||
| 第四问第二点是**探测本身** | 平均 69 次探测 ≈ **2224 s/局(26% T)**,其中 32 s/次的移动占 1880 s | −400 ~ −800 s |
|
|
||||||
| 覆盖点集**已经最小**,不要再压 | 27 点方案在 75 m/24 档"通过",但在 25 m/48 档有 **298 个 (p,h) 缺口** → 是采样过拟合的假解;在细网格上直接搜索的最小命中集仍是 **31 点** | 0(见 §5.1 的正确性风险) |
|
|
||||||
|
|
||||||
**一句话:第三问的目标是"把 30.8 次探测压到 ~26 次并把序排到最优",第四问的目标是
|
|
||||||
"把 125 次盲清变成 3 次有保证的探测"。** 两者都是 DP / 序贯决策问题,
|
|
||||||
不是经典的 TSP 排线问题。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 1. 目标函数的图论化
|
|
||||||
|
|
||||||
题面计时模型(`config.CostConfig`,已由 `evaluation.recompute_virtual_time` 逐微秒复算验证):
|
|
||||||
|
|
||||||
```
|
|
||||||
T = L/5 + 5·N_measure + 1·N_switch + 5·N_clear⁺ + 3·N_clear⁻
|
|
||||||
```
|
|
||||||
|
|
||||||
把它写成图上的路径代价,后面所有算法都在这张图上做:
|
|
||||||
|
|
||||||
- **节点** = 一次"停靠"(覆盖站点、定位测点、清除点);
|
|
||||||
- **边权** `w(a,b)` = `dist(a,b)/5`(移动秒);
|
|
||||||
- **节点服务费** = `5·(该点要测的频道数) + 1·(换频次数)` 或 `5/3`(清除)。
|
|
||||||
- 于是整局 = 一条**开放路径**(起点原点、终点自由),目标是最小化
|
|
||||||
`Σ边权 + Σ服务费 + Σ动作惩罚`。
|
|
||||||
|
|
||||||
四类图问题分别对应四个子决策:
|
|
||||||
|
|
||||||
| 子决策 | 图问题 | 现役做法 | 目标做法 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| 站点/任务排序 | **开放 TSP(小 n 精确)** | NN + 2-opt(滚动) | Held-Karp 精确 DP(n ≤ 14,含换频状态)|
|
|
||||||
| 定位测点选择 | **带邻域的 TSP / 定向问题(TSPN/OP)** | 每任务独立选点 + 全表重排 | 覆盖骨架 + 最便宜插入;测点作为"邻域"参与联合优化 |
|
|
||||||
| 定向源定位 | **POMDP / 随机最短路** | 一步贪心 `prob_detect/时间` | 2–3 步 rollout,值函数 = 期望后验 MEC 半径 |
|
|
||||||
| 后备清除 | **区域覆盖路径(Covering Path)** | 格心最近邻 | 割草机 + 转向点 DP / 格心集 Or-opt |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. 本轮实测基线(现役代码,冻结场景)
|
|
||||||
|
|
||||||
场景集:`harness/suites.py`,第三问 core 的 seed 100–105 × 13 源;
|
|
||||||
第四问 core 全部 9 场(10/13/16 源 × 3 定向占比)。配置为现役默认。
|
|
||||||
|
|
||||||
### 2.1 第三问(`bayes`,13 源,6 场)
|
|
||||||
|
|
||||||
| 指标 | 数值 |
|
|
||||||
| --- | ---: |
|
|
||||||
| 平均虚拟时间 | **3197 s** |
|
|
||||||
| 移动 | 12292 m = **2458 s(77%)** |
|
|
||||||
| 覆盖点检测 | 83.5 次 = 501 s(其中 69.8 次 `no_signal`,属缺席证明) |
|
|
||||||
| 定位探测 | **30.8 次 = 185 s**(0 次 `no_signal`) |
|
|
||||||
| 清除动作 | 65 s |
|
|
||||||
| **离线最优开放回路(同一批作业点)** | **2308 s** |
|
|
||||||
| 路由可回收 | **151 s(移动的 6.1%,T 的 4.7%)** |
|
|
||||||
| 作业点数(去重) | 35–50 |
|
|
||||||
|
|
||||||
### 2.2 第四问(`directional` + `q4_mincover_v1`,9 场)
|
|
||||||
|
|
||||||
| 指标 | 数值 |
|
|
||||||
| --- | ---: |
|
|
||||||
| 平均虚拟时间 | **8676 s** |
|
|
||||||
| 移动合计 | 6257 s(72%) |
|
|
||||||
| ├ 覆盖段移动 | 3579 s |
|
|
||||||
| ├ **探测移动** | **1880 s** |
|
|
||||||
| └ **清除移动** | **798 s** |
|
|
||||||
| 动作耗时 | 2149 s(覆盖 1386 / 探测 344 / 清除 419) |
|
|
||||||
| 探测次数 | 69.0 次(`no_signal` 4–12 次) |
|
|
||||||
| **清除次数 / 成功** | **131.1 / 13.0 → 118 次失败** |
|
|
||||||
| `fallback_clear_attempts` | **125.7 次/局** |
|
|
||||||
| 后备盲清格数(单次) | 3 ~ 210 格,全部以 `cleared` 结束 |
|
|
||||||
| **离线最优开放回路(同一批作业点)** | **4998 s** |
|
|
||||||
| 路由可回收 | 1259 s(移动的 20.1%,T 的 14.5%) |
|
|
||||||
| 覆盖投影顺序 vs 离线 31 点 2-opt | 4365 s vs 4181 s(+4.4%) |
|
|
||||||
|
|
||||||
### 2.3 成本地板估计
|
|
||||||
|
|
||||||
| 问题 | 不可压缩部分 | 现状 | 真实可压缩 |
|
|
||||||
| --- | --- | ---: | ---: |
|
|
||||||
| 第三问 | 七点环 1392 s + 覆盖检测 501 s + 清除动作 65 s + 每源必经的接近/清除移动 + 每源 ≥2 次探测 | 3197 s | **~300–450 s(10–14%)** |
|
|
||||||
| 第四问 | 31 点巡回 ~4180 s + 缺席检测 ~1386 s + 每源 ≥3 次探测与一次清除 | 8676 s | **~2000–2800 s(23–32%)** |
|
|
||||||
|
|
||||||
> 第四问的 4000 s 验收线**依然不可达**(单是 31 点巡回 + 缺席检测就 ≈5566 s),
|
|
||||||
> 这与前置文档 §6.2 的结论一致;本方案只承诺把 8676 s 压向 6500 s 量级。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. 算法设计
|
|
||||||
|
|
||||||
### 3.1 D1(第四问最高优先):定向源的"抵近 + 交会"滚动时域 DP
|
|
||||||
|
|
||||||
**问题本质**:±1° 示向度误差在距离 d 处给出的横向不确定度约 `d·tan(1°) ≈ 0.0175 d`。
|
|
||||||
d = 1000 m 时单条方位线的横向约束只有 ±17.5 m;两条方位线的交会角 θ 决定最终尺度
|
|
||||||
`≈ 0.0175 d / sin θ`。要压到 20 m 清除证书,必须**同时**满足:交会角大、距离近。
|
|
||||||
现役 `_visibility_probe` 只最大化 `prob_detect(q)/(移动+6)`,天然偏好"近且可见",
|
|
||||||
与"交会角大"无关;远距离又永远收敛不到 20 m,于是退化到 20 m 网格盲清。
|
|
||||||
|
|
||||||
**形式化**(这就是一个 POMDP):
|
|
||||||
|
|
||||||
- 状态 `b` = `JointBelief`(位置 × 24 档朝向的可行集,见 `belief/joint.py`),
|
|
||||||
再叠加 `r_eff ~ U[1000,1500]` 的不确定度;
|
|
||||||
- 动作 `q` ∈ 候选测点(保证接收点 ∪ 对跖点 ∪ 三圈环探 ∪ **朝 MEC 圆心的抵近点**);
|
|
||||||
- 观测 `o ∈ {direction, near, no_signal}`,由每条粒子 `(p, h, r_eff)` 解析预测;
|
|
||||||
- 代价 `c(q) = 6 s + dist(pos,q)/5`;
|
|
||||||
- 终止:`MEC(b).radius ≤ 20 − margin`(可一次清除);
|
|
||||||
- 值函数:`V(b) = min_q E_o[ c(q) + V(b') ]`。
|
|
||||||
|
|
||||||
**实现选择(按代价递增)**:
|
|
||||||
|
|
||||||
1. **一步期望后验半径**(最小改动,复用 Q3 已有内核的二维推广):
|
|
||||||
对候选 `q`,按粒子权重模拟三分支结果,用幸存子集的 MEC 半径近似 `V(b')`,
|
|
||||||
取 `E[radius] + λ·c(q)` 最小者。把 `particles.py::expected_posterior_radius`
|
|
||||||
的向量化实现在 `JointBelief` 上重写一份(numpy 可用时广播)。
|
|
||||||
2. **2–3 步 rollout**:对前 K=8 个候选各展开一层,深度 2;墙钟预算 ≤ 0.3 s/决策。
|
|
||||||
3. **交会角代理(解析、零墙钟)**:若一步法来不及落地,先用
|
|
||||||
`score(q) = −E[radius] · sin(Δbearing(q, 既有方位线)) / dist(q, center)`
|
|
||||||
的确定性代理,实验证明有效后再换 rollout。
|
|
||||||
|
|
||||||
**关键结构性改动**:把候选点集从"绕 MEC 的固定环"扩展为**含抵近点**,
|
|
||||||
即允许 `q` 落在 `center + α·(pos − center)` 上、`α` 从 0.6 到 1.0 采样。
|
|
||||||
这样当远距离无法收敛时,策略会**主动抵近**并以一次正常角域证书收尾,
|
|
||||||
而不是把 200 格盲清当作唯一出路。后备清除**保留为安全网**,但目标是触发次数下降 ≥ 80%。
|
|
||||||
|
|
||||||
**验收**:`fallback_clear_attempts` ≤ 15/局(现 125.7);定向频道平均探测次数
|
|
||||||
≤ 全向频道的 1.5 倍;清除成功率 ≥ 90%;9 场景全清率 100%。
|
|
||||||
**预期**:−800 ~ −1100 s。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 3.2 D2:覆盖骨架 + 最便宜插入(TSPN 的在线近似)
|
|
||||||
|
|
||||||
**问题本质**:31 个覆盖点是**必须在场**的(缺席证明),但探测点与清除点是
|
|
||||||
**临时产生**的。现役做法把两类点混在一张任务表里,每次从零做 NN + 2-opt
|
|
||||||
(`bayes_loop._order_tasks`),等于让临时任务把骨架顺序"打散"。
|
|
||||||
实测投影顺序 4365 s vs 离线最优 4181 s,说明骨架顺序本身没坏,
|
|
||||||
坏在**绕行开销**——而绕行开销正是插入位置没优化。
|
|
||||||
|
|
||||||
**形式化**:这是 **TSP with Neighborhoods / Generalized TSP**:
|
|
||||||
|
|
||||||
- 骨架:离线求覆盖点集的近优开放回路 `S`(`7` 点用解析证明;`31` 点用 Or-opt/3-opt,
|
|
||||||
`n ≤ 16` 时可直接 Held-Karp 精确);
|
|
||||||
- 在线:给定当前任务 `q` 与其**邻域**(`clear` 任务的邻域是 `C₂₀(K)`,`locate`
|
|
||||||
任务的邻域是候选测点集),求
|
|
||||||
`Δ(i,j) = dist(a_i, q) + dist(q, a_{j}) − dist(a_i, a_j)`
|
|
||||||
最小的插入位置 `(i,j)`;这正是"图上的最便宜插入",`O(|S|²)` 每任务。
|
|
||||||
|
|
||||||
**实施**:
|
|
||||||
|
|
||||||
1. `guarantee/cover.py` 增加 `optimize_tour(points, seed_tour, passes)`(Or-opt + 2-opt),
|
|
||||||
把 `nn_tour_m` 从"上界"变成"已优化值",并写入证书 `tour_virtual_s`。
|
|
||||||
2. `planner/bayes_loop.py` 新增 `_skeleton`(覆盖点顺序)与 `_insert_task(task, neighborhood)`;
|
|
||||||
`_order_tasks` 退化为"骨架遍历 + 已插入任务",保留现有 2-opt 作为兜底开关。
|
|
||||||
3. `clear` 任务的邻域用 **`C₂₀(K)` 内离插入点最近的点**(见 3.4),使插入代价与
|
|
||||||
清除目标联合最小。
|
|
||||||
|
|
||||||
**验收**:第四问移动 ≤ 5000 s(现 6257 s);路由相对离线最优的 gap
|
|
||||||
(新增回归指标 `route_gap_vs_offline`)从 20.1% 降到 ≤ 10%。
|
|
||||||
**预期**:−400 ~ −700 s。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 3.3 D3:后备清除的覆盖路径(若 D1 后仍触发)
|
|
||||||
|
|
||||||
后备清除是"用 20 m 圆盘覆盖残差区域 `R` 直到命中真源"——即 **Covering Path Problem**。
|
|
||||||
|
|
||||||
- 当前 `_fallback_clear` 对格心做 nearest-first 扫描,等价于格心集上的 NN 开放路径,
|
|
||||||
典型约为最优的 1.2–1.3 倍;
|
|
||||||
- 改进:对格心集做 **Or-opt + 2-opt**(`k ≤ 400`,`O(k²)` 一次约 0.1 s,且只在
|
|
||||||
极少数局触发);
|
|
||||||
- 上界更优解:凸区域上的**割草机(boustrophedon)扫描**,用 DP 在扫描线方向选择
|
|
||||||
转向点可精确最优;对一般多边形用梯形分解 + DP。
|
|
||||||
|
|
||||||
**验收**:后备触发时移动 ≤ 现值的 80%(单次);触发次数本身由 D1 压到 ≤ 15/局。
|
|
||||||
**预期**:−100 ~ −200 s(D1 未完全消除时的兜底)。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 3.4 T1/T3:第三问的精确排线、换频 DP 与清除点选择
|
|
||||||
|
|
||||||
**(a) Held-Karp 精确任务序(含换频状态)**
|
|
||||||
|
|
||||||
现役 `_two_opt` 是启发式且被 4 轮上限截断。任务表典型只有 6–12 项,
|
|
||||||
可以**精确求解**:
|
|
||||||
|
|
||||||
```
|
|
||||||
dp[S][j][c] = 已访问任务集 S、停在任务 j、测向频道为 c 的最小代价
|
|
||||||
转移:dp[S∪{k}][k][c'] = dp[S][j][c] + dist(pos_j, pos_k)/5 + service(k, c, c')
|
|
||||||
```
|
|
||||||
|
|
||||||
- 规模:`|T| ≤ 12` 时 `2^12 × 12 × 20 ≈ 1.0M` 状态,纯 Python 约 0.1–0.3 s/次;
|
|
||||||
滚动重排每步一次会吃掉预算,因此**只在任务表新增/删除任务时重解**,
|
|
||||||
或在 `|T| ≤ 9` 时默认启用、否则回退 2-opt + Or-opt。
|
|
||||||
- 换频代价精确化:`service` 依赖进入/离开频道,把 `c` 并入状态即可精确;
|
|
||||||
现役 `_path_cost` 用"按频道排序"的贪心近似,会低估/高估 1–3 s/站。
|
|
||||||
- 附图论下界:对当前点集算 **MST 权重**(`O(n²)` Prim),
|
|
||||||
得到开放路径最优值的下界,写入 `summary.route_lower_bound_s`,
|
|
||||||
用于**在线后悔值审计**与回归("本步排序距最优 ≤ x%")。
|
|
||||||
|
|
||||||
**验收**:`route_gap_vs_offline` ≤ 3%;单局墙钟增量 ≤ 0.2 s。
|
|
||||||
**预期**:−120 ~ −200 s。
|
|
||||||
|
|
||||||
**(b) 探测的 2 步 rollout(T2)**
|
|
||||||
|
|
||||||
现役 `_select_point` 是一步贪心(期望 log 幸存占比 + λ·移动)。
|
|
||||||
把它扩成深度 2 的 rollout:对前 `K=8` 个候选,各展开一次测量的三分支
|
|
||||||
(direction / near / no_signal),取 `E[V]` 最小者。
|
|
||||||
`V` 沿用现有 `expected_survival`。这属于**滚动时域 DP**,不改任何安全性判定。
|
|
||||||
|
|
||||||
**验收**:探测次数 30.8 → ≤ 26;墙钟 ≤ 0.3 s/决策。
|
|
||||||
**预期**:−150 ~ −250 s。
|
|
||||||
|
|
||||||
**(c) 清除点选在 `C₂₀(K)` 内离当前位置最近处(T3)**
|
|
||||||
|
|
||||||
`C₂₀(K) = ∩_{g∈K} B(g, 20)` 是凸集(圆盘之交)。求其内离当前点最近点是一个
|
|
||||||
**凸可行性/投影问题**(对小规模可枚举多边形顶点 + 圆盘投影,或直接迭代投影)。
|
|
||||||
现役 `_near_clear_target` 只沿一维方向平移,与最优之差 ≤ 0.74 m(前置文档 P1-1 已复核),
|
|
||||||
收益主要来自**与 3.2 插入代价的耦合**:先定插入位置、再选清除点,比反过来省更多。
|
|
||||||
|
|
||||||
**验收**:清除段移动下降 ≥ 5%。
|
|
||||||
**预期**:−50 ~ −150 s。
|
|
||||||
|
|
||||||
**(d) 七点环半径(T4)**:`1159.7 → 1122.9`(可证明下界),−44 s。
|
|
||||||
仅作为"证明性"改动落地,不作为收益项。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. 实施路线
|
|
||||||
|
|
||||||
| 阶段 | 内容 | 交付物 | 验收门槛 | 依赖 |
|
|
||||||
| --- | --- | --- | --- | --- |
|
|
||||||
| **S0 基线冻结**(0.5 天) | 把近期 sweep 的最优参数(`route_aware_probe=false`、`lambda_move_s≈0.06`、`opportunistic_radius_ratio≈0.4–0.5`)回填为基准,跑满 core+boundary 并归档 | `output/suite/q3-baseline`、`q4-baseline` | 现有 `valid` 口径 100% | 无 |
|
|
||||||
| **S1 度量补全**(0.5 天) | 在 `scripts/run_suite.py` 增加 `route_gap_vs_offline`、`route_lower_bound_s`、`distinct_service_points`、`coverage_actual_visited` 四列 | runner 改动 + 回归 | 与本文 §2 实测复现一致 | S0 |
|
|
||||||
| **S2 覆盖证书硬化**(1 天,**正确性优先**) | 证书分辨率 75 m/24 → 20 m/72;设计裕量 `r_design ≤ 960 m` 或细网格直接搜索;保留 10% 保险点预算 | `guarantee/cover.py`、`plans/*.json`、正/负例测试 | 细网格(15 m/72)缺口 = 0;故意删点必须被检出 | S1 |
|
|
||||||
| **S3 第四问 D1**(2–3 天) | `belief/joint.py` 增加期望后验半径 / rollout 选点;`planner/__init__.py::_probe_candidates` 增加抵近点;后备降级为安全网 | `belief/joint.py`、`planner/__init__.py`、测试 | `fallback_clear_attempts ≤ 15`;全清 100%;墙钟 ≤ 1.0 s/局 | S2 |
|
|
||||||
| **S4 第四问 D2/D3**(2 天) | 覆盖骨架 + 最便宜插入;`C₂₀` 邻域;后备 Or-opt | `planner/*`、`guarantee/cover.py` | 移动 ≤ 5000 s;`route_gap ≤ 10%` | S3 |
|
|
||||||
| **S5 第三问 T1/T2/T3**(2 天) | Held-Karp(含换频)+ MST 下界;探测 2 步 rollout;`C₂₀` 最近点 | `planner/bayes_loop.py`、`plan/*` | 探测 ≤ 26;`route_gap ≤ 3%`;T ≤ 2900 s | S1 |
|
|
||||||
| **S6 收口**(1 天) | 全量配对、论文数据表、消融图 | 报告 + `docs/paper` 数据 | 与 S0 配对全部 `valid`,无退化场景 | S4/S5 |
|
|
||||||
|
|
||||||
**顺序约束**:S1(度量)先于任何算法改动,否则"更快"不可证;S2(证书)先于
|
|
||||||
第四问算法改动,否则可能在错误的安全基线上做优化。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. 风险与明确不做的部分
|
|
||||||
|
|
||||||
### 5.1 本轮发现的正确性风险(必须先处置)
|
|
||||||
|
|
||||||
现役 `q4_mincover_v1`(31 点)与 `square49`(49 点)在**粗采样**下缺口为 0,
|
|
||||||
但把校核分辨率从 75 m/24 档提到 25 m/48 档:
|
|
||||||
|
|
||||||
| 点集 | 点数 | 75 m/24 缺口 | 25 m/48 缺口 | 15 m/72 缺口 | 最坏命中@75 m | 最坏命中@25 m |
|
|
||||||
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
|
|
||||||
| `square49` | 49 | 0 | 0 | 0 | 760.3 m | 760.3 m |
|
|
||||||
| `q4_mincover_v1`(现役) | 31 | 0 | **125** | **566** | 999.1 m | 1000.0 m |
|
|
||||||
| 细网格重搜最小集 | 31 | 0 | 0 | 35 | 983.0 m | 996.2 m |
|
|
||||||
| 贪心 27 点(75 m 档最优) | 27 | 0 | **298** | 1117 | 986.5 m | 1000.0 m |
|
|
||||||
|
|
||||||
结论:
|
|
||||||
1. **31 点很可能就是实际下界附近**:多起点随机贪心 + 冗余剪枝在 25 m/48 细网格上
|
|
||||||
直接搜索的最小解仍是 31 点(尚未做 LP 松弛下界,但连贪心都下不去);
|
|
||||||
之前看到的 27 点是**采样过拟合的假解**,不可采纳;
|
|
||||||
2. `q4_mincover_v1` 的安全裕量几乎为 0(999.1 m),存在"真源恰落在细缝 + `r_eff` 取下界"
|
|
||||||
的漏检窗口,现役测试没暴露是因为随机场景未命中细缝且 `r_eff` 通常 > 1000;
|
|
||||||
3. `square49` 裕量充足但巡回 36.4 km,不可回退;
|
|
||||||
4. 正确做法是**细网格重搜 + 设计裕量**(S2),代价约 0–150 s,**先保安全再谈提速**。
|
|
||||||
|
|
||||||
### 5.2 其他风险
|
|
||||||
|
|
||||||
| 风险 | 影响 | 缓解 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| POMDP rollout 墙钟超预算 | 单局计算 > 1 s | 深度 2、候选截断 K=8、`--profile` 纳入基准必报列;超预算自动退回一步法 |
|
|
||||||
| Held-Karp 状态爆炸(任务表变长) | 单步计算抖动 | 仅在 `|T| ≤ 9` 默认启用,`> 9` 回退 2-opt + Or-opt |
|
|
||||||
| 抵近点破坏可见性保证 | 探测反而 `no_signal` 变多 | 抵近点仍以 `prob_detect > 0` 过滤;`no_signal` 是合法负观测,不破坏守恒性 |
|
|
||||||
| 骨架插入与"找全即停"冲突 | 为走骨架而多绕行 | 骨架只提供顺序,不新增必须访问的点;任务表为空即停 |
|
|
||||||
| 细网格证书重搜耗时 | 离线 3–5 min | 一次性离线搜索 + 运行期按计划名缓存校验(沿用 `load_plan` lru_cache) |
|
|
||||||
|
|
||||||
### 5.3 明确不做
|
|
||||||
|
|
||||||
- **不重引入 PPO/HRL**(前置文档已用 109 776 步的负面结果排除);
|
|
||||||
- **不引入新的运行时依赖**(仍只有 `requests`;`numpy` 仅作可选加速后端,
|
|
||||||
`networkx`/`scipy` 不进入运行时路径);
|
|
||||||
- **不改变停止条件**(`unresolved_channels` 的口径取舍属于评分方式问题,
|
|
||||||
须先与题面评分方式核对,本轮不作为默认行为);
|
|
||||||
- **不承诺第四问 4000 s**(成本地板 ≈5566 s,见 §2.3)。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. 验收与度量
|
|
||||||
|
|
||||||
### 6.1 有效性定义(沿用,不得放宽)
|
|
||||||
|
|
||||||
```
|
|
||||||
valid := 全部真源被清除 ∧ 缺席频道与真值一致 ∧ 正常 /exit
|
|
||||||
∧ 零算法异常 ∧ 逐微秒计时复算一致
|
|
||||||
```
|
|
||||||
|
|
||||||
### 6.2 新增必报列(写入 `scripts/run_suite.py` 逐局行与 aggregate)
|
|
||||||
|
|
||||||
| 列 | 定义 | 用途 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| `route_gap_vs_offline` | `实测移动 − 离线最优开放回路(同作业点集)` / 实测移动 | 区分"排线不够好"与"点选得不对" |
|
|
||||||
| `route_lower_bound_s` | 当前任务集 MST 权重 / 速度 | 在线后悔值审计 |
|
|
||||||
| `distinct_service_points` | 去重作业点数 | 探测是否真的在减少 |
|
|
||||||
| `coverage_actual_visited` | 实际测过的覆盖点数 | 缺席证明是否提前结束 |
|
|
||||||
| `probe_no_signal_ratio` | 探测中 `no_signal` 占比 | D1 的效果指标 |
|
|
||||||
| `fallback_clear_attempts` | 已有 | D1 的主验收指标 |
|
|
||||||
|
|
||||||
### 6.3 目标(vs §2 基线)
|
|
||||||
|
|
||||||
| 指标 | Q3 现 | Q3 目标 | Q4 现 | Q4 目标 |
|
|
||||||
| --- | ---: | ---: | ---: | ---: |
|
|
||||||
| core 平均虚拟时间 | 3197 s | **≤ 2900 s** | 8676 s | **≤ 6500 s** |
|
|
||||||
| 移动 | 2458 s | ≤ 2250 s | 6257 s | ≤ 5000 s |
|
|
||||||
| 探测次数 | 30.8 | ≤ 26 | 69.0 | ≤ 45 |
|
|
||||||
| 后备盲清次数 | 0 | 0 | 125.7 | **≤ 15** |
|
|
||||||
| `route_gap_vs_offline` | 6.1% | ≤ 3% | 20.1% | ≤ 10% |
|
|
||||||
| `fallback` 清除成功率 | — | — | 10% | ≥ 90% |
|
|
||||||
| 单局计算墙钟 | 1.0 s | ≤ 1.2 s | 1.0 s | ≤ 1.5 s |
|
|
||||||
| 细网格证书缺口(15 m/72) | — | 0(Q3 解析) | 566 | **0** |
|
|
||||||
|
|
||||||
### 6.4 回归
|
|
||||||
|
|
||||||
`uv run pytest`(当前 232 项)必须全过;新增:
|
|
||||||
|
|
||||||
- `CoveragePlan` 细网格正/负例(删掉任一点必须被检出);
|
|
||||||
- `JointBelief` 的期望后验半径与真源保留性质对拍(随机 `(p,h)` × 随机观测序列);
|
|
||||||
- `Held-Karp` 与 `2-opt` 在同一小任务集上的最优性对拍(DP 结果必须 ≤ 2-opt);
|
|
||||||
- `C₂₀` 投影的三角不等式性质(投影点距候选集任一点仍 ≤ 20);
|
|
||||||
- 逐位一致性:numpy 与纯 Python 两条路径在同一动作序列下 `actions_sha256` 相同。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 7. 复现命令(本轮实测)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 度量基线(§2.1/§2.2/§2.3):作业点分解 + 离线最优回归 + 成本地板
|
|
||||||
uv run python /tmp/analyze_headroom.py # 路由 gap:Q3 6.1%,Q4 20.1%
|
|
||||||
uv run python /tmp/decompose.py # Q4 三段移动 + 动作 + 清除成功率
|
|
||||||
uv run python /tmp/q3stats.py # Q3 探测/覆盖检测/跳测统计
|
|
||||||
|
|
||||||
# 覆盖证书分辨率(§5.1)
|
|
||||||
uv run python /tmp/verify_margin.py # 现役 31 点在 25 m/48 档缺口 125
|
|
||||||
uv run python /tmp/hitset_fine.py # 细网格最小解仍是 31 点
|
|
||||||
|
|
||||||
# 既有常驻工具
|
|
||||||
uv run python scripts/run_suite.py --problem 4 --suite all --jobs 6 \
|
|
||||||
--variants directional@q4_mincover_v1 --label q4-baseline
|
|
||||||
uv run python scripts/verify_q4_cover.py --out output/q4/cover-certificate.json
|
|
||||||
uv run python scripts/analyze_run_timing.py <log.jsonl>
|
|
||||||
```
|
|
||||||
|
|
||||||
> 上述 `/tmp/*.py` 为一次性分析脚本,S1 阶段应把其中的
|
|
||||||
> `route_gap_vs_offline`、`offline_opt_open_path`、`mst_lower_bound`
|
|
||||||
> 三个函数并入 `scripts/run_suite.py`(或新建 `scripts/analyze_routing.py`)常驻入库,
|
|
||||||
> 使"虚拟时间花在哪"与"覆盖集是否合法"一样成为可随时重跑的回归项。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 8. 本轮实测回填(2026-09-12 实施结果)
|
|
||||||
|
|
||||||
本节记录 S1–S5 全部落地后的**实测**结果与**负面结论**。所有数字均为冻结基准集
|
|
||||||
(`harness/suites.py`)配对复跑,口径与 §6.1 完全一致;复现命令见 §8.6。
|
|
||||||
|
|
||||||
### 8.1 交付物清单
|
|
||||||
|
|
||||||
| 项 | 位置 | 状态 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| 图论/DP 工具箱(精确开放路径、2-opt/Or-opt、MST 下界、路由度量) | `src/mcm26b/routing.py` | ✅ 新增 |
|
|
||||||
| S1 必报列(`route_gap_vs_offline`、`route_lower_bound_s`、`distinct_service_points`、`coverage_actual_visited`、`probe_no_signal_ratio`、`plan_verify_wall_s`) | `scripts/run_suite.py` | ✅ 新增 |
|
|
||||||
| S2 设计裕量覆盖计划 + 细网格证书 + 精细剪枝 | `guarantee/cover.py`、`scripts/verify_q4_cover.py`、`plans/q4_mincover_v2.json` | ✅ 新增并设为默认 |
|
|
||||||
| S3/D1 期望后验半径值函数 + 可见性过滤 + 抵近点 | `belief/joint.py`、`planner/__init__.py` | ✅ 新增(默认口径见 §8.3) |
|
|
||||||
| S4/D3 后备清除路径改进 | `planner/__init__.py::_fallback_order` | ⚠️ 已实现,实测负收益,默认关闭 |
|
|
||||||
| S5/T1 Held-Karp 精确任务序(含换频状态) | `planner/bayes_loop.py::_exact_order` | ⚠️ 已实现,实测负收益,默认关闭 |
|
|
||||||
| 回归测试 | `tests/test_routing.py`、`tests/test_joint_belief.py`、`tests/test_coverage_plan.py` | ✅ 新增,`uv run pytest` 268 项全过 |
|
|
||||||
|
|
||||||
### 8.2 最终成绩(vs S0 基线)
|
|
||||||
|
|
||||||
| 指标 | Q3 基线 | Q3 现 | Q4 基线 | Q4 现 | 目标 |
|
|
||||||
| --- | ---: | ---: | ---: | ---: | ---: |
|
|
||||||
| core 平均虚拟时间 | 3210.3 s | **3188.7 s(−0.7%)** | 8676.1 s | **8602.0 s(−0.9%)** | 2900 / 6500 ✗ |
|
|
||||||
| core 最大虚拟时间 | 3798.5 s | **3663.7 s(−3.5%)** | 10890.8 s | **9630.4 s(−11.6%)** | — |
|
|
||||||
| 移动 | 12446.8 m | **12338.1 m(−0.9%)** | 31286.4 m | 32891.1 m(+5.1%) | 2250 / 5000 ✗ |
|
|
||||||
| 检测次数 | 111.0 | 111.1 | 346.0 | **333.7** | — |
|
|
||||||
| 后备盲清次数 | 0 | 0 | **125.7** | **4.3(−96.6%)** | ≤15 ✅ |
|
|
||||||
| `route_gap_vs_offline` | 8.67% | **8.07%** | 18.9% | 24.3% | ≤3% / ≤10% ✗ |
|
|
||||||
| 单局计算墙钟 | 1.29 s | **1.04 s** | 5.29 s | **4.09 s** | ≤1.2 / ≤1.5 ⚠️ Q4 超标 |
|
|
||||||
| 覆盖计划运行期校验 | — | 0.42 s | — | 4.80 s(15 m/72 一次性) | — |
|
|
||||||
| 细网格证书缺口(15 m/72) | — | 0(解析) | 566 | **0** | 0 ✅ |
|
|
||||||
| 有效局 | 18/18 | 20/20(含边界) | 9/9 | 11/11(含边界) | 100% ✅ |
|
|
||||||
|
|
||||||
**结论**:本轮的硬收益是**第四问后备盲清被消除**(125.7 → 4.3 次/局,最坏局
|
|
||||||
10890.8 → 9630.4 s)与**覆盖证书的正确性**(细网格缺口 566 → 0);虚拟时间只有
|
|
||||||
0.7–0.9% 的均值改善(中位 −2.0%),**远未达到方案 §6.3 的目标**。
|
|
||||||
第三问的改善落在噪声内(中位相对变化 0.0005)。§2 的成本地板估计(Q3 可压缩
|
|
||||||
10–14%、Q4 23–32%)**过于乐观**,实测只回收了约 1%。
|
|
||||||
|
|
||||||
### 8.3 定向源探点(D1):先负后正,最终只保留"可见 + 就近"
|
|
||||||
|
|
||||||
D1 的完整实现(期望后验 MEC 半径值函数 + 抵近点 + 遮挡点剔除)在**修正联合
|
|
||||||
信念朝向规则之前**配对为:后备 125.7 → 53.8 次,但探测移动 +5.6 km,虚拟时间
|
|
||||||
8676 → 9411 s(净负)。原因有两个:
|
|
||||||
|
|
||||||
1. 后备清除在命中真源时**立即结束**,"整条路径最短"不是它的目标函数,
|
|
||||||
§3.2/§3.3 的插入代价模型在这里并不成立;
|
|
||||||
2. 更关键的是:**联合信念的 `no_signal` 朝向规则被写反了**(§8.4),
|
|
||||||
`prob_detect` / 期望半径因此系统性地高估"被遮挡点可见",选点必然跑偏。
|
|
||||||
|
|
||||||
修正后重测(9 场景 core):
|
|
||||||
|
|
||||||
| `probe_score_mode` | λ | 后备次数 | T 均值 | 移动 | 计算墙钟 |
|
|
||||||
| --- | ---: | ---: | ---: | ---: | ---: |
|
|
||||||
| `visibility`(旧) | — | 125.6 | 9224.6 s | 33595 m | 11.6 s |
|
|
||||||
| `expected_radius` | 0.05 | 6.8 | 9740.5 s | 38824 m | 9.6 s |
|
|
||||||
| `expected_radius` | 5.0 | 4.3 | 8604.3 s | 32893 m | 3.7 s |
|
|
||||||
| `nearest_visible`(默认) | — | **4.3** | **8602.0 s** | 32891 m | 3.4 s |
|
|
||||||
|
|
||||||
λ 越大越优说明本题的探点问题里"**看得见且少走路**"比"单步信息量最大"更重要;
|
|
||||||
λ→∞ 的极限(可见候选中移动最省)就是默认口径。值函数代码与其对拍测试保留,
|
|
||||||
供后续研究(例如配合真正的多步 rollout)。
|
|
||||||
|
|
||||||
### 8.4 本轮发现的正确性缺陷(已修复)
|
|
||||||
|
|
||||||
`belief/joint.py` 的 no_signal 朝向裁剪**规则反向**:`keep=False` 分支用了
|
|
||||||
"确定覆盖"掩码做交集,等价于保留"必然看得见"的档、删掉"确定看不见"的档;
|
|
||||||
`keep=True` 分支又漏计了格内角裕量 `asin(margin/max(dist−margin,1))`。
|
|
||||||
两者都会删掉真源的朝向档(`tests/test_joint_belief.py::test_true_source_survives_consistent_observations`
|
|
||||||
在随机观测序列上直接复现)。修复后:
|
|
||||||
`keep=False` 改用 `_far_mask`(与 `_cover_mask` 互补)并把距离阈值收紧为
|
|
||||||
`r_eff_min − margin`,`keep=True/False` 都计入格内角裕量。
|
|
||||||
|
|
||||||
**修复本身是净成本**:在旧 `visibility` 探点口径下 Q4 core 由 8676 → 9225 s;
|
|
||||||
换成 §8.3 的新探点口径后回落到 8602 s,同时后备清除降 96.6%。
|
|
||||||
换言之,本轮第四问的成绩改善**主要来自"修好信念 + 换探点口径"这一组合**,
|
|
||||||
而不是 §3 预期的插入/排线优化。
|
|
||||||
|
|
||||||
### 8.5 覆盖证书硬化(S2)
|
|
||||||
|
|
||||||
现役 `q4_mincover_v1`(31 点)在粗采样(75 m/24)下缺口 0,但细网格复检:
|
|
||||||
|
|
||||||
| 点集 | 点数 | 25 m/48 缺口 | 20 m/72 缺口 | 15 m/72 缺口 | 最坏命中 | NN 巡回 |
|
|
||||||
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
|
|
||||||
| `q4_mincover_v1`(旧) | 31 | 125 | 336 | 566 | 1000.0 m | 22.9 km |
|
|
||||||
| `q4_mincover_v2`(默认) | 31 | **0** | **0** | **0** | **990.0 m** | 23.9 km |
|
|
||||||
| 严格连续空间证书备选 | 36 | 0 | 0 | 0 | 973.7 m | 25.4 km |
|
|
||||||
|
|
||||||
`q4_mincover_v2` 的生成方式:搜索分辨率 50 m/48 档、设计裕量 `r_design=965 m`、
|
|
||||||
前向角裕量 5°,再做**证书分辨率(15 m/72)精细剪枝**(每次删点都用同一证书口径
|
|
||||||
复核),因此点数与旧计划相同而缺口归零,**没有付出点数代价**。
|
|
||||||
|
|
||||||
> 严格连续空间界需要 `r_verify + 15·√2/2 ≤ 1000`(即 ≤989.4 m)且角裕量 ≥2.5°;
|
|
||||||
> 满足该条件的 36 点方案最坏命中 973.7 m,但代价 +5 点(约 +1000 s),
|
|
||||||
> 已落盘为 `output/q4/cover-certificate-v3.json` 备用。默认方案在 15 m/72
|
|
||||||
> 采样下最坏 990.0 m,与严格界的差 0.65 m 属采样边界效应,作为已知残余风险登记。
|
|
||||||
|
|
||||||
### 8.6 负面结论与复现命令
|
|
||||||
|
|
||||||
| 优化项 | 实测 | 结论 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| S4/D3 后备清除 Or-opt | 后备失败 125.7 → 161.4 次(T 8676 → 8940 s) | ❌ 目标函数错位:命中即停,路径最短反而把真源推后 |
|
|
||||||
| S5/T1 Held-Karp 精确任务序 | 3203.2 s vs 2-opt 3193.1 s(18 场景) | ❌ 滚动时域下"当前任务表逐位最优"反而略差;默认 0 |
|
|
||||||
| `route_aware_probe` | 3210.3 s vs 关闭 3193.1 s | ❌ 权重 1e-3 的路线项无净收益;默认关闭 |
|
|
||||||
| Q4 融合巡回(站点顺带定位) | 12711 s vs 10809 s | ❌ 与 P0-1 在第三问的负面结论一致 |
|
|
||||||
| `opportunistic_radius_ratio` | 0.65 → 0.5:3210.3 → 3205.4 s | ✅ 采纳(弱收益) |
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# S1 度量基线(含路由 gap / MST 下界 / 作业点/静默率)
|
|
||||||
uv run python scripts/run_suite.py --problem 4 --suite core --jobs 6 \
|
|
||||||
--variants directional --label q4-baseline --out output/suite
|
|
||||||
uv run python scripts/run_suite.py --problem 3 --suite core --jobs 6 \
|
|
||||||
--variants bayes --label q3-baseline --out output/suite
|
|
||||||
|
|
||||||
# S2 覆盖证书(生成 + 细网格校核;--fine-prune 走证书分辨率剪枝)
|
|
||||||
uv run python scripts/verify_q4_cover.py --spacing 100 --radius 2850 \
|
|
||||||
--target-step 50 --headings 48 --design-radius 965 --heading-margin 5 \
|
|
||||||
--verify-step 15 --verify-headings 72 --fine-prune \
|
|
||||||
--write-plan q4_mincover_v2 --out output/q4/cover-certificate-v2.json
|
|
||||||
|
|
||||||
# S3/D1 口径配对(可见性/值函数/极限三档)
|
|
||||||
uv run python scripts/run_suite.py --problem 4 --suite core --jobs 6 \
|
|
||||||
--variants "directional#search.probe_score_mode=visibility,\
|
|
||||||
directional#search.probe_score_mode=expected_radius;search.probe_lambda_move_s=5,\
|
|
||||||
directional#search.probe_score_mode=nearest_visible" --label q4-probe-ab
|
|
||||||
|
|
||||||
# 回归
|
|
||||||
uv run pytest -q # 268 项
|
|
||||||
```
|
|
||||||
|
|
||||||
### 8.7 仍未达标项的处置建议
|
|
||||||
|
|
||||||
| 未达标 | 差距 | 建议 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| Q3 ≤2900 s | −9% | 已无低风险空间:七站巡回 1392 s + 覆盖检测 501 s + 每源 ≥2 次探测是成本地板;需要改停止条件或覆盖语义才能继续下降 |
|
|
||||||
| Q4 ≤6500 s | −24% | 31 点巡回 + 缺席检测 ≈5566 s 是地板,与 §2.3 一致;只能改"逐频道缺席证明"口径 |
|
|
||||||
| `route_gap` Q4 24.3% | — | 该指标在"作业点数随决策变化"时口径不稳(本方案把后备格换成探测点后作业点从 206 降到 110);建议改为"覆盖骨架段"与"临时任务段"分别报 gap |
|
|
||||||
| Q4 计算墙钟 4.1 s(目标 1.5 s) | 2.7 s | 热点在 `belief` 凸多边形与 `select_measurement_point`(D1 之前的基线即 5.3 s),属 P0-4b 表示层张量化,与本方案无关 |
|
|
||||||
| 严格连续空间覆盖证书 | 0.65 m | 若要正式采用 36 点严格方案:`--verify-radius 989 --verify-heading-margin 2.5`,代价约 +1000 s |
|
|
||||||
@@ -1,595 +0,0 @@
|
|||||||
# 第三、四问系统性架构优化与运行提速方案
|
|
||||||
|
|
||||||
- 版本:2026-09-12
|
|
||||||
- 依据:本仓库运行历史(`session.jsonl`、`practice-p3-*.jlog`、`referee-data/sessions/*`、
|
|
||||||
`output/hrl/ui/q3-main/*`、`docs/` 全部性能记录)+ 本文档新增的复跑与离线校核实验
|
|
||||||
- 范围:第三问(全向源)与第四问(混合定向源)的**闭环架构、算法分解、运行治理**,
|
|
||||||
不改动题面约束、协议层语义与既有保守性不变量
|
|
||||||
- 结论先行:**虚拟时间的 75–83% 是移动**,移动里约一半不是覆盖巡回而是定位/清除往返;
|
|
||||||
**第四问的全部失败来自定向源**;旧机器学习层已被证明不如手写基线。
|
|
||||||
因此本轮优化的主线是"**把定位并入覆盖巡回 + 把发现集压到最小命中集 + 给定向源建位置×朝向联合信念**",
|
|
||||||
而不是再堆学习算法。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 0. 摘要(TL;DR)
|
|
||||||
|
|
||||||
### 0.1 三个待解的结构性浪费
|
|
||||||
|
|
||||||
| 编号 | 现象 | 直接证据 | 估计可回收 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| W1 | Q3 定位探点往返 5741 m / 1148 s,与覆盖巡回(6960 m / 1392 s)相当 | 本次复跑(13 源,seed 0):24 次探点,均值 442 m/次 | **−900 ~ −1100 s/局** |
|
|
||||||
| W2 | Q4 发现集是 700 m 方格 49 点,巡回 36.4 km;同一保证下贪心最小命中集只要 31 点、22.9 km | `scripts/verify_q4_cover.py`:43 032 个 (p,h) 采样,两组点集均 100% 覆盖 | **−2700 s(巡回)+ −1140 s(检测)** |
|
|
||||||
| W3 | Q4 定向源没有"位置×朝向"联合信念,只能阶梯探点,最后退化到 ≤400 格盲清 | referee 两局:全向 17/17 清除,定向仅 2/6;4/4 漏检全是定向 | **−1500 ~ −3000 s/局** |
|
|
||||||
|
|
||||||
### 0.2 预期收益(自建模拟器,同一冻结基准集,配对口径)
|
|
||||||
|
|
||||||
| 指标 | Q3 现状 | Q3 目标 | Q4 现状 | Q4 目标 |
|
|
||||||
| --- | ---: | ---: | ---: | ---: |
|
|
||||||
| 平均虚拟时间 | 3707 s(本次 6 场景)/ 3536 s(13 源单局) | **≤ 2700 s** | 13 652 s(10 源 3 定向单局)/ 13 165 s(4 场景均值) | **≤ 9000 s** |
|
|
||||||
| 最大虚拟时间 | 4628 s | **≤ 4000 s** | > 17 000 s(边界压力) | ≤ 12 000 s |
|
|
||||||
| 每局计算墙钟 | 2.9–6.5 s | **≤ 0.8 s** | 6.5 s | **≤ 1.0 s** |
|
|
||||||
| 有效局(全清+缺席无误判+零异常+正常退出+计时复算一致) | 6/6 | 基准集 100% | 4/4 | 基准集 100% |
|
|
||||||
|
|
||||||
> 4000 s 是本项目 `docs/算法审核与优化-20260911.md` 自设的验收线,不是题面评分线;
|
|
||||||
> 第四问在 10 源场景下**不承诺**达成 4000 s,理由见 §6.2。
|
|
||||||
|
|
||||||
### 0.3 明确不做的事
|
|
||||||
|
|
||||||
- 不重新引入 PPO/HRL。运行历史支持"保留手写基线":HRL 训练 4007.9 s / 109 776 步后
|
|
||||||
仍被 `bayes` 稳定压制 4.3–5.0%(17–18/20 场景,符号检验 p=0.0001),且 94% 的差距来自
|
|
||||||
多走的移动;其评估集 20 个场景**全部是单源全向**,无法支撑任何第四问结论。
|
|
||||||
- 不引入新的第三方运行时依赖(仍是 `requests`;`numpy` 仅作**可选加速后端**,缺失时回退纯 Python)。
|
|
||||||
|
|
||||||
### 0.4 实施进展与实测回填(2026-09-12)
|
|
||||||
|
|
||||||
冻结基准集 `harness/suites.py`(第三问 18 主场景 + 2 边界;第四问 9 + 2),
|
|
||||||
并行 runner `scripts/run_suite.py`,配对口径同场景同误差种子。
|
|
||||||
|
|
||||||
| 项 | 状态 | 实测 | 结论 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| P1-4 安全阀 | ✅ 已实现 | `summary` 新增 `completion_basis` / `absence_evidence` / `redundant_rescan_measures` / `virtual_reserve_s`;`--persistent` 输出单轮上界告警 | 采纳(5 项测试) |
|
|
||||||
| P0-2 最小命中集 | ✅ 已实现并默认开启 | 第四问 11 场景配对:**14003.0 → 10975.5 s**(均值 −19.3%、中位 −25.4%、10/11 更快);检测 444.5→319.2;请求 569.5→395.6;位移 54.9→44.2 km;最大 17007→12919 s;11/11 valid | **采纳** |
|
|
||||||
| P0-4 感知层向量化 | ✅ 已实现 | 单局计算 **3.10 → 1.00 s(3.08×)**,最大 5.84 → 1.30 s;20 场景的虚拟时间与动作序列**逐位一致** | **采纳**(目标 ≤0.8 s 未达,余下为 belief 表示层) |
|
|
||||||
| P0-1 融合巡回 | ❌ 实测无效,已回退默认 | 仅追加站点方位线:3454.6 vs 3426.9 s(+0.8%,检测 +10.8 次、位移仅 −188 m);追加 + 抑制专用探点:**4989.0 vs 3426.9 s(+45.6%,20/20 更慢)** | 关闭(保留开关与代码) |
|
|
||||||
| P1-1 C₂₀ 最近清除点 | ⊘ 复核后降为非项 | 现有 `_near_clear_target` 已取安全球 `B(c, limit−ρ)` 内离当前位置最远点;与完整 C₂₀ 最优之差 ≤ slack+margin ≈ 0.74 m | 不改 |
|
|
||||||
| P1-3 基准集/并行 | ✅ 已实现 | 20 场景 × 3 变体 = 60 局 **26.5 s**(6 进程);20 局 **3.9 s** | 采纳 |
|
|
||||||
| P0-3 联合信念 | ✅ 已实施并于 2026-09-12 修正 | 网格粒子 × 24 档朝向 bin + 可见性选点;**发现并修复 `no_signal` 朝向规则反向缺陷**(原会删掉真源朝向档);配套 D1 探点口径使第四问后备盲清 **125.7 → 4.3 次/局** | 采纳(结论与实测见[图论与 DP 优化方案 §8](第三四问图论与动态规划优化方案.md)) |
|
|
||||||
|
|
||||||
**P0-1 为什么失败(重要负面结论)**:七站环上通常只有 2–3 个站能对同一源取得
|
|
||||||
有效方位线,且站间交会角不足以直接换到 20 m 证书,专用信息增益探点仍然必要;
|
|
||||||
"顺路测量"于是退化为平白多花检测,一旦抑制专用探点则会白等巡回、远端绕行。
|
|
||||||
**结论:第三问的定位往返不是可回收的浪费,`bayes` 的滚动时域调度已在做正确的事。**
|
|
||||||
|
|
||||||
**第四问现状与目标差距(2026-09-12 图论/DP 轮回填)**:启用硬化覆盖计划
|
|
||||||
`q4_mincover_v2` 与 D1 探点口径后,第四问 11 场景(core + boundary)均值为
|
|
||||||
**9069.9 s**、最大 12081.1 s、后备盲清 24.8 次/局(core 9 场景 8602.0 s /
|
|
||||||
4.3 次),仍远高于 4000 s 验收线。剩余成本主要是最小命中集巡回
|
|
||||||
(23.9 km ≈ 4777 s)与缺席频道检测,二者都是覆盖证明的固有代价;
|
|
||||||
本方案 §2.3 的"可压缩 23–32%"在本模拟器上只回收了约 1%(详见图论与 DP 方案 §8)。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 1. 运行历史复核
|
|
||||||
|
|
||||||
### 1.1 数据资产清单(本次实际读取)
|
|
||||||
|
|
||||||
| 资产 | 内容 | 可用信息 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| `session.jsonl`(31 011 行) | 官方第三问演练 J2WH-2K7D-5ZXS-DNK6 的客户端日志 | 10 323 次 `/measure`、12 次 `/clear`、逐动作计时 |
|
|
||||||
| `practice-p3-*.jlog` | 同一局的官方行为日志封装 | 仅明文信封(题号 3、队号、案例码);载荷 AES-256-GCM + RSA-OAEP,不可解 |
|
|
||||||
| `referee-data/sessions/*`(6 局,5 局完整) | 本地评测机 q3×3、q4×2、截断×1 | 逐请求响应、真值、summary、step 事件 |
|
|
||||||
| `output/hrl/ui/q3-main/` | HRL 训练(109 776 步)+ `eval/at-40k`、`eval/at-final` | monitor CSV、模型元数据、20 场景配对评估 |
|
|
||||||
| `docs/算法审核与优化-20260911.md`、`docs/algo-3.md`、`docs/algo-3-bayes.md` | 历史 KPI 与消融 | 官方/自建成绩、验证集分档 |
|
|
||||||
| 本次新增复跑 | `scripts/benchmark_q3_bayes.py`(6 场景)、Q3/Q4 单局计时分解、`cProfile`、站点三角化可行性 | §1.3 中标注"本次复跑"的数字 |
|
|
||||||
| 本次新增工具(已入库) | `scripts/analyze_run_timing.py`(任意会话日志的计时分相复算)、`scripts/verify_q4_cover.py`(第四问覆盖证书 + 最小命中集搜索) | F4、F9 可复现 |
|
|
||||||
|
|
||||||
### 1.2 先确认度量可信(否则一切优化都是自欺)
|
|
||||||
|
|
||||||
官方计时模型:`T = L/5 + 5·N_measure + N_switch + 5·N_clear⁺ + 3·N_clear⁻`,
|
|
||||||
其中 `L` 为累计直线位移,`/clear` **不计**换频。`scripts/verify_q3_practice.py` 对 5 局完整
|
|
||||||
评测机日志逐微秒复算,与服务器返回的 `virtual_time_s` 完全一致(例:BBM9 复算 3134.642907 = 记录 3134.642907)。
|
|
||||||
结论:**后续所有"虚拟时间"结论都可用动作日志独立复算**,这是本项目最可靠的一条工程资产,必须保留。
|
|
||||||
|
|
||||||
### 1.3 关键事实(F1–F13)
|
|
||||||
|
|
||||||
| 编号 | 事实 | 出处 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| F1 | 虚拟时间构成:**移动 75–83%|检测动作 15–21%|换频 2.3–3.7%** | 官方会话 82.30/14.76/2.94;referee q3 80.50/16.78/2.71、q4 78.39/18.63/2.98;本次复跑 Q3 79.9/17.3/2.9、Q4 75.2/21.1/3.7 |
|
|
||||||
| F2 | 官方第三问演练 J2WH 总虚拟 350 227.7 s,其中 **346 169.9 s(98.84%)是空复扫**:7 个固定站点 × 8 个未清除频道 × 183 轮,0 检出,结束点正好落在 `virtual_reserve_s=10 000` 边界 | `session.jsonl` 相位切分;`planner/__init__.py:236`、`config.py:99` |
|
|
||||||
| F3 | **第四问的全部失败来自定向源**:referee 两局全向 17/17 清除,定向仅 2/6;4/4 漏检全是定向;每清除源 356.4 s(Q3 274.0 s,+30%) | `referee-data/sessions/{6X58,BAU8}`;`{BBM9,RM7Y,VQKB}` |
|
|
||||||
| F4 | 本次复跑 Q3(13 源,seed 0):3535.9 s / 109 次检测 / 13 清除;**七站巡回 6960 m(1392 s,39%)+ 探点往返 5741 m(1148 s)+ 清除移动 3668 m(734 s)** | 本次复跑(方法见附录 A) |
|
|
||||||
| F4b | 评测机 Q3 单局 BBM9:**21 次专用探点占 1138.7 s 移动,等于该局虚拟时间的 36.3%**,而站点扫频 98 次只占 991.2 s | `scripts/analyze_run_timing.py referee-data/sessions/BBM9-.../log.jsonl --plan seven` |
|
|
||||||
| F5 | 本次复跑 Q4(10 源 3 定向,seed 0):13 652.1 s / 560 次检测 / 18 次清除(8 次失败)/ 51 356 m | 本次复跑 |
|
|
||||||
| F6 | 感知层是墙钟热点:单局计算 6.04 s;`cProfile` 下 `expected_survival` 占累计时间 **72%**(2808 次调用),`apply_measure` ≈ 20%,`_kill_outside_wedge` 触发 498 万次 `angular_gap` | 本次 `cProfile`(13 源单局) |
|
|
||||||
| F7 | HRL 运行:109 776/200 000 步、4007.9 s、**27.0 steps/s(6.75/env)**、1.51 s 墙钟/局;被 SIGTERM 截断时回报仍在上升(Q1 1.05 → Q4 6.20) | `output/hrl/ui/q3-main/q3.json` + 4 份 monitor CSV |
|
|
||||||
| F8 | HRL 评估:20 场景**全部单源全向**;`bayes` 比 HRL 快 4.3–5.0%(17–18/20,p=0.0001),**94% 的差距是多走的移动**;40k→109k 步仅再改善 0.7% | `eval/at-40k|at-final/aggregate.*`、`eval/manifest.json` |
|
|
||||||
| F9 | 现役 Q4 发现集:700 m 方格 49 点、NN 巡回 **36.4 km**;满足同一"前向半盘命中"保证的贪心最小集 **31 点、22.9 km(−37%)**,覆盖校核 100% | `scripts/verify_q4_cover.py`;本文附录 A |
|
|
||||||
| F10 | Q3 七站巡回**已经最优**:6 × 1159.7 = 6958 m(观测 6960 m),无可压缩空间;把环半径降到覆盖下界 1122.9 m 仅省 222 m(44 s) | 几何计算 + 本次复跑 |
|
|
||||||
| F11 | 站点三角化可行:**99.28% 的源位置有 ≥2 个站在 1500 m 内**;最佳交会角 5 分位 58.5°、中位 122.9°;只有 0.72% 的源位置仅 1 个站在射程内 | 本次离线采样(20 000 点) |
|
|
||||||
| F12 | 墙钟量级差三个数量级:内存回放 **0.22–0.25 ms/请求**(≈0.35 s/局),官方接口 **9.42 ms 均值/请求**(104.49 s / 10 337 请求);本地评测机 24.5–97.9 ms/请求 | referee `session_end`、`runs/*/summary.json`、`session.jsonl elapsed_s` |
|
|
||||||
| F13 | 历史 KPI 参照:Q3 官方最好 4058.71 s(3BW5,13/13)、5232.13 s(J4ER,12/12);自建 `bayes` 3707.3 s(本次 6 场景)/ 3726.2 s(14 场景消融)/ 验证集 3315.89 s;Q4 自建 13 164.7 s,**无官方第四问演练记录** | `docs/算法审核与优化-20260911.md`、`docs/algo-3-bayes.md`、`README.md:135` |
|
|
||||||
|
|
||||||
### 1.4 由事实导出的六处结构性瓶颈
|
|
||||||
|
|
||||||
| 编号 | 瓶颈 | 支撑事实 | 归属层 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| B1 | 定位/清除移动没有并入覆盖巡回,探点按"信息增益"选,移动权重 λ=0.0105 几乎不惩罚绕行 | F1、F4、F4b、F11 | 决策层 |
|
|
||||||
| B2 | Q4 发现集冗余 63%(49 点 vs 30 点),且每个"真缺席"频道要在全部 49 点各测一次 | F5、F9 | 保证层 |
|
|
||||||
| B3 | Q4 定向源缺少位置×朝向联合信念:`no_signal` 只记"被遮挡过几次",选点靠固定 45° 阶梯,收敛失败后退化到 ≤400 格 20 m 盲清(≤1200 s + ≤400 请求) | F3、`planner/__init__.py:691-768` | 感知层 + 决策层 |
|
|
||||||
| B4 | 感知层全 Python 容器:每局 20 个频道各建 ~6.1 万格 `set`,`_kill_outside_wedge` 每次遍历全部幸存格,评分核 `expected_survival` 为 7×800 的纯 Python 双循环 | F6 | 感知层 |
|
|
||||||
| B5 | 研发吞吐低:场景串行、单进程;一局 0.35–6.5 s;HRL 27 steps/s;14–52 场景的配对基准要跑几分钟到十几分钟 | F6、F7、F12 | 实验层 |
|
|
||||||
| B6 | 运行治理缺失:单源评估集使指标退化(`avg_locate_clear_time_s ≡ virtual_time_s`)、`eval/manifest.json` 三份重复且与 `output/hrl/ui/manifest.json` 不一致(后者缺失)、`persistent_search=True` 可造成 98.84% 的无效开销且无硬性告警 | F2、F8、F13 | 遥测/实验层 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. 目标架构
|
|
||||||
|
|
||||||
### 2.1 分层与依赖方向(依赖只能向下)
|
|
||||||
|
|
||||||
```
|
|
||||||
┌───────────────────────────────────────────────┐
|
|
||||||
L6 实验/遥测 │ bench/ 冻结基准集·并行 runner·配对统计 │
|
|
||||||
│ telemetry/ manifest·step log·replay·summary │
|
|
||||||
└───────────────▲───────────────────────────────┘
|
|
||||||
│ 只读观测
|
|
||||||
┌───────────────┴───────────────────────────────┐
|
|
||||||
L5 执行/安全 │ exec/ 动作账本·预算守卫·安全阀·幂等客户端 │
|
|
||||||
└───────────────▲───────────────────────────────┘
|
|
||||||
│ Action 请求
|
|
||||||
┌───────────────┴───────────────────────────────┐
|
|
||||||
L4 决策 │ plan/ 任务表·滚动时域排序·信息/时间评分 │
|
|
||||||
└───────────────▲───────────────────────────────┘
|
|
||||||
│ Task[]
|
|
||||||
┌───────────────┴───────────────────────────────┐
|
|
||||||
L3 保证 │ guarantee/ 命中集覆盖计划·清除证书·缺席证明 │
|
|
||||||
└───────────────▲───────────────────────────────┘
|
|
||||||
│ 候选集/幸存集
|
|
||||||
┌───────────────┴───────────────────────────────┐
|
|
||||||
L2 信念 │ belief/ BeliefBackend:OccupancyTensor(Q3) │
|
|
||||||
│ JointTensor(位置×朝向, Q4) │
|
|
||||||
└───────────────▲───────────────────────────────┘
|
|
||||||
│ Observation
|
|
||||||
┌───────────────┴───────────────────────────────┐
|
|
||||||
L1 观测模型 │ model/ 可见性半平面·r_eff 带·有界误差·舍入裕量 │
|
|
||||||
└───────────────▲───────────────────────────────┘
|
|
||||||
│ 原始响应
|
|
||||||
┌───────────────┴───────────────────────────────┐
|
|
||||||
L0 协议/时钟 │ protocol/ 规则表·计时模型·状态机·客户端(冻结)│
|
|
||||||
└───────────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
与现状的差别:**用组合取代继承**。现状是
|
|
||||||
`OmnidirectionalLoop → SevenBatch → BayesLoop → DirectionalExtension` 的单继承链,
|
|
||||||
调度、信念、清除、预算、报表五种职责混在同一族类里(`planner/__init__.py` 818 行 +
|
|
||||||
`planner/bayes_loop.py` 513 行),任何一处改动都会跨层影响其它三问。
|
|
||||||
目标形态是
|
|
||||||
|
|
||||||
```python
|
|
||||||
Episode(
|
|
||||||
client = SimulatorClient(...), # L0,冻结
|
|
||||||
belief = OccupancyTensor(...) | JointTensor(...), # L2
|
|
||||||
plan = CoveragePlan.points, # L3
|
|
||||||
scorer = InfoGainPerSecond(...), # L4
|
|
||||||
policy = FusedTourPolicy(...) | DirectionalPolicy(...), # L4
|
|
||||||
certifier= Certificate(...), # L3
|
|
||||||
ledger = Telemetry(...), # L6
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
三层保证策略矩阵只差**三个可替换部件**,其余代码共享:
|
|
||||||
|
|
||||||
| 问题 | 信念后端 | 覆盖计划 | 选点策略 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| Q3 | `OccupancyTensor`(全向) | 七站环(已经最优,冻结) | 融合巡回 |
|
|
||||||
| Q4 | `JointTensor`(位置×朝向) | **最小命中集**(30 点,离线搜索 + 运行期校验证书) | 可见性约束选点 |
|
|
||||||
|
|
||||||
### 2.2 接口契约(关键签名)
|
|
||||||
|
|
||||||
```python
|
|
||||||
# L1 model/observation.py —— 只此一处定义"什么算看见"
|
|
||||||
@dataclass(frozen=True)
|
|
||||||
class ObservationModel:
|
|
||||||
r_eff_min_m: float; r_eff_max_m: float
|
|
||||||
near_radius_m: float; half_angle_deg: float
|
|
||||||
directional_half_deg: float = 90.0 # 含边界
|
|
||||||
|
|
||||||
def visible(self, src: Vec2, heading_deg: float | None, reader: Vec2) -> bool: ...
|
|
||||||
def detectable(self, src: Vec2, heading_deg: float | None, reader: Vec2) -> bool: ...
|
|
||||||
|
|
||||||
# L2 belief/base.py —— 两种后端实现同一协议
|
|
||||||
class BeliefBackend(Protocol):
|
|
||||||
def apply(self, channel: int, reader: Vec2, result: str,
|
|
||||||
svd_deg: float | None) -> None: ...
|
|
||||||
def alive(self, channel: int) -> int: ...
|
|
||||||
def is_absent(self, channel: int) -> bool: ... # 幸存集为空
|
|
||||||
def certificate(self, channel: int) -> ClearCertificate | None: ...
|
|
||||||
def guaranteed_no_signal(self, channel: int, reader: Vec2) -> bool: ...
|
|
||||||
def prob_detect(self, channel: int, reader: Vec2) -> float: ... # 决策用
|
|
||||||
def version(self, channel: int) -> int: ... # 派生量缓存键
|
|
||||||
|
|
||||||
# L3 guarantee/cover.py —— 覆盖计划是"可离线搜索、可在运行期校验"的一等对象
|
|
||||||
@dataclass(frozen=True)
|
|
||||||
class CoveragePlan:
|
|
||||||
problem: int # 3 | 4
|
|
||||||
points: tuple[Vec2, ...]
|
|
||||||
certificate: CoverCertificate # 采样分辨率、缺失数、最坏裕量、脚本哈希
|
|
||||||
version: str
|
|
||||||
def verify(self, model: ObservationModel, tol_m: float) -> CoverCertificate: ...
|
|
||||||
|
|
||||||
# L4 plan/policy.py
|
|
||||||
class Policy(Protocol):
|
|
||||||
def tasks(self, belief: BeliefBackend, state: RobotState) -> list[Task]: ...
|
|
||||||
def order(self, tasks: list[Task], state: RobotState) -> list[Task]: ...
|
|
||||||
def measured_at_point(self, point: Vec2) -> tuple[int, ...]: ... # 一停多测
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2.3 四条设计原则
|
|
||||||
|
|
||||||
1. **保守性不变量不动**:真源永不被删;清除证书始终基于完整 ±1.005° 角域与题面距离带;
|
|
||||||
所有启发式(均匀先验、朝向先验、信息增益)**只用于选点,不用于安全证明**。
|
|
||||||
Q4 的朝向联合信念必须自带"朝向未观测时退化为全向"的保守分支。
|
|
||||||
2. **保证 = 离线搜索 + 运行期校验**:覆盖集、清除点、巡回顺序都可以离线用数值搜索优化,
|
|
||||||
但运行期必须用同一份 `ObservationModel` 重新校验证书(点集、分辨率、裕量),
|
|
||||||
校验失败即拒绝启动,而不是相信一个写死的点表。
|
|
||||||
3. **一个事实一个来源**:题面常量、`r_eff` 带、清除半径、动作耗时只在 `config.py`;
|
|
||||||
可见性语义只在 `model/observation.py`;训练/部署若将来共存,必须共用同一控制器模块
|
|
||||||
(这是旧 HRL 用 13 000 行换来的教训:v1 的 5 个特征索引错位、BC 激活函数不一致、
|
|
||||||
旧基准把 `completed` 当全清)。
|
|
||||||
4. **每个优化都必须可配对、可复算、可回归**:冻结基准集 + 逐局 `manifest` + 动作日志
|
|
||||||
+ 逐微秒复算;任何"更快"的声明必须给出配对分布(均值/中位/最大/更快场数),
|
|
||||||
而不是单个最优场景。
|
|
||||||
|
|
||||||
### 2.4 迁移映射(现状 → 目标)
|
|
||||||
|
|
||||||
| 现状 | 目标 | 处理 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| `protocol/*`、`evaluation/recompute_virtual_time` | 不变 | 冻结,作为度量基准 |
|
|
||||||
| `belief/__init__.py`(凸外包) | `belief/convex.py` | 原样搬迁,继续负责精确角域证书 |
|
|
||||||
| `particles.py`(网格幸存集) | `belief/occupancy.py`(numpy 张量 + 纯 Python 回退) | 重写热核,语义不变,保留 `tests/test_particles.py` 的真源保留性质测试 |
|
|
||||||
| — | `belief/joint.py`(位置×朝向) | 新增,Q4 专用 |
|
|
||||||
| `coverage/` | `guarantee/cover.py` | 49 点常量表 → 可校验的 `CoveragePlan` |
|
|
||||||
| `planner/bayes_loop.py` 的 `_build_tasks/_order_tasks` | `plan/tasks.py`、`plan/schedule.py` | 抽出,Q3/Q4 共用 |
|
|
||||||
| `planner/bayes_loop.py::_select_point` | `plan/score.py` | 抽出 + 向量化评分 |
|
|
||||||
| `planner/__init__.py::DirectionalExtension` | `plan/policy.py::DirectionalPolicy` + `belief/joint.py` | 保留后备清除作为最终兜底,但目标是不再触发 |
|
|
||||||
| `planner/seven.py` | `guarantee/plans.py::SEVEN` | 保留解析证明 |
|
|
||||||
| 4 个 benchmark 脚本 | `bench/` 统一 runner(并行 + manifest + 配对统计) | 合并,消除指标口径分叉 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. 优化项
|
|
||||||
|
|
||||||
### P0-1 第三问:发现—定位融合巡回(消除探点往返)
|
|
||||||
|
|
||||||
**现状**:每次收到 `direction` 后进入独立定位子循环,由信息增益选点器在同一站点之外
|
|
||||||
另选探点;13 源单局共 24 次探点、5741 m 往返、1148 s,与整个覆盖巡回(6960 m / 1392 s)同量级;
|
|
||||||
评测机单局 BBM9 更极端:**21 次探点花掉 1138.7 s 移动 = 全局限时时间的 36.3%**(F4b)。
|
|
||||||
评分函数 `score = E[log 幸存占比] + 0.0105 × 移动秒数`,移动项几乎不影响排名。
|
|
||||||
|
|
||||||
**方案**:把"已发现未定证"的频道加入**每一个覆盖站点**的批量扫频清单,
|
|
||||||
使第二/第三条方位线在巡回途中顺路取得;只有站点三角化不成立时才回退到专用探点。
|
|
||||||
|
|
||||||
- 巡回仍由 `plan/schedule.py` 滚动排序(现有最近邻 + 2-opt 已足够,`bayes` 的 −39.5% 移动
|
|
||||||
主要来自这里),新增"同点顺路测量"任务类型:`Task(kind="station", channels=(未知, 未定证))`。
|
|
||||||
- 站点任务的固有耗时按 `6 s × 频道数 + 1 s × 换频次数` 记账(现有 `_path_cost` 已支持)。
|
|
||||||
- 保底:`F11` 显示 0.72% 的源位置只有 1 个站在 1500 m 内,对这类频道保留
|
|
||||||
`_select_point` 的专用探点路径;判定用 `belief.prob_detect` 而非硬编码。
|
|
||||||
|
|
||||||
**预期收益(已被实测推翻)**:原估 F4 的 1148 s 探点移动可回收 70–80%,
|
|
||||||
即 −800 ~ −900 s。**实测结果相反**:仅追加站点方位线 +0.8%,追加并抑制专用探点
|
|
||||||
+45.6%(20/20 场景更慢),见 §0.4。原因是站间交会角不足以保证 20 m 证书,
|
|
||||||
专用信息增益探点仍然必要;抑制它只会白等巡回。**本项不采纳,默认关闭。**
|
|
||||||
|
|
||||||
**验收**:18 场景验证集平均 ≤ 2700 s、最大 ≤ 4000 s;`measures` 增幅 ≤ 20%;
|
|
||||||
`move_distance_m` 降幅 ≥ 25%;全部 `valid`。
|
|
||||||
|
|
||||||
**风险**:站点距离最远 2 × 1159.7 = 2319 m,可能出现 `no_signal` 浪费 5 s。
|
|
||||||
缓解:仅在 `prob_detect > 0` 时顺路测量;`no_signal` 同样是有效负观测(进信念,不算异常)。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### P0-2 第四问:用最小命中集替换 49 点发现集(离线搜索 + 运行期校验)
|
|
||||||
|
|
||||||
**现状**:`coverage_points()` 生成 700 m 方格 49 点(±2100),依据是"单元内任一点到 4 顶点
|
|
||||||
≤ 700√2 ≈ 989.95 ≤ 1000"。该条件是**充分但远非必要**:它要求单元内任意位置、任意朝向都由
|
|
||||||
**同一个**顶点命中。实际上,第四问的保证是"对 ∀(p,h) ∈ Ω×S¹,存在被访点位于其前向半盘内",
|
|
||||||
允许由**多个**顶点共同围住 p。
|
|
||||||
|
|
||||||
**方案**:把它当作一个显式的**击中集(hitting set)问题**离线求解,运行期校验:
|
|
||||||
|
|
||||||
1. 目标空间离散:`p` 取 Ω 内 75 m 网格,`h` 取 24 个方向 → 43 032 个 (p,h) 单元;
|
|
||||||
2. 候选点:半径 2850 m 圆盘内 200–300 m 网格(641/293 个候选);
|
|
||||||
3. 贪心集合覆盖 + 局部改进,**同时把巡回长度作为次级目标**(641/293 个候选中取 31/30 个,
|
|
||||||
仍有大量同覆盖度的等价解可用于缩短巡回);
|
|
||||||
4. 生成 `CoveragePlan(points, certificate)`,`certificate` 记录采样分辨率、未覆盖数、
|
|
||||||
最坏裕量、生成脚本哈希;`CoveragePlan.verify()` 在每次运行前用同一 `ObservationModel`
|
|
||||||
重新校核,未通过即拒绝启动。
|
|
||||||
|
|
||||||
**本次离线校核结果**(附录 A 可复现):
|
|
||||||
|
|
||||||
| 点集 | 点数 | (p,h) 覆盖 | NN 巡回 | 折算移动 |
|
|
||||||
| --- | ---: | ---: | ---: | ---: |
|
|
||||||
| 现役 700 m 方格 ±2100 | 49 | 100% | 36.4 km | 7280 s |
|
|
||||||
| 三角格 1000 m(半径 2800 盘) | 31 | 100% | 34.3 km | 6863 s |
|
|
||||||
| **贪心最小命中集(200 m 候选)** | **31** | **100%** | **22.9 km** | **4587 s** |
|
|
||||||
| **贪心最小命中集(300 m 候选)** | **30** | **100%** | **23.6 km** | **4719 s** |
|
|
||||||
|
|
||||||
**实测收益(2026-09-12,11 场景配对)**:均值 **14003.0 → 10975.5 s(−19.3%)**,
|
|
||||||
中位 −25.4%,10/11 场景更快;检测 444.5 → 319.2,请求 569.5 → 395.6,
|
|
||||||
位移 54.9 → 44.2 km,后备清除尝试 113.3 → 64.1,11/11 valid。
|
|
||||||
低于原估的 −26%,差额来自"缺席频道省下的检测"被定位探点部分抵消。
|
|
||||||
|
|
||||||
**验收**:`CoveragePlan.verify()` 通过;10/13/16 源 × 定向 1/半数/仅一个全向 × 边界朝外压力
|
|
||||||
场景全部全清;请求数、日志体积仍满足 1200 s / 2 MB 预算。
|
|
||||||
|
|
||||||
**风险**:数值采样证书弱于解析证明。缓解:(a) 保留解析七站证明用于 Q3;
|
|
||||||
(b) 证书采样分辨率与裕量写入 summary 并随日志归档;(c) 保留 10% 的额外"保险点"预算,
|
|
||||||
若演练观测到任何漏检立即回退到 49 点表。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### P0-3 第四问:位置×朝向联合信念与可见性选点
|
|
||||||
|
|
||||||
**现状**:定向源只被当作"候选空间集合",`no_signal` 只用于累计 `blocked_probes`
|
|
||||||
(`planner/__init__.py:663-677`),选点沿固定 45° 阶梯试探;梯子用尽后调用
|
|
||||||
`_fallback_clear`,对候选外包多边形做 20 m 网格覆盖逐格 `/clear`(≤400 格、≤1200 s、≤400 请求)。
|
|
||||||
运行历史显示这正是第四问的失败点:定向源 2/6 清除,4/4 漏检全是定向。
|
|
||||||
|
|
||||||
**方案**:为第四问频道维护 **(x, y, heading) 联合可行集**,把"看不看得见"变成可推理的量:
|
|
||||||
|
|
||||||
- 表示:`JointTensor` —— 复用 Q3 的占用网格,每格附加 24 个朝向 bin 的可行性位掩码
|
|
||||||
(uint8 位域,20 频道 × 6.1 万格 × 3 B ≈ 3.7 MB,可接受)。
|
|
||||||
- 更新规则(全部保守,仅删"必然看不见"的格):
|
|
||||||
- `direction`@s:位置删 `>1500`、角向删 `|gap| > δ_eff + 角裕量`;朝向删
|
|
||||||
"以该格为源、朝向不覆盖 s" 的半盘(保留 ±90° 含边界)。
|
|
||||||
- `no_signal`@s:对 `|g−s| ≤ 1000` 的格,朝向**只能**落在背向 s 的半盘;
|
|
||||||
对 `1000 < |g−s| ≤ 1500` 的格,朝向要么背向 s,要么源实际半径 < |g−s|(保持不确定);
|
|
||||||
对 `|g−s| > 1500` 的格不删。
|
|
||||||
- `near`@s:位置收缩到 5 m 盘,朝向置为全向(近场无遮挡语义)。
|
|
||||||
- 决策:`prob_detect(channel, reader)` = 该点能看到该频道任一可行 (p,h) 的概率质量;
|
|
||||||
选点直接最大化 `prob_detect / (移动秒数 + 6)`,即**保证有信号的信息增益/秒**。
|
|
||||||
- 定位收敛:位置由多条 `direction` 的角域交会收缩(与 Q3 相同);朝向在 2 次
|
|
||||||
"一次被遮挡 + 一次可见"后通常已被压到很窄的楔形,此时可**主动选择必然可见的探点**,
|
|
||||||
用一个正常角域证书结束,而不再进入 400 格盲清。
|
|
||||||
- 后备清除**保留**(`fallback_clear_cells` 已有格数与预算双硬顶),但目标变为
|
|
||||||
"只在证书无法建立时触发",并在 summary 中把触发次数作为回归指标。
|
|
||||||
|
|
||||||
**预期收益(未实测)**:定向频道的探点次数与后备清除触发次数大幅下降。参考量级:
|
|
||||||
后备清除上限 400 格 × 3 s = 1200 s + 400 请求/频道;`docs` 记录的 Q4 改进版每局后备
|
|
||||||
尝试 616/4 局 ≈ 154 次。保守估计 **−1500 ~ −3000 s/局**。
|
|
||||||
|
|
||||||
**验收**:10 源 3 定向场景全清率 100%(现状 referee 仅 2/6 定向);
|
|
||||||
`fallback_clear_attempts` 相对基线下降 ≥ 70%;定向信道平均检测次数 ≤ 全向信道的 1.5 倍。
|
|
||||||
|
|
||||||
**风险**:朝向均匀先验是工程假设,官方分布未知。缓解:先验只影响选点顺序,
|
|
||||||
不影响任何安全性判定;朝向不确定时自动退化为全向分支(`prob_detect` 取全向值)。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### P0-4 感知层向量化与并行(研发运行速度)
|
|
||||||
|
|
||||||
**现状**(F6):`expected_survival` 占单局 CPU 的 72%,2808 次调用 × (7 代表点 × 800 子采样)
|
|
||||||
≈ 1570 万次纯 Python 距离/角度运算;`apply_measure` 另有 20%,其中 `_kill_outside_wedge`
|
|
||||||
每次遍历全部幸存格(498 万次 `angular_gap`)。
|
|
||||||
|
|
||||||
**方案**:
|
|
||||||
|
|
||||||
1. `belief/occupancy.py` 用 `numpy` 布尔/整数张量替换 `set[int]`:
|
|
||||||
每频道 248×248 uint8(≈61 KB),20 频道 ≈ 1.2 MB;盘/楔删除用切片 + 布尔掩码,
|
|
||||||
粗格索引用 `np.add.reduceat`;`numpy` 缺失时回退现有纯 Python 实现(测试保证两条路径同结果)。
|
|
||||||
2. 采样评分向量化:把 `subsample` 与 `representatives` 预转 `(n,2)` 数组,
|
|
||||||
一次广播算完距离、角度、角向 gap,`expected_survival` 由 5600 次标量循环变成 2–3 条向量指令。
|
|
||||||
3. 站点级编译缓存:`(station, channel, version)` → 掩码结果,`version` 不变直接复用;
|
|
||||||
当前 `_skip_cache` 只缓存"必 no_signal"布尔,可扩展到整块删除掩码。
|
|
||||||
4. MEC 增量维护:当前 `mec()` 每次版本变化重算全部幸存点(最多 6 万点);改为
|
|
||||||
版本变化时只对新增删除点做包围圆增量更新,或按 1/8 子采样给出候选、证书判定用精确值。
|
|
||||||
5. 批量基准并行化:`bench/runner.py` 用 `concurrent.futures.ProcessPoolExecutor`
|
|
||||||
按场景分发(每进程独立 `LocalSimulator`,真值仍只进测试端),Mac M 系列 8 核可得 ~6–8×。
|
|
||||||
6. 观测/遥测:单局 summary 写入 `compute_wall_s`、`profile_top`(可选 `--profile`),
|
|
||||||
纳入基准表的必填列,防止"虚拟时间变快、墙钟悄悄变慢"。
|
|
||||||
|
|
||||||
**实测收益(2026-09-12)**:单局计算 **3.10 → 1.00 s(3.08×)**,最坏 5.84 → 1.30 s;
|
|
||||||
20 场景基准集 12.2 → 3.9 s。虚拟时间与动作序列**逐位一致**(纯 Python 回退路径保留,
|
|
||||||
`MCM26B_NO_NUMPY=1` 可强制)。未达 ≤0.8 s 的目标:剩余开销在
|
|
||||||
`apply_measure` 的网格删除与 `ChannelParticles.__init__`,需要 P0-4b(表示层张量化)。
|
|
||||||
|
|
||||||
**验收**:`tests/test_particles.py`、`tests/test_bayes_loop_q3.py` 全过;
|
|
||||||
纯 Python 与 numpy 两条路径在同一动作日志下产出逐位相同的 summary(`actions_sha256` 相同);
|
|
||||||
单局 `compute_wall_s` ≤ 0.8 s。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### P1-1 清除点选在 C₂₀(K) 内离当前位置最近处
|
|
||||||
|
|
||||||
现状 `_near_clear_target` 只沿"当前位置 → 候选圆心"方向平移,平移量受
|
|
||||||
`limit − radius` 限制,是被证明的一维特例。一般解是
|
|
||||||
`C₂₀(K) = ∩_{g∈K} B(g, 20)`,取其内离当前位置最近的点:
|
|
||||||
- 对凸多边形候选集,`C₂₀(K)` 仍是凸集(若干圆盘之交),可用"到当前点的最近点"的
|
|
||||||
简单迭代/投影求得;
|
|
||||||
- 若 `C₂₀(K)` 非空,则从该点清除的移动代价最小,且三角不等式保证仍在 20 m 内。
|
|
||||||
|
|
||||||
**预期收益**:Q3 单局清除移动 3668 m(734 s)中回收 20–35%(**−150 ~ −260 s**);
|
|
||||||
Q4 同步受益。
|
|
||||||
**风险**:`C₂₀` 空时退回现有 MEC 圆心逻辑(已实现)。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### P1-2 覆盖几何参数改为"离线搜索 + 运行期校验"
|
|
||||||
|
|
||||||
- Q3:`station_ring_radius_m` 由 1159.7 的可证明下界 1122.9 重算,并在 `validate_seven_coverage`
|
|
||||||
中同时校验 **PF 网格覆盖**(现行文档已记录 1159.7 与 Optuna 建议值差 3.3 m 的取舍)。
|
|
||||||
收益很小(≈44 s),但把"设计性质 vs 1.7% 均值差异"的取舍写成可复算脚本,而不是口口相传。
|
|
||||||
- Q4:见 P0-2,覆盖集与巡回联合优化(在等价覆盖解中选巡回最短者,
|
|
||||||
预期可在 23.6 km 基础上再降 5–10%)。
|
|
||||||
- 所有覆盖计划产物落 `output/<problem>/coverage/<version>.json` + 证书,纳入版本管理。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### P1-3 评估与遥测重构(消除 B6)
|
|
||||||
|
|
||||||
1. **冻结基准集**(`bench/suites/`,一题一份、版本化、写入 `manifest.json`):
|
|
||||||
- Q3:10/13/16 源 × 8 个种子 + 2 个圆周边界场景(`r_eff=1000`,扇区接缝);
|
|
||||||
- Q4:10 源 3 定向、13 源 6 定向、16 源 8 定向 × 每种 3 个种子 + 朝外边界压力场景;
|
|
||||||
- 场景与真值只进模拟器与校验器,策略端看不到(真值隔离不变量保持不变)。
|
|
||||||
2. **统一 runner + 逐局 artifact**:`manifest.json` / `results.json` / `aggregate.{json,csv}` /
|
|
||||||
`runs/<scene>/<variant>/summary.json` + `session.jsonl`,任何一局无效则 `all_valid=false` 且非零退出。
|
|
||||||
3. **指标口径去重**:目前 `avg_locate_clear_time_s ≡ virtual_time_s`(单源评估集下二者必然相等),
|
|
||||||
必须在多源基准集上重新定义并标注:
|
|
||||||
`T_total`(整场虚拟时间)、`T_accounted`(首次证明找全时刻)、`T_last_clear`、
|
|
||||||
`T_total / cleared`、`T_total / truth`。
|
|
||||||
4. **运行历史持久化**:`output/` 目前不纳入 git,导致 `output/rl/review-20260911/`、
|
|
||||||
`output/q3/optimization-20260911/` 等证据在 revert 后无法追溯。
|
|
||||||
本轮起把**基准集的 summary/aggregate/manifest(压缩,不含大日志)**纳入版本管理,
|
|
||||||
官方 jlog/日志仍按题面要求单独归档。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### P1-4 安全阀与退出可解释性
|
|
||||||
|
|
||||||
| 阀门 | 现状 | 改进 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| `persistent_search` | 默认已关闭,但没有任何"这会浪费多少"的提示;历史上已造成一次 346 170 s(98.84%)的无效演练 | 显式开启时输出预估上限(未清除频道数 × 站点数 × 6 s)并要求二次确认;`summary` 记录 `redundant_rescan_measures` |
|
|
||||||
| `virtual_reserve_s` | 10 000 s 固定 | 改为 `max(10 000, 2 × 最远单动作上界)`,并在接近时把 `stop_reason` 与剩余预算写入 summary |
|
|
||||||
| 完成判定 | `completed = 无中断 ∧ (清除数≥16 ∨ 每频道 CLEARED/ABSENT)` | 增加 `completion_basis ∈ {count_cap, per_channel_proof}` 字段,避免把"数量上界"与"逐频道证明"混为一谈 |
|
|
||||||
| 缺席证明 | 覆盖账本 + PF 双通道 | summary 增加 `absence_evidence[channel] ∈ {pf_empty, coverage, count_cap}`,供论文与审计逐条追溯 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### P2-1 选点评分的解析化/查表化
|
|
||||||
|
|
||||||
`expected_survival` 的物理含义可用解析近似替代:对给定测点 q 与候选集,
|
|
||||||
`E[log 幸存占比]` 的一阶近似只依赖 (候选集到 q 的距离分布, 角向展布)。
|
|
||||||
先在离线基准上验证解析近似与采样评分选出的点一致率 ≥ 90%,再切默认实现。
|
|
||||||
预计再省 30–50% 的评分开销(P0-4 之后已不是瓶颈,列入 P2)。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### P2-2 是否重启学习类方法的门控条件
|
|
||||||
|
|
||||||
只有在**下列四条同时满足**时才考虑把 ML 重新引入,且只允许替换"任务排序"这一个部件:
|
|
||||||
|
|
||||||
1. P0-1/P0-2/P0-3 全部落地并通过基准集验收;
|
|
||||||
2. 手写基线仍有 ≥ 10% 的可测改进空间,且已定位到具体的排序子问题;
|
|
||||||
3. 训练与部署共用同一控制器模块,并有逐状态一致性测试(旧 HRL 的 13 000 行里最有价值的
|
|
||||||
就是这条纪律:`HRLControllerMixin` 被 env 与 runtime 逐字节共用);
|
|
||||||
4. 评估集包含多源与定向场景(现役 20 场景单源评估集不足以支撑任何结论)。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. 实施路线图
|
|
||||||
|
|
||||||
| 阶段 | 内容 | 交付物 | 验收门槛 | 依赖 |
|
|
||||||
| --- | --- | --- | --- | --- |
|
|
||||||
| **S1(P0,2–3 天)** | P0-2 最小命中集 + P0-4 并行基准;P1-3 冻结基准集 + manifest;P1-4 安全阀 | `guarantee/cover.py`、`bench/runner.py`、`bench/suites/*`、`docs/` 更新 | Q4 巡回 ≤ 25 km;基准集并行跑完 ≤ 60 s;全部 `valid` | 无 |
|
|
||||||
| **S2(P0,2–3 天)** | P0-1 融合巡回(Q3);P1-1 清除点 | `plan/schedule.py`、`plan/score.py`、`Episode` 组合化重构 | Q3 均值 ≤ 2700 s、最大 ≤ 4000 s;移动 −25% | S1 的 runner |
|
|
||||||
| **S3(P0/P1,3–5 天)** | P0-4 信念层 numpy 化;P0-3 联合信念 + 可见性选点(Q4) | `belief/occupancy.py`、`belief/joint.py`、`plan/policy.py` | 单局计算 ≤ 0.8 s;Q4 定向全清 100%、后备触发 −70% | S2 的接口 |
|
|
||||||
| **S4(P1/P2,2–3 天)** | P1-2 覆盖参数搜索固化;P2-1 评分解析化;论文数据表 | 覆盖计划证书、`docs/paper` 数据 | 与 S3 结果配对不退化 | S3 |
|
|
||||||
| **S5(演练)** | 官方演练:Q3 用全向、Q4 用混合;先实测单请求延迟与总请求数,核对 1200 s / 2 MB | 官方日志与报告 | 全清 + 正常退出 + 计时复算一致 | 团队排期 |
|
|
||||||
|
|
||||||
**顺序约束**:S1 的基准集必须先于任何算法改动落地,否则无法配对;否则"更快"不可证。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. 验收与度量
|
|
||||||
|
|
||||||
### 5.1 有效局定义(沿用现有基准脚本,不得放宽)
|
|
||||||
|
|
||||||
```
|
|
||||||
valid := 全部真实源被清除
|
|
||||||
∧ 被判缺席的频道都与真值一致(无误判)
|
|
||||||
∧ 正常 /exit(exit_reason == user_exit)
|
|
||||||
∧ 零算法异常(anomalies == [])
|
|
||||||
∧ 逐动作虚拟时间复算与服务器返回逐微秒一致
|
|
||||||
```
|
|
||||||
|
|
||||||
### 5.2 必报指标(每个变体、每个场景,落盘 + 汇总)
|
|
||||||
|
|
||||||
- 虚拟时间:`T_total`、`T_accounted`、`T_last_clear`、`T_total/cleared`,以及
|
|
||||||
均值/中位/最大/P90 与 **< 4000 s 场次比例**;
|
|
||||||
- 动作:`measures`、`clears`、`failed_clears`、`fallback_clear_attempts`、
|
|
||||||
`redundant_rescan_measures`、`total_requests`;
|
|
||||||
- 移动:`move_distance_m`,以及 move/action/switch 三分项占比;
|
|
||||||
- 墙钟:`compute_wall_s`、请求吞吐(ms/请求)、批量基准总时长、训练 steps/s(若涉及);
|
|
||||||
- 配对比较:同场景同误差种子下 `1 − T_variant / T_baseline` 的均值、
|
|
||||||
更快场数、以及对场景做 10 000 次 bootstrap 的 95% 区间(参照 `summarize_rl_revision.py` 的做法)。
|
|
||||||
|
|
||||||
### 5.3 回归
|
|
||||||
|
|
||||||
`uv run pytest`(当前 232 项)必须全过;新增:
|
|
||||||
- `CoveragePlan.verify()` 的正/负例(故意删一个点必须被检出);
|
|
||||||
- 联合信念的真源保留性质测试(随机 (p,h) × 随机观测序列,真源 (p,h) 永不被删);
|
|
||||||
- 融合巡回的"每源至少一条站点方位线"性质测试;
|
|
||||||
- 逐位一致性测试:numpy 后端与纯 Python 后端在同一动作序列下 summary 完全相同。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. 风险与明确不承诺的部分
|
|
||||||
|
|
||||||
### 6.1 风险登记
|
|
||||||
|
|
||||||
| 风险 | 影响 | 缓解 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| 最小命中集证书依赖数值采样,官方分布未知 | 极端 (p,h) 漏检 → 漏源 | 保留解析七站证明(Q3);Q4 证书采样分辨率/裕量写入 summary;保留 10% 保险点预算与 49 点回退开关 |
|
|
||||||
| 站点三角化在 0.72% 源位置上只有 1 站在射程内 | 这些场景仍需专用探点 | `prob_detect` 触发回退路径,保留现有 `_select_point` |
|
|
||||||
| 朝向先验为工程假设 | 选点次优 | 先验只影响顺序;不确定时退化为全向;安全性由 20 m 证书 + 覆盖证明负责 |
|
|
||||||
| numpy 化引入浮点路径差异 | 真源保留性质被破坏 | 两条后端同时保留并对拍;保持整数微秒复算计时 |
|
|
||||||
| 并行基准引入进程/端口/临时目录问题 | 基准不稳定 | 每进程独立内存回环;不共用端口;`manifest` 记录随机种子 |
|
|
||||||
|
|
||||||
### 6.2 不承诺的部分
|
|
||||||
|
|
||||||
- **第四问 4000 s**:10 源场景下,仅"发现 + 缺席证明"就约需
|
|
||||||
最小命中集巡回 4719 s + 缺席检测 ≈1900 s ≈ 6600 s,加之定位清除,4000 s 不可达。
|
|
||||||
若必须逼近该线,需要改变停止条件(例如接受 `unresolved_channels` 而非逐频道缺席证明),
|
|
||||||
那是**成绩口径的取舍**,必须先与题面评分方式核对,本轮不作为代码默认行为。
|
|
||||||
- 本文所有收益数字都是**自建模拟器上的估计或本次复跑观测**,不是官方成绩;
|
|
||||||
官方分布、r_eff 分布、误差场分布仍是测试假设。
|
|
||||||
- 不声称 P0-1/P0-3 已在官方演练验证——需新的演练记录。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 附录 A 复现命令与本次新增实验
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1) 基线配对(本次复跑:bayes 3707.3 s vs seven_batch 5581.8 s,局部 −32.1%)
|
|
||||||
uv run python scripts/benchmark_q3_bayes.py --seeds 0,1 --out /tmp/mcmopt/q3
|
|
||||||
|
|
||||||
# 2) 运行历史计时分解(已入库):任意会话日志 → 移动/检测/换频分相 + 重复复扫检测
|
|
||||||
uv run python scripts/analyze_run_timing.py session.jsonl --plan seven
|
|
||||||
uv run python scripts/analyze_run_timing.py referee-data/sessions/BBM9-HZG2-77N5-NKKC/log.jsonl --plan seven
|
|
||||||
uv run python scripts/analyze_run_timing.py referee-data/sessions/6X58-XQ7U-CJ24-JQQR/log.jsonl --plan 49
|
|
||||||
# 实测输出(与服务器记录最大偏差 0.000000 s,证明复算口径正确):
|
|
||||||
# session.jsonl 350227.692 s,移动 82.3%,检测 10323 次,重复率 96.4,
|
|
||||||
# 末次清除后仍花 346169.9 s / 10225 次空复扫
|
|
||||||
# BBM9 (Q3) 3134.643 s,移动 75.9%,探点 21 次 / 1138.7 s
|
|
||||||
# 6X58 (Q4) 3251.021 s,移动 78.3%,检测 112 次
|
|
||||||
|
|
||||||
# 3) 第四问覆盖证书与最小命中集(已入库)
|
|
||||||
uv run python scripts/verify_q4_cover.py --out output/q4/cover-certificate.json
|
|
||||||
# 实测输出:目标空间 43032 个 (p,h)
|
|
||||||
# 现役 49 点方格:缺口 0,NN 巡回 36.4 km(7280 s 移动)
|
|
||||||
# 贪心最小命中集:31 点,缺口 0,NN 巡回 22.9 km(4587 s 移动)
|
|
||||||
|
|
||||||
# 4) 感知层剖面(单局 6.04 s 计算中 expected_survival 占 ~72%)
|
|
||||||
python -m cProfile -s cumulative <单局驱动脚本>
|
|
||||||
```
|
|
||||||
|
|
||||||
> 第 2、3 项已作为常驻工具入库,使"虚拟时间花在哪"与"覆盖集是否仍然合法"
|
|
||||||
> 成为可随时重跑的回归项;第 1、4 项仍是一次性分析,建议在 S1 阶段并入
|
|
||||||
> `bench/runner.py` 的必报指标(`compute_wall_s`、`profile_top`)。
|
|
||||||
|
|
||||||
## 附录 B 数字出处索引
|
|
||||||
|
|
||||||
| 数字 | 出处 |
|
|
||||||
| --- | --- |
|
|
||||||
| 移动 80.50% / 16.78% / 2.71%(Q3) | `referee-data/sessions/{BBM9,RM7Y,VQKB}/log.jsonl` 按 `verify_q3_practice.py` 模型复算 |
|
|
||||||
| 移动 82.30%(官方 J2WH) | `session.jsonl` 求和 |
|
|
||||||
| 346 169.9 s 空复扫 | `session.jsonl` `/exit` 时刻 350 227.691846 s 减去 12 源首轮清除的 4 057.839 s |
|
|
||||||
| Q4 定向 2/6、漏检 4/4 全为定向 | `referee-data/sessions/{6X58,BAU8}/meta.json` + `log.jsonl` |
|
|
||||||
| bayes 3707.3 / seven 5581.8 | 本次复跑 `benchmark_q3_bayes.py --seeds 0,1` |
|
|
||||||
| 3535.9 s / 109 检测 / 6960 m 巡回 / 5741 m 探点 | 本次复跑计时分解 |
|
|
||||||
| 13652.1 s / 560 检测 / 51 356 m(Q4) | 本次复跑单局 |
|
|
||||||
| `expected_survival` 72% | 本次 `cProfile` 单局 |
|
|
||||||
| HRL 27.0 steps/s、4007.9 s、109 776 步 | `output/hrl/ui/q3-main/q3.json` + `*.monitor.csv` |
|
|
||||||
| bayes 比 HRL 快 4.3–5.0%、94% 差距为移动 | `output/hrl/ui/q3-main/eval/at-final/aggregate.json` + `runs/*/summary.json` |
|
|
||||||
| 站点三角化 99.28%、交会角 5 分位 58.5° | 本次离线采样 20 000 点 |
|
|
||||||
| 49 点 vs 30 点覆盖集 | 本次贪心击中集计算(附录 A 第 5 项) |
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
# 第三、四问算法审核与优化
|
|
||||||
|
|
||||||
依据:原始 `issue/B题.pdf` 第1—3页,重点为附录2(3)(4),并结合(1)(2)(5)(6)(8)与第三、四问要求。
|
|
||||||
审核起点为 `9cf9428` 的程序;最后一次官方第三问演练为 `3BW5-9R54-NZNA-MYB9`,
|
|
||||||
13/13源成功清除、虚拟总时间4058.709750秒。本轮改进验证使用本地模拟器,没有启动或消耗官方测试。
|
|
||||||
|
|
||||||
## 1. 题设约束及审查结论
|
|
||||||
|
|
||||||
附录2(3)中的交会是有宽度的角域交集。不能把两条示向线的交点当作精确真值,
|
|
||||||
也不能利用同地重测求平均缩小±1°误差。程序已保留完整角域及0.005°舍入裕量,
|
|
||||||
本轮继续使用该证据颁发清除证书。统计评分仅用于选点,不能替代保守几何证书。
|
|
||||||
|
|
||||||
附录2(4)要求逐频道检测,换频1秒;结合(5),每次停靠检测5秒且不能在移动中检测。
|
|
||||||
已有HTTP客户端是串行的,没有把20频道视为一次免费测量。缺陷在于规划成本和站点利用:
|
|
||||||
|
|
||||||
| 审核发现 | 影响 | 当前改进 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| 已停靠点只测UNKNOWN频道,已发现频道容易错失交会机会 | 之后为第二条方位线另走一段路 | 对DETECTED频道预测收缩;当前位置到整个候选集均小于1000m、未在此处测过且预测半径减少35%时,逐频道补测;每次仍支付5秒和实际换频成本 |
|
|
||||||
| 定位选点只计到测点的移动 | 测完后到清除区域的路程没有进入选点目标 | 加入候选检测点→候选源中心的接近代价,保留后续根据真实响应重新规划 |
|
|
||||||
| 候选方向固定在全局角度网格 | 与当前交会几何不对齐,可能产生多余绕行 | 增加以当前位置到候选中心为轴的对称候选;均仍位于距离保证盘内 |
|
|
||||||
| 路线代价中的service_s按初始频道一次估计 | 2-opt比较不同顺序时没有正确传递频道状态 | 路径成本逐任务传递频道,站内当前频道优先,clear保持频道;两个任务也比较完整开放路径成本 |
|
|
||||||
| 清除默认走到候选集包围圆心 | 未利用20米光学定位/清除范围 | 在证书允许范围内向当前位置平移目标;平移距离+原包围半径不超过阈值,保留三角不等式证明 |
|
|
||||||
| 七站环半径可调但没有执行覆盖校验 | 不合法调参可能把“都没测到”误作不存在 | 构造时检查解析覆盖界;不满足条件直接拒绝运行 |
|
|
||||||
| 第四问盘外探点无信号也可能记为定向遮挡 | 把接收距离不足误诊为已确认定向 | 仅当实际探点位于距离保证盘内才据无信号确认定向;盘外无信号保留不确定性 |
|
|
||||||
| 第四问发现一个源就离站定位,后续频道再返回原站 | 同站频道间产生长距离往返 | 保留49站定向覆盖,先逐频道扫完本站,再按当前位置就近处理已发现源 |
|
|
||||||
| 后备清除按初始位置距离静态排序 | 狭长候选集可能反复折返,且循环内无虚拟预算检查 | 每一步从当前位置选最近未处理格,并逐次检查虚拟预算 |
|
|
||||||
|
|
||||||
第三问所有源均为全向,才能用no_signal排除1000米圆盘。第四问源类型与朝向未知,
|
|
||||||
no_signal还可能是半平面遮挡,不能用上述排除规则,也不能直接沿用七站缺席证明。
|
|
||||||
本轮没有把BayesLoop套到第四问;第四问继续采用49站覆盖和独立的定向定位/后备清除。
|
|
||||||
回归用例包含(1800,0)向外发射的源:七站全无信号,49站中有站可检出。
|
|
||||||
|
|
||||||
七站覆盖界为 `max(r/√3, sqrt(R²+r²−√3Rr))`,前提是`0<r≤√3R`。
|
|
||||||
当前R=1800m、r=1159.7m,通过小于1000m的校验。网格滤波额外带Voronoi裕量,
|
|
||||||
故无源时仍可能留下边界格;此时完整七站覆盖可以证明缺席,不要求PF一定为空。
|
|
||||||
|
|
||||||
## 2. 验收口径
|
|
||||||
|
|
||||||
4000秒目标按整场虚拟总时间(包含移动、换频、全部检测、清除和缺席确认)比较,
|
|
||||||
没有在4000秒强行停止,也没有以只清除部分源或最后一次成功清除的时刻代替总时间。
|
|
||||||
题面表格的平均定位清除时间仍等于总时间除以实际清除源数。
|
|
||||||
|
|
||||||
第三问优化开发集固定为种子0—5、10/16源,加两个最小接收半径的圆周边界场景(14场)。
|
|
||||||
选择实现后停止调整,再运行种子100—105、10/13/16源的独立验证集(18场)。
|
|
||||||
同场景前后使用相同位置、频道、有效半径和逐点固定误差种子。
|
|
||||||
真值只传给本地模拟器和执行后的校验,不提供给算法;全部请求和响应保存。
|
|
||||||
|
|
||||||
有效运行要求:全部真实源清除、没有误判真实频道缺席、正常exit、无算法异常、逐步耗时复算一致。
|
|
||||||
|
|
||||||
| 第三问指标 | 旧版 | 改进后 |
|
|
||||||
| --- | ---: | ---: |
|
|
||||||
| 开发集全清且有效 | 14/14 | 14/14 |
|
|
||||||
| 开发集平均总时间 | 3812.97s | 3390.88s |
|
|
||||||
| 开发集最大总时间 | 5535.13s | 4624.97s |
|
|
||||||
| 开发集中小于4000s | 10/14 | 12/14 |
|
|
||||||
| 独立验证集全清且有效 | 18/18 | 18/18 |
|
|
||||||
| 独立验证集平均总时间 | 3799.72s | **3315.89s(减少12.73%)** |
|
|
||||||
| 独立验证集最大总时间 | 4569.47s | **3981.74s** |
|
|
||||||
| 独立验证集中小于4000s | 12/18 | **18/18** |
|
|
||||||
|
|
||||||
两个人工圆周边界场景改进后仍为4145.19s、4624.97s左右。因此本轮实现达成的是
|
|
||||||
独立验证组每场小于4000秒,**不是对全部合法题目场景的最坏时间保证**。
|
|
||||||
旧官方案例已经结束,无法对新路线查询其未知响应;本地结果不冒充官方同案例重跑。
|
|
||||||
更新后的官方成绩仍需新演练验证,不能由前后不同案例的数字直接得出提升比例。
|
|
||||||
|
|
||||||
## 3. 第四问结果
|
|
||||||
|
|
||||||
固定四场:10源/3定向,种子0、1;16源/8定向,种子2、3。覆盖朝向未知场景,
|
|
||||||
每场源分布与误差种子前后相同。旧版、改进版均4/4全清、正常退出、零异常和零计时偏差。
|
|
||||||
|
|
||||||
| 场景 | 旧版总时间 | 改进后总时间 |
|
|
||||||
| --- | ---: | ---: |
|
|
||||||
| 10源,种子0 | 18599.317s | 13652.140s |
|
|
||||||
| 10源,种子1 | 16709.225s | 14918.134s |
|
|
||||||
| 16源,种子2 | 16388.604s | 11635.398s |
|
|
||||||
| 16源,种子3 | 16983.270s | 12453.274s |
|
|
||||||
| 平均 | 17170.104s | **13164.737s(减少23.33%)** |
|
|
||||||
|
|
||||||
第四问尚未降到4000秒。保留域外49站是为未知朝向源提供发现证据;本轮优化减少重复移动,
|
|
||||||
没有用第三问假设缩小第四问覆盖范围。其后备清除仍是有预算上限的算法,不能据四场结果声称所有混合场景必定在预算内完成。
|
|
||||||
|
|
||||||
## 4. 数据及复现
|
|
||||||
|
|
||||||
- 第三问数据根目录:`output/q3/optimization-20260911/`,含冻结旧版代码、配置、逐场景真值、动作日志、summary及汇总。
|
|
||||||
- 最终开发集:`development/improved/results.json`;独立验证:`validation/verified/results.json`;对应旧版在各自`baseline/results.json`。
|
|
||||||
- 第四问:`output/q4/optimization-20260911/{baseline,improved}-{10,16}.json`。
|
|
||||||
- 中间开发试验也保留:同点补测、移动前瞻、路线终点、来向候选、路径计费及自适应发现。最终未采用均值变差的路线终点估计和未知频道自适应补扫。
|
|
||||||
- 回归测试:`pytest -q`,**166项全部通过**。新增用例验证串行6秒补测、不重复同地读数、频道状态成本、清除圆平移证书、无信号诊断及七站/49站的适用边界。
|
|
||||||
|
|
||||||
在项目根目录运行(label使用未存在的名称以保护已有证据):
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
.venv/Scripts/python.exe scripts/benchmark_q3_revision.py --label rerun-development
|
|
||||||
.venv/Scripts/python.exe scripts/benchmark_q3_revision.py --label rerun-validation --suite validation
|
|
||||||
.venv/Scripts/python.exe scripts/benchmark_q3_revision.py --label rerun-baseline --suite validation --baseline
|
|
||||||
.venv/Scripts/python.exe scripts/benchmark_q4.py --seeds 0,1 --sources 10 --directional 3 --out output/q4/rerun-10.json
|
|
||||||
.venv/Scripts/python.exe scripts/benchmark_q4.py --seeds 2,3 --sources 16 --directional 8 --out output/q4/rerun-16.json
|
|
||||||
```
|
|
||||||
|
|
||||||
概率限制:网格幸存集是保守可行集,不是已知官方概率模型的精确贝叶斯后验。
|
|
||||||
均匀源分布、接收半径分布、代表读数和哈希误差均属测试或启发式假设。
|
|
||||||
完备覆盖与清除证书依赖题面给出的确定性边界,性能数字则依赖具体测试分布。
|
|
||||||
@@ -1,249 +0,0 @@
|
|||||||
# B题问题一 交会定位区域的直径与圆覆盖
|
|
||||||
|
|
||||||
问题一可以转化为二维半平面交问题:每次带误差的示向度给出一个前向角域,多次测量的交集就是定位区域。对于非空有界定位多边形,直径等于最远顶点对的距离。**以这个直径为直径的圆不一定覆盖定位区域。**判断是否能覆盖,应检验最远顶点对中点到所有顶点的距离,或直接计算最小包围圆。
|
|
||||||
|
|
||||||
代码、合成算例与官方演练观测均已实现和保存。本解答只解决问题一;在官方问题3演练中采集同一频道的三个检测点,用于检验交会计算,没有执行全域搜索清除任务,未使用正式测试。
|
|
||||||
|
|
||||||
## 一、题目假设和模型边界
|
|
||||||
|
|
||||||
检测点为 $S_i=(s_{ix},s_{iy})$,测得示向度为 $\theta_i$,误差半角为 $\delta=1^\circ$。角度从正东开始逆时针计算。同一频道对应同一干扰源;位置不变时重复检测不会消除误差。
|
|
||||||
|
|
||||||
本问求附录2交会法所定义的多边形,因此主模型只取前向角域之交,不额外加入1800米圆域或1500米接收上界。这些先验可用于后续搜索定位,但加入圆盘后边界可能包含圆弧,不能仍按原问题的纯多边形处理。本程序也不以图像视窗作为真实边界。
|
|
||||||
|
|
||||||
模拟器示向度保留两位小数,正文规定误差在 $\pm 1^\circ$ 内。本次主计算使用 $\pm 1^\circ$;如需把独立舍入误差也纳入保守预算,可用 `--rounding-margin-deg 0.005` 显式追加半角,输出会记录实际误差半角。这是额外的工程裕量,不是题面规定。
|
|
||||||
|
|
||||||
## 二、从测向角域得到线性约束
|
|
||||||
|
|
||||||
设二维叉积 $[a,b]=a_xb_y-a_yb_x$,令
|
|
||||||
|
|
||||||
$$
|
|
||||||
u_i^-=(\cos(\theta_i-\delta),\sin(\theta_i-\delta)),\qquad
|
|
||||||
u_i^+=(\cos(\theta_i+\delta),\sin(\theta_i+\delta)).
|
|
||||||
$$
|
|
||||||
|
|
||||||
未知源位置 $X=(x,y)$ 必须满足
|
|
||||||
|
|
||||||
$$
|
|
||||||
[u_i^-,X-S_i]\ge0,\qquad [u_i^+,X-S_i]\le0.
|
|
||||||
$$
|
|
||||||
|
|
||||||
这两条不等式选择两条边界射线之间的前向角域,而不是无限延伸的两条直线。写为标准形式 $a_jx+b_jy\le c_j$:
|
|
||||||
|
|
||||||
$$
|
|
||||||
\begin{aligned}
|
|
||||||
\sin(\theta_i-\delta)x-\cos(\theta_i-\delta)y
|
|
||||||
&\le \sin(\theta_i-\delta)s_{ix}-\cos(\theta_i-\delta)s_{iy},\\
|
|
||||||
-\sin(\theta_i+\delta)x+\cos(\theta_i+\delta)y
|
|
||||||
&\le-\sin(\theta_i+\delta)s_{ix}+\cos(\theta_i+\delta)s_{iy}.
|
|
||||||
\end{aligned}
|
|
||||||
$$
|
|
||||||
|
|
||||||
程序另外保留 $u_i\cdot(X-S_i)\ge 0$ 的前向约束。当 $0<\delta<90^\circ$ 时它是冗余的,但可让 $\delta=0$ 的扩展情形正确表示射线,而不是整条直线。实现支持 $0\le\delta<90^\circ$,题目算例始终使用 $1^\circ$。
|
|
||||||
|
|
||||||
定位区域为
|
|
||||||
|
|
||||||
$$
|
|
||||||
P=\bigcap_{i=1}^{n}W_i=\{X:AX\le b\}.
|
|
||||||
$$
|
|
||||||
|
|
||||||
通过向量而不是简单的角度大小比较处理约束,可自然处理 $359^\circ$ 与 $0^\circ$ 跨界问题。
|
|
||||||
|
|
||||||
## 三、可复现的算法
|
|
||||||
|
|
||||||
1. 验证输入为有限数值,将检测点平移至其均值附近并按尺度归一化,减小大坐标带来的抵消误差。
|
|
||||||
2. 构造所有半平面;枚举每对不平行边界直线的交点。
|
|
||||||
3. 只保留满足全部不等式的交点;去重后用单调链算法求凸包,并保留点、线段等退化结果。
|
|
||||||
4. 判断有无非零方向 $d$ 满足 $Ad\le 0$。若存在,任一可行点沿该方向无限前进仍可行,区域无界,直径为无穷大。
|
|
||||||
5. 对有界非空区域,枚举凸包顶点对,得到直径及一对最远顶点。
|
|
||||||
6. 用任意一组最远顶点对中点与半径 $D/2$ 检验圆覆盖;失败时返回圆外顶点及最大超出距离。用 Welzl 随机增量法求最小包围圆,输出 20 米清除半径余量,以区分“直径圆覆盖”和“保证清除”。
|
|
||||||
|
|
||||||
非空前向角域的交集不会包含一条双向无限直线,即它是尖的多面集。这保证非空区域存在极点,所以在本模型中可以通过是否存在可行边界交点来判空。无观测时需单独返回整个平面无界,不能依据“没有顶点”误判为空集。
|
|
||||||
|
|
||||||
二维非平凡衰退锥若存在,至少有一条边界方向与某个约束边界平行。因此检查每条边界的两个切向方向是否满足 $Ad\le 0$,即可判定无界性。无界情形中输出的有限顶点仅是区域的极点,不构成完整有限多边形。
|
|
||||||
|
|
||||||
伪代码如下:
|
|
||||||
|
|
||||||
```text
|
|
||||||
输入同一频道的测量列表 M
|
|
||||||
若 M 为空:返回无界
|
|
||||||
H ← 将每次测量转换为前向角域的半平面约束
|
|
||||||
V ← 所有边界对交点中满足 H 的点
|
|
||||||
若 V 为空:返回空集
|
|
||||||
若存在非零 d 满足 H 的齐次约束 A d <= 0:返回无界
|
|
||||||
V ← 去重并排序为凸包
|
|
||||||
(D, A, B) ← V 中的最远顶点对
|
|
||||||
O ← (A+B)/2
|
|
||||||
覆盖成立 <- max_{v in V} ||v-O|| <= D/2
|
|
||||||
返回 V、D、A、B、O、覆盖判断和最小包围圆
|
|
||||||
```
|
|
||||||
|
|
||||||
设半平面数为 $k$(本实现中 $k=3n$),最终顶点数为 $m$。枚举交点并检验全部约束需要 $O(k^3)$,直径计算需要 $O(m^2)$,无界性检查需要 $O(k^2)$。可行交点排序的代价上界为 $O(k^2\log k)$,临时交点存储上界为 $O(k^2)$。新增直径圆证据只需 $O(m)$ 遍历。
|
|
||||||
|
|
||||||
最小包围圆改为 Welzl 随机增量算法:先打乱点顺序;已有圆包含新点则保留,否则强制新点成为边界点并解更小子问题;二维最多需要 3 个支撑点。3 个强制边界点必须用外接圆,不能误用这 3 点的无约束最小圆。实现以显式栈代替递归,防止大量点超过 Python 递归深度。固定随机种子使输出可复现,理论期望线性指随机排列下的期望,不是该固定种子的最坏复杂度保证。对外函数内部也做坐标归一化,最后重新计算所有点到输出圆心的最大距离,保持数值包含性。旧 $O(m^4)$ 支撑点枚举保留为独立测试基准。
|
|
||||||
|
|
||||||
半平面交与直径仍采用容易审查的小规模算法,未为少量测点引入更复杂的旋转卡壳。大规模在线数据可后续替换半平面交,不能把MEC局部提速等同于整个求解器线性复杂度。
|
|
||||||
|
|
||||||
## 四、为什么只枚举顶点对就能得到直径
|
|
||||||
|
|
||||||
有界凸多边形内任意两点可表示为顶点的凸组合:
|
|
||||||
|
|
||||||
$$
|
|
||||||
x=\sum_i\lambda_i v_i,\quad y=\sum_j\mu_jv_j,\quad
|
|
||||||
\lambda_i,\mu_j\ge0,\quad\sum_i\lambda_i=\sum_j\mu_j=1.
|
|
||||||
$$
|
|
||||||
|
|
||||||
由三角不等式,
|
|
||||||
|
|
||||||
$$
|
|
||||||
\lVert x-y\rVert=\left\lVert\sum_{i,j}\lambda_i\mu_j(v_i-v_j)\right\rVert
|
|
||||||
\le\sum_{i,j}\lambda_i\mu_j\lVert v_i-v_j\rVert
|
|
||||||
\le\max_{i,j}\lVert v_i-v_j\rVert.
|
|
||||||
$$
|
|
||||||
|
|
||||||
最远顶点对本身又属于区域,因此上界可以达到:
|
|
||||||
|
|
||||||
$$
|
|
||||||
\boxed{D(P)=\max_{i,j}\lVert v_i-v_j\rVert.}
|
|
||||||
$$
|
|
||||||
|
|
||||||
点的直径为0,线段的直径为端点距离。对空集,本程序约定直径未定义,输出null;对无界区域,输出 `diameter_infinite=true`,不把Infinity写入不兼容标准的JSON数值。
|
|
||||||
|
|
||||||
## 五、直径圆能否覆盖的充分必要条件
|
|
||||||
|
|
||||||
取任意最远顶点对 $A,B$,距离为 $D$,令 $O=(A+B)/2$。如果半径为 $D/2$ 的某个圆能够同时包含 $A$ 和 $B$,则
|
|
||||||
|
|
||||||
$$
|
|
||||||
D=\lVert A-B\rVert\le\lVert A-O'\rVert+\lVert O'-B\rVert\le D.
|
|
||||||
$$
|
|
||||||
|
|
||||||
两个不等式只能同时取等号,因此其圆心只能是O。又因为圆盘是凸集,包含全部顶点等价于包含整个多边形。所以
|
|
||||||
|
|
||||||
$$
|
|
||||||
\boxed{\text{存在直径为 }D\text{ 的覆盖圆}\iff
|
|
||||||
\max_{v\in V}\lVert v-(A+B)/2\rVert\le D/2.}
|
|
||||||
$$
|
|
||||||
|
|
||||||
不必尝试移动直径圆,也不必尝试其他最远点对:若这个唯一可能的圆心不满足覆盖,就不存在直径为 $D$ 的覆盖圆。最小包围圆半径 $\rho$ 满足 $\rho\ge D/2$,当且仅当 $\rho=D/2$ 时存在这样的覆盖圆。
|
|
||||||
|
|
||||||
代码的 `diameter_circle.max_excess_m` 为 $\max_{v\in V}\lVert v-O\rVert-D/2$;超出数值容差时返回 `witness_vertex` 和从 0 开始的 `outside_vertex_indices`。因此输出既有判断,也有可独立复核的反例。判定中使用 `coverage_tolerance_m`,边界附近的布尔结果属于浮点容差下结论。
|
|
||||||
|
|
||||||
保证清除使用 MEC 半径加数值余量 $\varepsilon_m$,再与 20 米比较。`clearance_certificate.remaining_margin_m` 对应 $20-(\rho+\varepsilon_m)$;非负时支持当前圆心清除,负数时不作此保证。这里的证书以观测误差界正确、真源属于 $P$ 和浮点几何计算可靠为前提,不是实际清除成功记录。数学上所有可行清除中心构成 $\bigcap_{v\in V}B(v,20)$,MEC 圆心是充分选择;后续可在此集合中另选距离机器狗最近的点。
|
|
||||||
|
|
||||||
## 六、满足题设 $\pm 1^\circ$ 的具体反例
|
|
||||||
|
|
||||||
取三个检测点及示向度:
|
|
||||||
|
|
||||||
| 检测点 | x(米) | y(米) | 示向度 |
|
|
||||||
| --- | ---: | ---: | ---: |
|
|
||||||
| $S_1$ | $-1000$ | $0$ | $1^\circ$ |
|
|
||||||
| $S_2$ | $540$ | $-500\sqrt{3}$ | $121^\circ$ |
|
|
||||||
| $S_3$ | $520$ | $520\sqrt{3}$ | $241^\circ$ |
|
|
||||||
|
|
||||||
三个角域的交集恰为等边三角形,顶点是 $(0,0)$、$(40,0)$、$(20,20\sqrt{3})$。每个角域的一条边界对应三角形的一条边,另一条边界在三角形外侧,不切去三角形内部。可将真实源设在三角形中心 $(20,20\sqrt{3}/3)$,其真实方位与上述读数的偏差均小于 $1^\circ$,且三个检测距离都小于 1500 米。因此这不是脱离测向模型的任意图形反例。
|
|
||||||
|
|
||||||
它的直径为 $D=40$ 米;直径圆半径为 20 米。以底边两端为最远点对,圆心为 $(20,0)$,到第三个顶点的距离是 $20\sqrt{3}\approx 34.6410$ 米,因此不能覆盖。其最小包围圆为
|
|
||||||
|
|
||||||
$$
|
|
||||||
O_*=(20,20\sqrt{3}/3),\qquad \rho_*=40/\sqrt{3}\approx 23.0940\,\text{米}>20\,\text{米}.
|
|
||||||
$$
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
图中蓝色为定位区域,红色虚线为直径圆,绿色实线为最小包围圆。黑色加号只在合成场景中表示已知真源。
|
|
||||||
|
|
||||||
## 七、官方演练数据验证
|
|
||||||
|
|
||||||
2026年9月10日,界面明确为“问题3 演练 测试”后,通过公开HTTP接口采集。案例编码为 `U5ZW-P9KN-TCAG-R7ST`,选取频道9。
|
|
||||||
|
|
||||||
| 检测点 | x(米) | y(米) | 示向度 |
|
|
||||||
| --- | ---: | ---: | ---: |
|
|
||||||
| $S_1$ | $0$ | $0$ | $131.52^\circ$ |
|
|
||||||
| $S_2$ | $-613.761885$ | $391.530775$ | $34.92^\circ$ |
|
|
||||||
| $S_3$ | $-314.272134$ | $656.683353$ | $227.19^\circ$ |
|
|
||||||
|
|
||||||
重复在 $S_1$ 测量一次仍返回 $131.52^\circ$。这次重复观测只用于核查原地误差固定,没有作为新的独立测点加入模型。
|
|
||||||
|
|
||||||
使用 $\pm 1^\circ$ 得到四边形,其顶点按逆时针顺序为:
|
|
||||||
|
|
||||||
| 顶点 | x(米) | y(米) |
|
|
||||||
| --- | ---: | ---: |
|
|
||||||
| V1 | −460.698306 | 502.411776 |
|
|
||||||
| V2 | −456.424236 | 497.750714 |
|
|
||||||
| V3 | −440.569893 | 515.476604 |
|
|
||||||
| V4 | −441.370356 | 516.413163 |
|
|
||||||
|
|
||||||
计算结果:D=23.996723米,最远点对为V1和V3;直径圆中心为(−450.634100,508.944190),半径11.998362米,但最远顶点到这个圆心的距离为12.602364米,所以该圆不能覆盖区域。最小包围圆中心为(−449.976955,507.952835),半径12.068583米。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
共发送14个被接受的请求:1次进入、12次检测、1次退出,最终虚拟时间293.602198秒。日志末尾为 `/exit`、`accepted=true`、`exit_reason=user_exit`;界面显示测试正常结束。没有调用 `/clear`,所以这里不能将演练结束解读为“清除了所有源”。官方没有公开该源的坐标真值,本例验证的是观测交会计算、接口适配和几何自洽性,不声称验证了真实位置误差。
|
|
||||||
|
|
||||||
原始请求响应保存在 `output/q1/practice/*_actions.json`,保留了复算所需的请求ID、位置、频道与时间;三点观测及其计算结果保存在 `*_observations.json`。没有读取或解密模拟器隐藏场景数据。
|
|
||||||
|
|
||||||
## 八、运行方式和代码入口
|
|
||||||
|
|
||||||
核心算法仅用Python标准库,支持Python3.10及以上;工程依赖仅 `requests`(测试另需 `pytest`)。在项目根目录运行:
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
uv run python -m mcm26b.geometry examples/q1/triangle.json -o output/q1/triangle_recomputed.json
|
|
||||||
uv run mcm26b q1 examples/q1/normal.json
|
|
||||||
uv run python -m mcm26b.geometry examples/q1/normal.json --rounding-margin-deg 0.005
|
|
||||||
uv run pytest
|
|
||||||
uv run python scripts/build_q1_demo.py
|
|
||||||
uv run python scripts/benchmark_q1.py
|
|
||||||
```
|
|
||||||
|
|
||||||
输入JSON的最小格式:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"measurements": [
|
|
||||||
{"x": 0, "y": 0, "bearing_deg": 131.52, "half_angle_deg": 1},
|
|
||||||
{"x": -613.7618853216438, "y": 391.53077545248124, "bearing_deg": 34.92},
|
|
||||||
{"x": -314.2721344680094, "y": 656.6833525352392, "bearing_deg": 227.19}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
省略 `half_angle_deg` 时默认为1。输出包含区域状态、顶点、直径、最远点对、直径圆覆盖判断、反例证据、最小包围圆和清除余量。CLI的 `error_policy` 记录追加裕量与每条观测最终半角;默认追加0,不改变输入口径。`tolerance_m` 是归一化容差换算回米的尺度;核心算法不接收真源坐标,样例中的 `target` 只用于合成数据的可视化与测试。空集和无界区域不输出有限圆及清除证书。
|
|
||||||
|
|
||||||
| 文件 | 职责 |
|
|
||||||
| --- | --- |
|
|
||||||
| `src/mcm26b/geometry/localization.py` | 测向角域、半平面、区域分类、直径和包围圆 |
|
|
||||||
| `src/mcm26b/geometry/planning.py` | 问题二首次测向的距离保证候选圆盘;独立于问题一模型 |
|
|
||||||
| `src/mcm26b/geometry/__main__.py`、`src/mcm26b/cli.py` | JSON命令行输入输出 |
|
|
||||||
| `tests/test_geometry.py` | 解析反例、随机几何、独立裁剪对照与退化测试 |
|
|
||||||
| `tests/test_practice_replay.py` | 离线复算演练计时与观测结果,不连接模拟器 |
|
|
||||||
| `tests/test_geometry_certificates.py` | 增量圆与穷举法对照、覆盖证据、清除阈值、舍入选项及首次选点证书 |
|
|
||||||
| `scripts/benchmark_q1.py` | 局部性能对比与官方演练误差界敏感性复算 |
|
|
||||||
| `scripts/capture_practice.py` | 在已经启动且已核验的演练中采集少量测向 |
|
|
||||||
| `scripts/build_q1_demo.py` | 用Python算法生成案例、结果和交互图数据 |
|
|
||||||
| `scripts/assets/q1.template.html` | 可视化源模板;不另写一套求解算法 |
|
|
||||||
| `output/q1/question1.html` | 可直接打开的离线交互式模拟,所有数据已内嵌 |
|
|
||||||
|
|
||||||
如需再次采集,先在模拟器明确启动“问题3演练测试”,等待接口就绪,读取案例编码,然后运行:
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
uv run python scripts/capture_practice.py --robot-id 你的参赛队号 --practice-confirmed --case-code 界面中的演练案例编码
|
|
||||||
```
|
|
||||||
|
|
||||||
接口协议没有返回演练/正式模式的字段,`--practice-confirmed` 是操作者确认已核验界面的显式参数,不能替代界面核查。采集脚本没有启动测试的功能,没有正式模式选项,只会调用 `/enter`、`/measure`、`/exit`。禁止在正式测试会话中运行。
|
|
||||||
|
|
||||||
## 九、验证范围和数值限制
|
|
||||||
|
|
||||||
20项自动化测试通过,包括100组随机有界案例、60组与独立矩形裁剪实现的对照、250组增量圆与穷举圆对照、1500个共圆点及重复点/共线点、平移旋转缩放不变性,以及已保存演练日志的逐动作计时复算。新增测试还覆盖清除距离20米临界值、显式舍入选项、首次安全候选圆盘边界和零半径情形。已测试一组有限但直径超过10亿米的近乎平行测向,确认不会因为显示范围而被截断成小区域。
|
|
||||||
|
|
||||||
本次离线优化报告保存在 `output/q1/optimization_report.json`。同一演练观测的敏感性结果如下,原始记录不改写:
|
|
||||||
|
|
||||||
| 误差半角 | 直径 / 米 | MEC半径 / 米 | 直径圆最大超出 / 米 | 含数值裕量的清除余量 / 米 |
|
|
||||||
| --- | ---: | ---: | ---: | ---: |
|
|
||||||
| $1^\circ$(默认题设) | 23.996723 | 12.068583 | 0.604002 | 7.931415 |
|
|
||||||
| $1.005^\circ$(额外舍入) | 24.119088 | 12.130377 | 0.608486 | 7.869621 |
|
|
||||||
|
|
||||||
在本机60个共圆点的局部基准中,旧MEC枚举中位约306.5毫秒,新算法约0.096毫秒;4点时旧法约0.022毫秒、新法约0.029毫秒,小规模没有提速优势。这些是特定输入的局部实测,不是普遍倍率保证,也不代表网络、全清闭环或官方成绩。三点演练的完整问题一求解中位约0.099毫秒。运行基准脚本可以重新生成当前机器的报告。
|
|
||||||
|
|
||||||
浮点计算不是精确算术。实现使用归一化位置容差 $10^{-9}$、平行行列式阈值 $10^{-12}$ 和较严格的衰退方向角度容差。极端近乎平行、差异接近机器精度或接近退化的输入可能需要高精度几何谓词;结果接近临界阈值时应做容差敏感性检查,而不把最后若干小数位当作严格证明。正常题设坐标和测向精度下,本次案例远离这些数值极限。
|
|
||||||
|
|
||||||
交互图数据全部由同一Python求解器生成。已在最小DOM测试环境中检查32个“案例/测点数量/视图”组合,未发现缺失控件或NaN等非法图形坐标;并对360与736像素、明暗两种配色的SVG作静态图形检查。浏览器工具对本地文件URL的访问被策略拦截,因此没有声称完成真实浏览器的HTML/CSS布局验证。离线页面和对话内可视化均已生成;静态PNG可作为直接查看的补充。
|
|
||||||
|
|
||||||
几何算法参考:[CGAL最小包围圆定义与Welzl增量方法](https://doc.cgal.org/latest/Bounding_volumes/classCGAL_1_1Min__circle__2.html);[McGill旋转卡壳说明](https://www-cgrl.cs.mcgill.ca/~godfried/research/calipers.html)。本次代码仅用Python标准库,不依赖CGAL。
|
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
{"event":"session_start","case_code":"BBM9-HZG2-77N5-NKKC","module":"q3_practice","robot_id":"1","seed":214175614,"countdown_s":5.0,"window_s":1500.0,"max_real_duration_s":1200.0,"truth":[{"channel":13,"x":-667.5434273375823,"y":1201.9279733147766,"r_eff_m":1068.7667479727882,"directional":false,"heading_deg":0.0},{"channel":18,"x":936.4803225514449,"y":-449.0798658945765,"r_eff_m":1100.2220789348723,"directional":false,"heading_deg":0.0},{"channel":7,"x":1168.5586737701378,"y":-665.9024303254582,"r_eff_m":1380.180019258212,"directional":false,"heading_deg":0.0},{"channel":16,"x":-704.338944452677,"y":-1500.6801256821625,"r_eff_m":1260.765213581664,"directional":false,"heading_deg":0.0},{"channel":9,"x":301.3279949940345,"y":-1195.568730289507,"r_eff_m":1268.9333402487596,"directional":false,"heading_deg":0.0},{"channel":19,"x":-1016.5047516327342,"y":-1362.2054377699205,"r_eff_m":1029.8927902123228,"directional":false,"heading_deg":0.0},{"channel":17,"x":-1128.3611120627002,"y":-751.6668239293164,"r_eff_m":1073.440585013539,"directional":false,"heading_deg":0.0},{"channel":2,"x":1267.339479448259,"y":687.5619158006604,"r_eff_m":1380.3211633911274,"directional":false,"heading_deg":0.0},{"channel":14,"x":-431.7778870393432,"y":921.0181764839424,"r_eff_m":1418.973099517202,"directional":false,"heading_deg":0.0},{"channel":11,"x":437.0112473060851,"y":-112.52557536387796,"r_eff_m":1181.7035745633132,"directional":false,"heading_deg":0.0}]}
|
||||||
|
{"event":"action","seq":1,"wall_ts_ms":1789097576646,"method":"POST","path":"/enter","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0001"},"response":{"accepted":true,"real_timestamp_ms":1789097576646,"virtual_time_s":0.0,"max_virtual_duration_s":360000.0,"max_real_duration_s":1200,"remaining_real_duration_s":1200}}
|
||||||
|
{"event":"action","seq":2,"wall_ts_ms":1789097576662,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0002","position":{"x":0.0,"y":0.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789097576662,"virtual_time_s":5.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":3,"wall_ts_ms":1789097576667,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0003","position":{"x":0.0,"y":0.0},"channel":2},"response":{"accepted":true,"real_timestamp_ms":1789097576667,"virtual_time_s":11.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":4,"wall_ts_ms":1789097576672,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0004","position":{"x":0.0,"y":0.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789097576672,"virtual_time_s":17.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":5,"wall_ts_ms":1789097576677,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0005","position":{"x":0.0,"y":0.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789097576677,"virtual_time_s":23.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":6,"wall_ts_ms":1789097576689,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0006","position":{"x":0.0,"y":0.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789097576688,"virtual_time_s":29.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":7,"wall_ts_ms":1789097576716,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0007","position":{"x":0.0,"y":0.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789097576716,"virtual_time_s":35.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":8,"wall_ts_ms":1789097576727,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0008","position":{"x":0.0,"y":0.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789097576727,"virtual_time_s":41.0,"measure_result":"direction","svd_deg":329.53}}
|
||||||
|
{"event":"action","seq":9,"wall_ts_ms":1789097576757,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0009","position":{"x":0.0,"y":0.0},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789097576757,"virtual_time_s":47.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":10,"wall_ts_ms":1789097576762,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0010","position":{"x":0.0,"y":0.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789097576762,"virtual_time_s":53.0,"measure_result":"direction","svd_deg":284.61}}
|
||||||
|
{"event":"action","seq":11,"wall_ts_ms":1789097576791,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0011","position":{"x":0.0,"y":0.0},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789097576791,"virtual_time_s":59.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":12,"wall_ts_ms":1789097576796,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0012","position":{"x":0.0,"y":0.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789097576796,"virtual_time_s":65.0,"measure_result":"direction","svd_deg":345.95}}
|
||||||
|
{"event":"action","seq":13,"wall_ts_ms":1789097576825,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0013","position":{"x":0.0,"y":0.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789097576825,"virtual_time_s":71.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":14,"wall_ts_ms":1789097576830,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0014","position":{"x":0.0,"y":0.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789097576830,"virtual_time_s":77.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":15,"wall_ts_ms":1789097576835,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0015","position":{"x":0.0,"y":0.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789097576835,"virtual_time_s":83.0,"measure_result":"direction","svd_deg":115.07}}
|
||||||
|
{"event":"action","seq":16,"wall_ts_ms":1789097576864,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0016","position":{"x":0.0,"y":0.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789097576864,"virtual_time_s":89.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":17,"wall_ts_ms":1789097576868,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0017","position":{"x":0.0,"y":0.0},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789097576868,"virtual_time_s":95.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":18,"wall_ts_ms":1789097576873,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0018","position":{"x":0.0,"y":0.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789097576873,"virtual_time_s":101.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":19,"wall_ts_ms":1789097576878,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0019","position":{"x":0.0,"y":0.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789097576878,"virtual_time_s":107.0,"measure_result":"direction","svd_deg":334.09}}
|
||||||
|
{"event":"action","seq":20,"wall_ts_ms":1789097576907,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0020","position":{"x":0.0,"y":0.0},"channel":19},"response":{"accepted":true,"real_timestamp_ms":1789097576907,"virtual_time_s":113.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":21,"wall_ts_ms":1789097576913,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0021","position":{"x":0.0,"y":0.0},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789097576913,"virtual_time_s":119.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":22,"wall_ts_ms":1789097577020,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0022","position":{"x":-382.32549659893994,"y":438.1825018611922},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789097577020,"virtual_time_s":241.305923,"measure_result":"direction","svd_deg":95.7}}
|
||||||
|
{"event":"action","seq":23,"wall_ts_ms":1789097577105,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0023","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789097577105,"virtual_time_s":375.155971,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":24,"wall_ts_ms":1789097577108,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0024","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":2},"response":{"accepted":true,"real_timestamp_ms":1789097577108,"virtual_time_s":381.155971,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":25,"wall_ts_ms":1789097577111,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0025","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789097577111,"virtual_time_s":387.155971,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":26,"wall_ts_ms":1789097577114,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0026","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789097577114,"virtual_time_s":393.155971,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":27,"wall_ts_ms":1789097577117,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0027","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789097577117,"virtual_time_s":399.155971,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":28,"wall_ts_ms":1789097577121,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0028","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789097577121,"virtual_time_s":405.155971,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":29,"wall_ts_ms":1789097577124,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0029","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789097577124,"virtual_time_s":411.155971,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":30,"wall_ts_ms":1789097577128,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0030","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789097577128,"virtual_time_s":417.155971,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":31,"wall_ts_ms":1789097577132,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0031","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789097577132,"virtual_time_s":423.155971,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":32,"wall_ts_ms":1789097577137,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0032","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789097577136,"virtual_time_s":429.155971,"measure_result":"direction","svd_deg":112.67}}
|
||||||
|
{"event":"action","seq":33,"wall_ts_ms":1789097577155,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0033","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789097577155,"virtual_time_s":435.155971,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":34,"wall_ts_ms":1789097577158,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0034","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789097577158,"virtual_time_s":441.155971,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":35,"wall_ts_ms":1789097577161,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0035","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789097577161,"virtual_time_s":447.155971,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":36,"wall_ts_ms":1789097577165,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0036","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":19},"response":{"accepted":true,"real_timestamp_ms":1789097577165,"virtual_time_s":453.155971,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":37,"wall_ts_ms":1789097577169,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0037","position":{"x":-599.9999999999998,"y":1039.2304845413264},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789097577169,"virtual_time_s":459.155971,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":38,"wall_ts_ms":1789097577275,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0038","position":{"x":-432.59886137022454,"y":927.952956866304},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789097577275,"virtual_time_s":505.358374,"measure_result":"direction","svd_deg":276.22}}
|
||||||
|
{"event":"action","seq":39,"wall_ts_ms":1789097577364,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0039","position":{"x":-428.8404761449007,"y":898.3063116196065},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789097577364,"virtual_time_s":516.335159,"measure_result":"direction","svd_deg":96.95}}
|
||||||
|
{"event":"action","seq":40,"wall_ts_ms":1789097577365,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0040","position":{"x":-430.7196687575625,"y":913.129634242954},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789097577365,"virtual_time_s":524.323552,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":41,"wall_ts_ms":1789097577455,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0041","position":{"x":-441.9875302830439,"y":1247.8826866081681},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789097577455,"virtual_time_s":597.31208,"measure_result":"direction","svd_deg":191.28}}
|
||||||
|
{"event":"action","seq":42,"wall_ts_ms":1789097577456,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0042","position":{"x":-668.4093907720109,"y":1202.7926660772903},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789097577456,"virtual_time_s":648.485652,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":43,"wall_ts_ms":1789097577536,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0043","position":{"x":600.0000000000001,"y":1039.2304845413264},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789097577536,"virtual_time_s":910.267979,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":44,"wall_ts_ms":1789097577539,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0044","position":{"x":600.0000000000001,"y":1039.2304845413264},"channel":2},"response":{"accepted":true,"real_timestamp_ms":1789097577539,"virtual_time_s":916.267979,"measure_result":"direction","svd_deg":332.39}}
|
||||||
|
{"event":"action","seq":45,"wall_ts_ms":1789097577554,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0045","position":{"x":600.0000000000001,"y":1039.2304845413264},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789097577554,"virtual_time_s":922.267979,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":46,"wall_ts_ms":1789097577557,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0046","position":{"x":600.0000000000001,"y":1039.2304845413264},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789097577557,"virtual_time_s":928.267979,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":47,"wall_ts_ms":1789097577560,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0047","position":{"x":600.0000000000001,"y":1039.2304845413264},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789097577560,"virtual_time_s":934.267979,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":48,"wall_ts_ms":1789097577564,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0048","position":{"x":600.0000000000001,"y":1039.2304845413264},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789097577564,"virtual_time_s":940.267979,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":49,"wall_ts_ms":1789097577567,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0049","position":{"x":600.0000000000001,"y":1039.2304845413264},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789097577567,"virtual_time_s":946.267979,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":50,"wall_ts_ms":1789097577571,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0050","position":{"x":600.0000000000001,"y":1039.2304845413264},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789097577571,"virtual_time_s":952.267979,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":51,"wall_ts_ms":1789097577574,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0051","position":{"x":600.0000000000001,"y":1039.2304845413264},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789097577574,"virtual_time_s":958.267979,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":52,"wall_ts_ms":1789097577577,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0052","position":{"x":600.0000000000001,"y":1039.2304845413264},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789097577577,"virtual_time_s":964.267979,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":53,"wall_ts_ms":1789097577581,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0053","position":{"x":600.0000000000001,"y":1039.2304845413264},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789097577581,"virtual_time_s":970.267979,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":54,"wall_ts_ms":1789097577583,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0054","position":{"x":600.0000000000001,"y":1039.2304845413264},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789097577583,"virtual_time_s":976.267979,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":55,"wall_ts_ms":1789097577586,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0055","position":{"x":600.0000000000001,"y":1039.2304845413264},"channel":19},"response":{"accepted":true,"real_timestamp_ms":1789097577586,"virtual_time_s":982.267979,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":56,"wall_ts_ms":1789097577588,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0056","position":{"x":600.0000000000001,"y":1039.2304845413264},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789097577588,"virtual_time_s":988.267979,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":57,"wall_ts_ms":1789097577687,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0057","position":{"x":994.1110687766269,"y":542.6492729278544},"channel":2},"response":{"accepted":true,"real_timestamp_ms":1789097577687,"virtual_time_s":1121.061738,"measure_result":"direction","svd_deg":28.25}}
|
||||||
|
{"event":"action","seq":58,"wall_ts_ms":1789097577767,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0058","position":{"x":1268.7031752387938,"y":689.8006776789011},"channel":2},"response":{"accepted":true,"real_timestamp_ms":1789097577767,"virtual_time_s":1188.368836,"measure_result":"near"}}
|
||||||
|
{"event":"action","seq":59,"wall_ts_ms":1789097577773,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0059","position":{"x":1268.7031752387938,"y":689.8006776789011},"channel":2},"response":{"accepted":true,"real_timestamp_ms":1789097577773,"virtual_time_s":1193.368836,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":60,"wall_ts_ms":1789097577859,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0060","position":{"x":1200.0,"y":0.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789097577859,"virtual_time_s":1338.011557,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":61,"wall_ts_ms":1789097577861,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0061","position":{"x":1200.0,"y":0.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789097577861,"virtual_time_s":1344.011557,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":62,"wall_ts_ms":1789097577864,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0062","position":{"x":1200.0,"y":0.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789097577864,"virtual_time_s":1350.011557,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":63,"wall_ts_ms":1789097577866,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0063","position":{"x":1200.0,"y":0.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789097577866,"virtual_time_s":1356.011557,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":64,"wall_ts_ms":1789097577869,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0064","position":{"x":1200.0,"y":0.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789097577869,"virtual_time_s":1362.011557,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":65,"wall_ts_ms":1789097577871,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0065","position":{"x":1200.0,"y":0.0},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789097577871,"virtual_time_s":1368.011557,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":66,"wall_ts_ms":1789097577873,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0066","position":{"x":1200.0,"y":0.0},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789097577873,"virtual_time_s":1374.011557,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":67,"wall_ts_ms":1789097577876,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0067","position":{"x":1200.0,"y":0.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789097577875,"virtual_time_s":1380.011557,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":68,"wall_ts_ms":1789097577878,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0068","position":{"x":1200.0,"y":0.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789097577878,"virtual_time_s":1386.011557,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":69,"wall_ts_ms":1789097577881,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0069","position":{"x":1200.0,"y":0.0},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789097577881,"virtual_time_s":1392.011557,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":70,"wall_ts_ms":1789097577884,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0070","position":{"x":1200.0,"y":0.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789097577884,"virtual_time_s":1398.011557,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":71,"wall_ts_ms":1789097577888,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0071","position":{"x":1200.0,"y":0.0},"channel":19},"response":{"accepted":true,"real_timestamp_ms":1789097577888,"virtual_time_s":1404.011557,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":72,"wall_ts_ms":1789097577890,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0072","position":{"x":1200.0,"y":0.0},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789097577890,"virtual_time_s":1410.011557,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":73,"wall_ts_ms":1789097577973,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0073","position":{"x":904.3723232997338,"y":-5.399878906793646},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789097577973,"virtual_time_s":1475.146955,"measure_result":"direction","svd_deg":193.85}}
|
||||||
|
{"event":"action","seq":74,"wall_ts_ms":1789097578037,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0074","position":{"x":732.9363400589687,"y":158.81239802766925},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789097578037,"virtual_time_s":1527.625779,"measure_result":"direction","svd_deg":223.37}}
|
||||||
|
{"event":"action","seq":75,"wall_ts_ms":1789097578039,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0075","position":{"x":446.4480711916748,"y":-111.48435372746496},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789097578039,"virtual_time_s":1611.400359,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":76,"wall_ts_ms":1789097578098,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0076","position":{"x":609.8586286156244,"y":-86.93118226598972},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789097578098,"virtual_time_s":1650.449334,"measure_result":"direction","svd_deg":312.82}}
|
||||||
|
{"event":"action","seq":77,"wall_ts_ms":1789097578145,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0077","position":{"x":711.4189708756367,"y":-138.68820908196022},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789097578145,"virtual_time_s":1679.246959,"measure_result":"direction","svd_deg":311.79}}
|
||||||
|
{"event":"action","seq":78,"wall_ts_ms":1789097578171,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0078","position":{"x":968.3799882543295,"y":-471.87178417317915},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789097578171,"virtual_time_s":1769.399264,"measure_result":"direction","svd_deg":145.41}}
|
||||||
|
{"event":"action","seq":79,"wall_ts_ms":1789097578198,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0079","position":{"x":948.6903772101683,"y":-457.77800595341034},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789097578198,"virtual_time_s":1779.242054,"measure_result":"direction","svd_deg":144.5}}
|
||||||
|
{"event":"action","seq":80,"wall_ts_ms":1789097578200,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0080","position":{"x":938.8455716880909,"y":-450.7311168435281},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789097578200,"virtual_time_s":1786.663449,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":81,"wall_ts_ms":1789097578222,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0081","position":{"x":1216.8995655319154,"y":-717.7217593627017},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789097578222,"virtual_time_s":1869.760278,"measure_result":"direction","svd_deg":132.81}}
|
||||||
|
{"event":"action","seq":82,"wall_ts_ms":1789097578247,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0082","position":{"x":1185.682710431516,"y":-684.9782355200915},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789097578247,"virtual_time_s":1883.808218,"measure_result":"direction","svd_deg":132.18}}
|
||||||
|
{"event":"action","seq":83,"wall_ts_ms":1789097578269,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0083","position":{"x":1170.5902788598225,"y":-668.8979941203445},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789097578269,"virtual_time_s":1893.218913,"measure_result":"near"}}
|
||||||
|
{"event":"action","seq":84,"wall_ts_ms":1789097578272,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0084","position":{"x":1170.6182266765854,"y":-668.8718181334558},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789097578272,"virtual_time_s":1898.226571,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":85,"wall_ts_ms":1789097578293,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0085","position":{"x":600.0000000000001,"y":-1039.2304845413264},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789097578293,"virtual_time_s":2040.281075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":86,"wall_ts_ms":1789097578296,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0086","position":{"x":600.0000000000001,"y":-1039.2304845413264},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789097578296,"virtual_time_s":2046.281075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":87,"wall_ts_ms":1789097578299,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0087","position":{"x":600.0000000000001,"y":-1039.2304845413264},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789097578299,"virtual_time_s":2052.281075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":88,"wall_ts_ms":1789097578301,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0088","position":{"x":600.0000000000001,"y":-1039.2304845413264},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789097578301,"virtual_time_s":2058.281075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":89,"wall_ts_ms":1789097578304,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0089","position":{"x":600.0000000000001,"y":-1039.2304845413264},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789097578304,"virtual_time_s":2064.281075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":90,"wall_ts_ms":1789097578307,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0090","position":{"x":600.0000000000001,"y":-1039.2304845413264},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789097578307,"virtual_time_s":2070.281075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":91,"wall_ts_ms":1789097578311,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0091","position":{"x":600.0000000000001,"y":-1039.2304845413264},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789097578311,"virtual_time_s":2076.281075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":92,"wall_ts_ms":1789097578314,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0092","position":{"x":600.0000000000001,"y":-1039.2304845413264},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789097578314,"virtual_time_s":2082.281075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":93,"wall_ts_ms":1789097578318,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0093","position":{"x":600.0000000000001,"y":-1039.2304845413264},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789097578318,"virtual_time_s":2088.281075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":94,"wall_ts_ms":1789097578322,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0094","position":{"x":600.0000000000001,"y":-1039.2304845413264},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789097578322,"virtual_time_s":2094.281075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":95,"wall_ts_ms":1789097578325,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0095","position":{"x":600.0000000000001,"y":-1039.2304845413264},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789097578325,"virtual_time_s":2100.281075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":96,"wall_ts_ms":1789097578328,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0096","position":{"x":600.0000000000001,"y":-1039.2304845413264},"channel":19},"response":{"accepted":true,"real_timestamp_ms":1789097578328,"virtual_time_s":2106.281075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":97,"wall_ts_ms":1789097578332,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0097","position":{"x":600.0000000000001,"y":-1039.2304845413264},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789097578332,"virtual_time_s":2112.281075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":98,"wall_ts_ms":1789097578355,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0098","position":{"x":431.0177074456876,"y":-790.4383437162506},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789097578355,"virtual_time_s":2178.431734,"measure_result":"direction","svd_deg":252.8}}
|
||||||
|
{"event":"action","seq":99,"wall_ts_ms":1789097578358,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0099","position":{"x":308.8495661381867,"y":-1188.2218722331802},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789097578358,"virtual_time_s":2266.655959,"measure_result":"direction","svd_deg":225.19}}
|
||||||
|
{"event":"action","seq":100,"wall_ts_ms":1789097578359,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0100","position":{"x":302.26396092359636,"y":-1195.0880783213174},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789097578359,"virtual_time_s":2273.558746,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":101,"wall_ts_ms":1789097578360,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0101","position":{"x":-600.0000000000006,"y":-1039.230484541326},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789097578360,"virtual_time_s":2462.684041,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":102,"wall_ts_ms":1789097578363,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0102","position":{"x":-600.0000000000006,"y":-1039.230484541326},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789097578363,"virtual_time_s":2468.684041,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":103,"wall_ts_ms":1789097578366,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0103","position":{"x":-600.0000000000006,"y":-1039.230484541326},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789097578366,"virtual_time_s":2474.684041,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":104,"wall_ts_ms":1789097578371,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0104","position":{"x":-600.0000000000006,"y":-1039.230484541326},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789097578371,"virtual_time_s":2480.684041,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":105,"wall_ts_ms":1789097578374,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0105","position":{"x":-600.0000000000006,"y":-1039.230484541326},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789097578374,"virtual_time_s":2486.684041,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":106,"wall_ts_ms":1789097578377,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0106","position":{"x":-600.0000000000006,"y":-1039.230484541326},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789097578377,"virtual_time_s":2492.684041,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":107,"wall_ts_ms":1789097578380,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0107","position":{"x":-600.0000000000006,"y":-1039.230484541326},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789097578380,"virtual_time_s":2498.684041,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":108,"wall_ts_ms":1789097578384,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0108","position":{"x":-600.0000000000006,"y":-1039.230484541326},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789097578383,"virtual_time_s":2504.684041,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":109,"wall_ts_ms":1789097578386,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0109","position":{"x":-600.0000000000006,"y":-1039.230484541326},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789097578386,"virtual_time_s":2510.684041,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":110,"wall_ts_ms":1789097578389,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0110","position":{"x":-600.0000000000006,"y":-1039.230484541326},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789097578389,"virtual_time_s":2516.684041,"measure_result":"direction","svd_deg":257.75}}
|
||||||
|
{"event":"action","seq":111,"wall_ts_ms":1789097578399,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0111","position":{"x":-600.0000000000006,"y":-1039.230484541326},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789097578399,"virtual_time_s":2522.684041,"measure_result":"direction","svd_deg":150.83}}
|
||||||
|
{"event":"action","seq":112,"wall_ts_ms":1789097578409,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0112","position":{"x":-600.0000000000006,"y":-1039.230484541326},"channel":19},"response":{"accepted":true,"real_timestamp_ms":1789097578409,"virtual_time_s":2528.684041,"measure_result":"direction","svd_deg":217.09}}
|
||||||
|
{"event":"action","seq":113,"wall_ts_ms":1789097578419,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0113","position":{"x":-600.0000000000006,"y":-1039.230484541326},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789097578419,"virtual_time_s":2534.684041,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":114,"wall_ts_ms":1789097578449,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0114","position":{"x":-855.523050877763,"y":-1149.4070702441772},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789097578449,"virtual_time_s":2596.336861,"measure_result":"direction","svd_deg":293.06}}
|
||||||
|
{"event":"action","seq":115,"wall_ts_ms":1789097578473,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0115","position":{"x":-702.0198196486191,"y":-1511.0796905664733},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789097578473,"virtual_time_s":2679.91684,"measure_result":"direction","svd_deg":101.78}}
|
||||||
|
{"event":"action","seq":116,"wall_ts_ms":1789097578475,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0116","position":{"x":-704.0596428309664,"y":-1500.3611560598777},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789097578475,"virtual_time_s":2687.099021,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":117,"wall_ts_ms":1789097578495,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0117","position":{"x":-786.4741505952657,"y":-1490.051846445478},"channel":19},"response":{"accepted":true,"real_timestamp_ms":1789097578495,"virtual_time_s":2709.710382,"measure_result":"direction","svd_deg":151.04}}
|
||||||
|
{"event":"action","seq":118,"wall_ts_ms":1789097578497,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0118","position":{"x":-1023.4461023835017,"y":-1359.1588736906476},"channel":19},"response":{"accepted":true,"real_timestamp_ms":1789097578497,"virtual_time_s":2768.854145,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":119,"wall_ts_ms":1789097578511,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0119","position":{"x":-1266.2459250683066,"y":-1017.2747950835054},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789097578511,"virtual_time_s":2858.719866,"measure_result":"direction","svd_deg":62.8}}
|
||||||
|
{"event":"action","seq":120,"wall_ts_ms":1789097578513,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0120","position":{"x":-1126.6121592386512,"y":-745.1634840678316},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789097578513,"virtual_time_s":2924.88919,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":121,"wall_ts_ms":1789097578515,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0121","position":{"x":-1200.0,"y":1.4695761589768238e-13},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789097578515,"virtual_time_s":3080.642907,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":122,"wall_ts_ms":1789097578518,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0122","position":{"x":-1200.0,"y":1.4695761589768238e-13},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789097578518,"virtual_time_s":3086.642907,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":123,"wall_ts_ms":1789097578520,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0123","position":{"x":-1200.0,"y":1.4695761589768238e-13},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789097578520,"virtual_time_s":3092.642907,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":124,"wall_ts_ms":1789097578522,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0124","position":{"x":-1200.0,"y":1.4695761589768238e-13},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789097578522,"virtual_time_s":3098.642907,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":125,"wall_ts_ms":1789097578524,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0125","position":{"x":-1200.0,"y":1.4695761589768238e-13},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789097578524,"virtual_time_s":3104.642907,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":126,"wall_ts_ms":1789097578526,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0126","position":{"x":-1200.0,"y":1.4695761589768238e-13},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789097578526,"virtual_time_s":3110.642907,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":127,"wall_ts_ms":1789097578527,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0127","position":{"x":-1200.0,"y":1.4695761589768238e-13},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789097578527,"virtual_time_s":3116.642907,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":128,"wall_ts_ms":1789097578529,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0128","position":{"x":-1200.0,"y":1.4695761589768238e-13},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789097578529,"virtual_time_s":3122.642907,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":129,"wall_ts_ms":1789097578531,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0129","position":{"x":-1200.0,"y":1.4695761589768238e-13},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789097578531,"virtual_time_s":3128.642907,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":130,"wall_ts_ms":1789097578533,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0130","position":{"x":-1200.0,"y":1.4695761589768238e-13},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789097578533,"virtual_time_s":3134.642907,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":131,"wall_ts_ms":1789097578535,"method":"POST","path":"/exit","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"4721c649063d-0131"},"response":{"accepted":true,"real_timestamp_ms":1789097578535,"virtual_time_s":3134.642907,"exit_reason":"user_exit"}}
|
||||||
|
{"event":"session_end","reason":"user_exit","virtual_time_s":3134.642907,"real_elapsed_s":3.209263,"request_count":131,"cleared_count":10}
|
||||||
@@ -0,0 +1,429 @@
|
|||||||
|
{"event":"session_start","case_code":"GHSN-M38E-74GD-YLUD","module":"q4_practice","robot_id":"1","seed":1907688398,"countdown_s":5.0,"window_s":1500.0,"max_real_duration_s":1200.0,"truth":[{"channel":6,"x":-168.78031525275804,"y":1684.875239455932,"r_eff_m":1233.1529913973563,"directional":true,"heading_deg":351.84275431652014},{"channel":15,"x":411.7975180678083,"y":1548.040304144621,"r_eff_m":1336.3045523445826,"directional":true,"heading_deg":72.47781232458263},{"channel":8,"x":978.6674582823607,"y":-996.1121301869524,"r_eff_m":1336.1370990332562,"directional":true,"heading_deg":246.14394851382335},{"channel":16,"x":124.00340756473021,"y":-860.3622285357711,"r_eff_m":1345.578791332298,"directional":false,"heading_deg":0.0},{"channel":10,"x":729.8914456683548,"y":714.3629430529361,"r_eff_m":1127.494833936053,"directional":false,"heading_deg":0.0},{"channel":2,"x":478.441266630241,"y":449.08113076378316,"r_eff_m":1040.6068154097852,"directional":false,"heading_deg":0.0},{"channel":20,"x":-945.2003883886779,"y":638.5311986666989,"r_eff_m":1295.456469667405,"directional":false,"heading_deg":0.0},{"channel":4,"x":99.04602689897295,"y":1744.5260335974826,"r_eff_m":1032.9094604449615,"directional":false,"heading_deg":0.0},{"channel":5,"x":-1507.0542438070167,"y":761.3723575581047,"r_eff_m":1448.7977020579874,"directional":false,"heading_deg":0.0},{"channel":12,"x":-1188.1583136013294,"y":963.0220608398997,"r_eff_m":1226.2619264983982,"directional":false,"heading_deg":0.0},{"channel":19,"x":-177.4461437404443,"y":343.49207176417394,"r_eff_m":1277.3413627947266,"directional":false,"heading_deg":0.0}]}
|
||||||
|
{"event":"action","seq":1,"wall_ts_ms":1789265737816,"method":"POST","path":"/enter","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0001"},"response":{"accepted":true,"real_timestamp_ms":1789265737816,"virtual_time_s":0.0,"max_virtual_duration_s":360000.0,"max_real_duration_s":1200,"remaining_real_duration_s":1200}}
|
||||||
|
{"event":"action","seq":2,"wall_ts_ms":1789265737826,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0002","position":{"x":0.0,"y":0.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265737826,"virtual_time_s":5.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":3,"wall_ts_ms":1789265737827,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0003","position":{"x":0.0,"y":0.0},"channel":2},"response":{"accepted":true,"real_timestamp_ms":1789265737827,"virtual_time_s":11.0,"measure_result":"direction","svd_deg":43.2}}
|
||||||
|
{"event":"action","seq":4,"wall_ts_ms":1789265737865,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0004","position":{"x":0.0,"y":0.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265737865,"virtual_time_s":17.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":5,"wall_ts_ms":1789265737866,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0005","position":{"x":0.0,"y":0.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265737866,"virtual_time_s":23.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":6,"wall_ts_ms":1789265737867,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0006","position":{"x":0.0,"y":0.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265737867,"virtual_time_s":29.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":7,"wall_ts_ms":1789265737867,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0007","position":{"x":0.0,"y":0.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265737867,"virtual_time_s":35.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":8,"wall_ts_ms":1789265737868,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0008","position":{"x":0.0,"y":0.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265737868,"virtual_time_s":41.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":9,"wall_ts_ms":1789265737869,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0009","position":{"x":0.0,"y":0.0},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789265737869,"virtual_time_s":47.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":10,"wall_ts_ms":1789265737869,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0010","position":{"x":0.0,"y":0.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265737869,"virtual_time_s":53.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":11,"wall_ts_ms":1789265737870,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0011","position":{"x":0.0,"y":0.0},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789265737870,"virtual_time_s":59.0,"measure_result":"direction","svd_deg":45.09}}
|
||||||
|
{"event":"action","seq":12,"wall_ts_ms":1789265737905,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0012","position":{"x":0.0,"y":0.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265737905,"virtual_time_s":65.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":13,"wall_ts_ms":1789265737906,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0013","position":{"x":0.0,"y":0.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265737906,"virtual_time_s":71.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":14,"wall_ts_ms":1789265737907,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0014","position":{"x":0.0,"y":0.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265737907,"virtual_time_s":77.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":15,"wall_ts_ms":1789265737908,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0015","position":{"x":0.0,"y":0.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265737908,"virtual_time_s":83.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":16,"wall_ts_ms":1789265737908,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0016","position":{"x":0.0,"y":0.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265737908,"virtual_time_s":89.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":17,"wall_ts_ms":1789265737909,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0017","position":{"x":0.0,"y":0.0},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265737909,"virtual_time_s":95.0,"measure_result":"direction","svd_deg":279.14}}
|
||||||
|
{"event":"action","seq":18,"wall_ts_ms":1789265737945,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0018","position":{"x":0.0,"y":0.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265737945,"virtual_time_s":101.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":19,"wall_ts_ms":1789265737946,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0019","position":{"x":0.0,"y":0.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265737946,"virtual_time_s":107.0,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":20,"wall_ts_ms":1789265737947,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0020","position":{"x":0.0,"y":0.0},"channel":19},"response":{"accepted":true,"real_timestamp_ms":1789265737947,"virtual_time_s":113.0,"measure_result":"direction","svd_deg":117.36}}
|
||||||
|
{"event":"action","seq":21,"wall_ts_ms":1789265737983,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0021","position":{"x":0.0,"y":0.0},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789265737983,"virtual_time_s":119.0,"measure_result":"direction","svd_deg":145.55}}
|
||||||
|
{"event":"action","seq":22,"wall_ts_ms":1789265738125,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0022","position":{"x":-79.66719841213751,"y":400.9313670917169},"channel":19},"response":{"accepted":true,"real_timestamp_ms":1789265738125,"virtual_time_s":206.753978,"measure_result":"direction","svd_deg":210.37}}
|
||||||
|
{"event":"action","seq":23,"wall_ts_ms":1789265738127,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0023","position":{"x":-177.64052160825486,"y":343.3794788045638},"channel":19},"response":{"accepted":true,"real_timestamp_ms":1789265738127,"virtual_time_s":234.479287,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":24,"wall_ts_ms":1789265738245,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0024","position":{"x":-243.62294879732218,"y":424.1621461926654},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789265738245,"virtual_time_s":261.340275,"measure_result":"direction","svd_deg":162.22}}
|
||||||
|
{"event":"action","seq":25,"wall_ts_ms":1789265738273,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0025","position":{"x":-901.7130728821326,"y":655.9084449749266},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789265738273,"virtual_time_s":405.880801,"measure_result":"direction","svd_deg":202.15}}
|
||||||
|
{"event":"action","seq":26,"wall_ts_ms":1789265738284,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0026","position":{"x":-922.0070945081434,"y":643.9441735456403},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789265738284,"virtual_time_s":415.592451,"measure_result":"direction","svd_deg":193.27}}
|
||||||
|
{"event":"action","seq":27,"wall_ts_ms":1789265738286,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0027","position":{"x":-943.9158056887892,"y":638.8511609168044},"channel":20},"response":{"accepted":true,"real_timestamp_ms":1789265738286,"virtual_time_s":425.09103,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":28,"wall_ts_ms":1789265738445,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0028","position":{"x":155.06480714962538,"y":530.7765221920923},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789265738445,"virtual_time_s":651.94741,"measure_result":"direction","svd_deg":18.62}}
|
||||||
|
{"event":"action","seq":29,"wall_ts_ms":1789265738475,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0029","position":{"x":691.0981141562518,"y":722.9949655036279},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789265738475,"virtual_time_s":770.838522,"measure_result":"direction","svd_deg":348.1}}
|
||||||
|
{"event":"action","seq":30,"wall_ts_ms":1789265738490,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0030","position":{"x":704.6480025466224,"y":718.3903941183868},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789265738490,"virtual_time_s":778.7007,"measure_result":"direction","svd_deg":350.26}}
|
||||||
|
{"event":"action","seq":31,"wall_ts_ms":1789265738492,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0031","position":{"x":728.5054559976093,"y":714.7247743974735},"channel":10},"response":{"accepted":true,"real_timestamp_ms":1789265738492,"virtual_time_s":788.528183,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":32,"wall_ts_ms":1789265738690,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0032","position":{"x":282.155927735649,"y":778.2311705887862},"channel":2},"response":{"accepted":true,"real_timestamp_ms":1789265738690,"virtual_time_s":884.697127,"measure_result":"direction","svd_deg":301.58}}
|
||||||
|
{"event":"action","seq":33,"wall_ts_ms":1789265738692,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0033","position":{"x":481.9384520825037,"y":452.79231376594635},"channel":2},"response":{"accepted":true,"real_timestamp_ms":1789265738692,"virtual_time_s":966.070815,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":34,"wall_ts_ms":1789265738822,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0034","position":{"x":119.77278770558408,"y":-365.4630725746676},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738822,"virtual_time_s":1151.035152,"measure_result":"direction","svd_deg":270.43}}
|
||||||
|
{"event":"action","seq":35,"wall_ts_ms":1789265738857,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0035","position":{"x":125.50362627876382,"y":-724.3528216084252},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738857,"virtual_time_s":1227.822252,"measure_result":"direction","svd_deg":268.9}}
|
||||||
|
{"event":"action","seq":36,"wall_ts_ms":1789265738877,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0036","position":{"x":125.3777171626325,"y":-762.3214764994508},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738877,"virtual_time_s":1240.416025,"measure_result":"direction","svd_deg":269.25}}
|
||||||
|
{"event":"action","seq":37,"wall_ts_ms":1789265738893,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0037","position":{"x":125.31476260456685,"y":-790.7980024619326},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738893,"virtual_time_s":1251.111344,"measure_result":"direction","svd_deg":269.45}}
|
||||||
|
{"event":"action","seq":38,"wall_ts_ms":1789265738907,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0038","position":{"x":125.28328532553402,"y":-812.1554085318639},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738907,"virtual_time_s":1260.38283,"measure_result":"direction","svd_deg":269.15999999999997}}
|
||||||
|
{"event":"action","seq":39,"wall_ts_ms":1789265738919,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0039","position":{"x":125.2675466860176,"y":-828.1734669503353},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738919,"virtual_time_s":1268.586443,"measure_result":"direction","svd_deg":268.21}}
|
||||||
|
{"event":"action","seq":40,"wall_ts_ms":1789265738931,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0040","position":{"x":124.96644242180939,"y":-839.1602852992372},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738931,"virtual_time_s":1275.784632,"measure_result":"direction","svd_deg":266.93}}
|
||||||
|
{"event":"action","seq":41,"wall_ts_ms":1789265738933,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0041","position":{"x":124.4615306510994,"y":-853.1635717026913},"channel":16},"response":{"accepted":true,"real_timestamp_ms":1789265738933,"virtual_time_s":1283.587109,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":42,"wall_ts_ms":1789265738934,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0042","position":{"x":200.0,"y":-900.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265738934,"virtual_time_s":1307.363173,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":43,"wall_ts_ms":1789265738935,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0043","position":{"x":200.0,"y":-900.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265738935,"virtual_time_s":1313.363173,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":44,"wall_ts_ms":1789265738936,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0044","position":{"x":200.0,"y":-900.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265738936,"virtual_time_s":1319.363173,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":45,"wall_ts_ms":1789265738936,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0045","position":{"x":200.0,"y":-900.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265738936,"virtual_time_s":1325.363173,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":46,"wall_ts_ms":1789265738937,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0046","position":{"x":200.0,"y":-900.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265738937,"virtual_time_s":1331.363173,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":47,"wall_ts_ms":1789265738938,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0047","position":{"x":200.0,"y":-900.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265738938,"virtual_time_s":1337.363173,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":48,"wall_ts_ms":1789265738939,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0048","position":{"x":200.0,"y":-900.0},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789265738939,"virtual_time_s":1343.363173,"measure_result":"direction","svd_deg":352.99}}
|
||||||
|
{"event":"action","seq":49,"wall_ts_ms":1789265738972,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0049","position":{"x":200.0,"y":-900.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265738972,"virtual_time_s":1349.363173,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":50,"wall_ts_ms":1789265738973,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0050","position":{"x":200.0,"y":-900.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265738973,"virtual_time_s":1355.363173,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":51,"wall_ts_ms":1789265738974,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0051","position":{"x":200.0,"y":-900.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265738974,"virtual_time_s":1361.363173,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":52,"wall_ts_ms":1789265738975,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0052","position":{"x":200.0,"y":-900.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265738975,"virtual_time_s":1367.363173,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":53,"wall_ts_ms":1789265738977,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0053","position":{"x":200.0,"y":-900.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265738977,"virtual_time_s":1373.363173,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":54,"wall_ts_ms":1789265738978,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0054","position":{"x":200.0,"y":-900.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265738978,"virtual_time_s":1379.363173,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":55,"wall_ts_ms":1789265738978,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0055","position":{"x":200.0,"y":-900.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265738978,"virtual_time_s":1385.363173,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":56,"wall_ts_ms":1789265738979,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0056","position":{"x":200.0,"y":-900.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265738979,"virtual_time_s":1391.363173,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":57,"wall_ts_ms":1789265739081,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0057","position":{"x":516.6212801392332,"y":-966.9819199979597},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789265739081,"virtual_time_s":1462.088937,"measure_result":"direction","svd_deg":357.38}}
|
||||||
|
{"event":"action","seq":58,"wall_ts_ms":1789265739136,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0058","position":{"x":866.5933228570544,"y":-995.2814295412376},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789265739136,"virtual_time_s":1537.311809,"measure_result":"direction","svd_deg":358.73}}
|
||||||
|
{"event":"action","seq":59,"wall_ts_ms":1789265739167,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0059","position":{"x":1040.8377161691203,"y":-1003.1570563336973},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789265739167,"virtual_time_s":1577.196266,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":60,"wall_ts_ms":1789265739202,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0060","position":{"x":970.7414216957415,"y":-1003.1570563336973},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789265739202,"virtual_time_s":1596.215525,"measure_result":"direction","svd_deg":41.87}}
|
||||||
|
{"event":"action","seq":61,"wall_ts_ms":1789265739204,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0061","position":{"x":978.7251752457973,"y":-996.0135773020329},"channel":8},"response":{"accepted":true,"real_timestamp_ms":1789265739204,"virtual_time_s":1603.358137,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":62,"wall_ts_ms":1789265739205,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0062","position":{"x":900.0,"y":-700.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739205,"virtual_time_s":1670.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":63,"wall_ts_ms":1789265739206,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0063","position":{"x":900.0,"y":-700.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739206,"virtual_time_s":1676.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":64,"wall_ts_ms":1789265739207,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0064","position":{"x":900.0,"y":-700.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739207,"virtual_time_s":1682.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":65,"wall_ts_ms":1789265739207,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0065","position":{"x":900.0,"y":-700.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739207,"virtual_time_s":1688.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":66,"wall_ts_ms":1789265739208,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0066","position":{"x":900.0,"y":-700.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739208,"virtual_time_s":1694.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":67,"wall_ts_ms":1789265739211,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0067","position":{"x":900.0,"y":-700.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739211,"virtual_time_s":1700.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":68,"wall_ts_ms":1789265739212,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0068","position":{"x":900.0,"y":-700.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739212,"virtual_time_s":1706.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":69,"wall_ts_ms":1789265739212,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0069","position":{"x":900.0,"y":-700.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739212,"virtual_time_s":1712.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":70,"wall_ts_ms":1789265739213,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0070","position":{"x":900.0,"y":-700.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739213,"virtual_time_s":1718.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":71,"wall_ts_ms":1789265739214,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0071","position":{"x":900.0,"y":-700.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739214,"virtual_time_s":1724.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":72,"wall_ts_ms":1789265739216,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0072","position":{"x":900.0,"y":-700.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739216,"virtual_time_s":1730.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":73,"wall_ts_ms":1789265739217,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0073","position":{"x":900.0,"y":-700.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739217,"virtual_time_s":1736.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":74,"wall_ts_ms":1789265739218,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0074","position":{"x":900.0,"y":-700.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739218,"virtual_time_s":1742.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":75,"wall_ts_ms":1789265739219,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0075","position":{"x":900.0,"y":-700.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739219,"virtual_time_s":1748.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":76,"wall_ts_ms":1789265739219,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0076","position":{"x":1200.0,"y":-700.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739219,"virtual_time_s":1813.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":77,"wall_ts_ms":1789265739220,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0077","position":{"x":1200.0,"y":-700.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739220,"virtual_time_s":1819.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":78,"wall_ts_ms":1789265739221,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0078","position":{"x":1200.0,"y":-700.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739221,"virtual_time_s":1825.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":79,"wall_ts_ms":1789265739221,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0079","position":{"x":1200.0,"y":-700.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739221,"virtual_time_s":1831.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":80,"wall_ts_ms":1789265739222,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0080","position":{"x":1200.0,"y":-700.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739222,"virtual_time_s":1837.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":81,"wall_ts_ms":1789265739223,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0081","position":{"x":1200.0,"y":-700.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739223,"virtual_time_s":1843.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":82,"wall_ts_ms":1789265739223,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0082","position":{"x":1200.0,"y":-700.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739223,"virtual_time_s":1849.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":83,"wall_ts_ms":1789265739224,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0083","position":{"x":1200.0,"y":-700.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739224,"virtual_time_s":1855.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":84,"wall_ts_ms":1789265739225,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0084","position":{"x":1200.0,"y":-700.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739225,"virtual_time_s":1861.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":85,"wall_ts_ms":1789265739226,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0085","position":{"x":1200.0,"y":-700.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739226,"virtual_time_s":1867.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":86,"wall_ts_ms":1789265739226,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0086","position":{"x":1200.0,"y":-700.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739226,"virtual_time_s":1873.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":87,"wall_ts_ms":1789265739227,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0087","position":{"x":1200.0,"y":-700.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739227,"virtual_time_s":1879.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":88,"wall_ts_ms":1789265739228,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0088","position":{"x":1200.0,"y":-700.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739228,"virtual_time_s":1885.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":89,"wall_ts_ms":1789265739228,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0089","position":{"x":1200.0,"y":-700.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739228,"virtual_time_s":1891.61879,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":90,"wall_ts_ms":1789265739229,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0090","position":{"x":1800.0,"y":-400.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739229,"virtual_time_s":2030.782869,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":91,"wall_ts_ms":1789265739230,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0091","position":{"x":1800.0,"y":-400.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739230,"virtual_time_s":2036.782869,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":92,"wall_ts_ms":1789265739230,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0092","position":{"x":1800.0,"y":-400.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739230,"virtual_time_s":2042.782869,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":93,"wall_ts_ms":1789265739231,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0093","position":{"x":1800.0,"y":-400.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739231,"virtual_time_s":2048.782869,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":94,"wall_ts_ms":1789265739232,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0094","position":{"x":1800.0,"y":-400.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739232,"virtual_time_s":2054.782869,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":95,"wall_ts_ms":1789265739233,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0095","position":{"x":1800.0,"y":-400.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739233,"virtual_time_s":2060.782869,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":96,"wall_ts_ms":1789265739233,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0096","position":{"x":1800.0,"y":-400.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739233,"virtual_time_s":2066.782869,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":97,"wall_ts_ms":1789265739234,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0097","position":{"x":1800.0,"y":-400.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739234,"virtual_time_s":2072.782869,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":98,"wall_ts_ms":1789265739234,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0098","position":{"x":1800.0,"y":-400.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739234,"virtual_time_s":2078.782869,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":99,"wall_ts_ms":1789265739235,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0099","position":{"x":1800.0,"y":-400.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739235,"virtual_time_s":2084.782869,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":100,"wall_ts_ms":1789265739236,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0100","position":{"x":1800.0,"y":-400.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739236,"virtual_time_s":2090.782869,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":101,"wall_ts_ms":1789265739236,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0101","position":{"x":1800.0,"y":-400.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739236,"virtual_time_s":2096.782869,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":102,"wall_ts_ms":1789265739237,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0102","position":{"x":1800.0,"y":-400.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739237,"virtual_time_s":2102.782869,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":103,"wall_ts_ms":1789265739238,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0103","position":{"x":1800.0,"y":-400.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739238,"virtual_time_s":2108.782869,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":104,"wall_ts_ms":1789265739238,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0104","position":{"x":1900.0,"y":-900.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739238,"virtual_time_s":2215.763259,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":105,"wall_ts_ms":1789265739239,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0105","position":{"x":1900.0,"y":-900.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739239,"virtual_time_s":2221.763259,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":106,"wall_ts_ms":1789265739240,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0106","position":{"x":1900.0,"y":-900.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739240,"virtual_time_s":2227.763259,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":107,"wall_ts_ms":1789265739240,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0107","position":{"x":1900.0,"y":-900.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739240,"virtual_time_s":2233.763259,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":108,"wall_ts_ms":1789265739241,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0108","position":{"x":1900.0,"y":-900.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739241,"virtual_time_s":2239.763259,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":109,"wall_ts_ms":1789265739241,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0109","position":{"x":1900.0,"y":-900.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739241,"virtual_time_s":2245.763259,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":110,"wall_ts_ms":1789265739242,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0110","position":{"x":1900.0,"y":-900.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739242,"virtual_time_s":2251.763259,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":111,"wall_ts_ms":1789265739242,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0111","position":{"x":1900.0,"y":-900.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739242,"virtual_time_s":2257.763259,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":112,"wall_ts_ms":1789265739243,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0112","position":{"x":1900.0,"y":-900.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739243,"virtual_time_s":2263.763259,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":113,"wall_ts_ms":1789265739244,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0113","position":{"x":1900.0,"y":-900.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739244,"virtual_time_s":2269.763259,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":114,"wall_ts_ms":1789265739244,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0114","position":{"x":1900.0,"y":-900.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739244,"virtual_time_s":2275.763259,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":115,"wall_ts_ms":1789265739245,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0115","position":{"x":1900.0,"y":-900.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739245,"virtual_time_s":2281.763259,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":116,"wall_ts_ms":1789265739246,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0116","position":{"x":1900.0,"y":-900.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739246,"virtual_time_s":2287.763259,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":117,"wall_ts_ms":1789265739247,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0117","position":{"x":1900.0,"y":-900.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739247,"virtual_time_s":2293.763259,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":118,"wall_ts_ms":1789265739248,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0118","position":{"x":1400.0,"y":-1400.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739248,"virtual_time_s":2440.184615,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":119,"wall_ts_ms":1789265739249,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0119","position":{"x":1400.0,"y":-1400.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739249,"virtual_time_s":2446.184615,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":120,"wall_ts_ms":1789265739249,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0120","position":{"x":1400.0,"y":-1400.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739249,"virtual_time_s":2452.184615,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":121,"wall_ts_ms":1789265739250,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0121","position":{"x":1400.0,"y":-1400.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739250,"virtual_time_s":2458.184615,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":122,"wall_ts_ms":1789265739251,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0122","position":{"x":1400.0,"y":-1400.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739251,"virtual_time_s":2464.184615,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":123,"wall_ts_ms":1789265739251,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0123","position":{"x":1400.0,"y":-1400.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739251,"virtual_time_s":2470.184615,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":124,"wall_ts_ms":1789265739252,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0124","position":{"x":1400.0,"y":-1400.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739252,"virtual_time_s":2476.184615,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":125,"wall_ts_ms":1789265739253,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0125","position":{"x":1400.0,"y":-1400.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739252,"virtual_time_s":2482.184615,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":126,"wall_ts_ms":1789265739253,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0126","position":{"x":1400.0,"y":-1400.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739253,"virtual_time_s":2488.184615,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":127,"wall_ts_ms":1789265739254,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0127","position":{"x":1400.0,"y":-1400.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739254,"virtual_time_s":2494.184615,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":128,"wall_ts_ms":1789265739254,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0128","position":{"x":1400.0,"y":-1400.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739254,"virtual_time_s":2500.184615,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":129,"wall_ts_ms":1789265739255,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0129","position":{"x":1400.0,"y":-1400.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739255,"virtual_time_s":2506.184615,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":130,"wall_ts_ms":1789265739255,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0130","position":{"x":1400.0,"y":-1400.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739255,"virtual_time_s":2512.184615,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":131,"wall_ts_ms":1789265739256,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0131","position":{"x":1400.0,"y":-1400.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739256,"virtual_time_s":2518.184615,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":132,"wall_ts_ms":1789265739256,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0132","position":{"x":500.0,"y":-1800.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739256,"virtual_time_s":2720.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":133,"wall_ts_ms":1789265739257,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0133","position":{"x":500.0,"y":-1800.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739257,"virtual_time_s":2726.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":134,"wall_ts_ms":1789265739258,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0134","position":{"x":500.0,"y":-1800.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739258,"virtual_time_s":2732.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":135,"wall_ts_ms":1789265739258,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0135","position":{"x":500.0,"y":-1800.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739258,"virtual_time_s":2738.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":136,"wall_ts_ms":1789265739259,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0136","position":{"x":500.0,"y":-1800.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739259,"virtual_time_s":2744.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":137,"wall_ts_ms":1789265739260,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0137","position":{"x":500.0,"y":-1800.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739260,"virtual_time_s":2750.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":138,"wall_ts_ms":1789265739260,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0138","position":{"x":500.0,"y":-1800.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739260,"virtual_time_s":2756.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":139,"wall_ts_ms":1789265739261,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0139","position":{"x":500.0,"y":-1800.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739261,"virtual_time_s":2762.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":140,"wall_ts_ms":1789265739262,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0140","position":{"x":500.0,"y":-1800.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739262,"virtual_time_s":2768.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":141,"wall_ts_ms":1789265739262,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0141","position":{"x":500.0,"y":-1800.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739262,"virtual_time_s":2774.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":142,"wall_ts_ms":1789265739263,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0142","position":{"x":500.0,"y":-1800.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739263,"virtual_time_s":2780.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":143,"wall_ts_ms":1789265739263,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0143","position":{"x":500.0,"y":-1800.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739263,"virtual_time_s":2786.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":144,"wall_ts_ms":1789265739264,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0144","position":{"x":500.0,"y":-1800.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739264,"virtual_time_s":2792.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":145,"wall_ts_ms":1789265739264,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0145","position":{"x":500.0,"y":-1800.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739264,"virtual_time_s":2798.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":146,"wall_ts_ms":1789265739265,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0146","position":{"x":-400.0,"y":-1800.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739265,"virtual_time_s":2983.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":147,"wall_ts_ms":1789265739266,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0147","position":{"x":-400.0,"y":-1800.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739266,"virtual_time_s":2989.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":148,"wall_ts_ms":1789265739266,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0148","position":{"x":-400.0,"y":-1800.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739266,"virtual_time_s":2995.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":149,"wall_ts_ms":1789265739267,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0149","position":{"x":-400.0,"y":-1800.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739267,"virtual_time_s":3001.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":150,"wall_ts_ms":1789265739267,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0150","position":{"x":-400.0,"y":-1800.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739267,"virtual_time_s":3007.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":151,"wall_ts_ms":1789265739268,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0151","position":{"x":-400.0,"y":-1800.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739268,"virtual_time_s":3013.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":152,"wall_ts_ms":1789265739268,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0152","position":{"x":-400.0,"y":-1800.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739268,"virtual_time_s":3019.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":153,"wall_ts_ms":1789265739269,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0153","position":{"x":-400.0,"y":-1800.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739269,"virtual_time_s":3025.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":154,"wall_ts_ms":1789265739270,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0154","position":{"x":-400.0,"y":-1800.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739270,"virtual_time_s":3031.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":155,"wall_ts_ms":1789265739270,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0155","position":{"x":-400.0,"y":-1800.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739270,"virtual_time_s":3037.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":156,"wall_ts_ms":1789265739271,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0156","position":{"x":-400.0,"y":-1800.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739271,"virtual_time_s":3043.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":157,"wall_ts_ms":1789265739271,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0157","position":{"x":-400.0,"y":-1800.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739271,"virtual_time_s":3049.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":158,"wall_ts_ms":1789265739272,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0158","position":{"x":-400.0,"y":-1800.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739272,"virtual_time_s":3055.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":159,"wall_ts_ms":1789265739273,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0159","position":{"x":-400.0,"y":-1800.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739273,"virtual_time_s":3061.161771,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":160,"wall_ts_ms":1789265739273,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0160","position":{"x":-900.0,"y":-2100.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739273,"virtual_time_s":3182.780809,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":161,"wall_ts_ms":1789265739274,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0161","position":{"x":-900.0,"y":-2100.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739274,"virtual_time_s":3188.780809,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":162,"wall_ts_ms":1789265739275,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0162","position":{"x":-900.0,"y":-2100.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739275,"virtual_time_s":3194.780809,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":163,"wall_ts_ms":1789265739275,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0163","position":{"x":-900.0,"y":-2100.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739275,"virtual_time_s":3200.780809,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":164,"wall_ts_ms":1789265739276,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0164","position":{"x":-900.0,"y":-2100.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739276,"virtual_time_s":3206.780809,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":165,"wall_ts_ms":1789265739277,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0165","position":{"x":-900.0,"y":-2100.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739277,"virtual_time_s":3212.780809,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":166,"wall_ts_ms":1789265739277,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0166","position":{"x":-900.0,"y":-2100.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739277,"virtual_time_s":3218.780809,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":167,"wall_ts_ms":1789265739278,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0167","position":{"x":-900.0,"y":-2100.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739278,"virtual_time_s":3224.780809,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":168,"wall_ts_ms":1789265739279,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0168","position":{"x":-900.0,"y":-2100.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739279,"virtual_time_s":3230.780809,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":169,"wall_ts_ms":1789265739279,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0169","position":{"x":-900.0,"y":-2100.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739279,"virtual_time_s":3236.780809,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":170,"wall_ts_ms":1789265739280,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0170","position":{"x":-900.0,"y":-2100.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739280,"virtual_time_s":3242.780809,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":171,"wall_ts_ms":1789265739280,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0171","position":{"x":-900.0,"y":-2100.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739280,"virtual_time_s":3248.780809,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":172,"wall_ts_ms":1789265739281,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0172","position":{"x":-900.0,"y":-2100.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739281,"virtual_time_s":3254.780809,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":173,"wall_ts_ms":1789265739281,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0173","position":{"x":-900.0,"y":-2100.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739281,"virtual_time_s":3260.780809,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":174,"wall_ts_ms":1789265739283,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0174","position":{"x":-700.0,"y":-1200.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739283,"virtual_time_s":3450.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":175,"wall_ts_ms":1789265739284,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0175","position":{"x":-700.0,"y":-1200.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739284,"virtual_time_s":3456.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":176,"wall_ts_ms":1789265739285,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0176","position":{"x":-700.0,"y":-1200.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739285,"virtual_time_s":3462.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":177,"wall_ts_ms":1789265739286,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0177","position":{"x":-700.0,"y":-1200.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739286,"virtual_time_s":3468.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":178,"wall_ts_ms":1789265739286,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0178","position":{"x":-700.0,"y":-1200.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739286,"virtual_time_s":3474.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":179,"wall_ts_ms":1789265739287,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0179","position":{"x":-700.0,"y":-1200.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739287,"virtual_time_s":3480.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":180,"wall_ts_ms":1789265739288,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0180","position":{"x":-700.0,"y":-1200.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739288,"virtual_time_s":3486.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":181,"wall_ts_ms":1789265739289,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0181","position":{"x":-700.0,"y":-1200.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739288,"virtual_time_s":3492.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":182,"wall_ts_ms":1789265739289,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0182","position":{"x":-700.0,"y":-1200.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739289,"virtual_time_s":3498.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":183,"wall_ts_ms":1789265739290,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0183","position":{"x":-700.0,"y":-1200.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739290,"virtual_time_s":3504.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":184,"wall_ts_ms":1789265739290,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0184","position":{"x":-700.0,"y":-1200.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739290,"virtual_time_s":3510.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":185,"wall_ts_ms":1789265739291,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0185","position":{"x":-700.0,"y":-1200.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739291,"virtual_time_s":3516.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":186,"wall_ts_ms":1789265739292,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0186","position":{"x":-700.0,"y":-1200.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739292,"virtual_time_s":3522.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":187,"wall_ts_ms":1789265739292,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0187","position":{"x":-700.0,"y":-1200.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739292,"virtual_time_s":3528.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":188,"wall_ts_ms":1789265739293,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0188","position":{"x":-700.0,"y":-700.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739293,"virtual_time_s":3633.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":189,"wall_ts_ms":1789265739303,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0189","position":{"x":-700.0,"y":-700.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739303,"virtual_time_s":3639.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":190,"wall_ts_ms":1789265739305,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0190","position":{"x":-700.0,"y":-700.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739305,"virtual_time_s":3645.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":191,"wall_ts_ms":1789265739306,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0191","position":{"x":-700.0,"y":-700.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739306,"virtual_time_s":3651.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":192,"wall_ts_ms":1789265739306,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0192","position":{"x":-700.0,"y":-700.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739306,"virtual_time_s":3657.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":193,"wall_ts_ms":1789265739307,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0193","position":{"x":-700.0,"y":-700.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739307,"virtual_time_s":3663.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":194,"wall_ts_ms":1789265739308,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0194","position":{"x":-700.0,"y":-700.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739308,"virtual_time_s":3669.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":195,"wall_ts_ms":1789265739309,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0195","position":{"x":-700.0,"y":-700.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739309,"virtual_time_s":3675.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":196,"wall_ts_ms":1789265739310,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0196","position":{"x":-700.0,"y":-700.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739310,"virtual_time_s":3681.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":197,"wall_ts_ms":1789265739310,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0197","position":{"x":-700.0,"y":-700.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739310,"virtual_time_s":3687.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":198,"wall_ts_ms":1789265739311,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0198","position":{"x":-700.0,"y":-700.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739311,"virtual_time_s":3693.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":199,"wall_ts_ms":1789265739312,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0199","position":{"x":-700.0,"y":-700.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739312,"virtual_time_s":3699.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":200,"wall_ts_ms":1789265739313,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0200","position":{"x":-700.0,"y":-700.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739313,"virtual_time_s":3705.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":201,"wall_ts_ms":1789265739313,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0201","position":{"x":-700.0,"y":-700.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739313,"virtual_time_s":3711.171698,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":202,"wall_ts_ms":1789265739314,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0202","position":{"x":-800.0,"y":-200.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739314,"virtual_time_s":3818.152088,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":203,"wall_ts_ms":1789265739315,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0203","position":{"x":-800.0,"y":-200.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739315,"virtual_time_s":3824.152088,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":204,"wall_ts_ms":1789265739316,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0204","position":{"x":-800.0,"y":-200.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739316,"virtual_time_s":3830.152088,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":205,"wall_ts_ms":1789265739316,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0205","position":{"x":-800.0,"y":-200.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739316,"virtual_time_s":3836.152088,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":206,"wall_ts_ms":1789265739317,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0206","position":{"x":-800.0,"y":-200.0},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739317,"virtual_time_s":3842.152088,"measure_result":"direction","svd_deg":126.11}}
|
||||||
|
{"event":"action","seq":207,"wall_ts_ms":1789265739355,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0207","position":{"x":-800.0,"y":-200.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739355,"virtual_time_s":3848.152088,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":208,"wall_ts_ms":1789265739356,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0208","position":{"x":-800.0,"y":-200.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739356,"virtual_time_s":3854.152088,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":209,"wall_ts_ms":1789265739356,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0209","position":{"x":-800.0,"y":-200.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739356,"virtual_time_s":3860.152088,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":210,"wall_ts_ms":1789265739357,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0210","position":{"x":-800.0,"y":-200.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739357,"virtual_time_s":3866.152088,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":211,"wall_ts_ms":1789265739358,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0211","position":{"x":-800.0,"y":-200.0},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739358,"virtual_time_s":3872.152088,"measure_result":"direction","svd_deg":108.11}}
|
||||||
|
{"event":"action","seq":212,"wall_ts_ms":1789265739392,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0212","position":{"x":-800.0,"y":-200.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739392,"virtual_time_s":3878.152088,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":213,"wall_ts_ms":1789265739393,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0213","position":{"x":-800.0,"y":-200.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739393,"virtual_time_s":3884.152088,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":214,"wall_ts_ms":1789265739394,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0214","position":{"x":-800.0,"y":-200.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739394,"virtual_time_s":3890.152088,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":215,"wall_ts_ms":1789265739394,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0215","position":{"x":-800.0,"y":-200.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739394,"virtual_time_s":3896.152088,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":216,"wall_ts_ms":1789265739503,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0216","position":{"x":-947.4060451871933,"y":109.11837968521047},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739503,"virtual_time_s":3970.645216,"measure_result":"direction","svd_deg":131.32}}
|
||||||
|
{"event":"action","seq":217,"wall_ts_ms":1789265739561,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0217","position":{"x":-1324.9239456154519,"y":558.3476201396235},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739561,"virtual_time_s":4093.003927,"measure_result":"direction","svd_deg":131.0}}
|
||||||
|
{"event":"action","seq":218,"wall_ts_ms":1789265739594,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0218","position":{"x":-1432.2923947371212,"y":690.0535132542623},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739594,"virtual_time_s":4131.98888,"measure_result":"direction","svd_deg":136.57}}
|
||||||
|
{"event":"action","seq":219,"wall_ts_ms":1789265739609,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0219","position":{"x":-1483.0245877461791,"y":738.3058311207313},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739609,"virtual_time_s":4150.991796,"measure_result":"direction","svd_deg":135.43}}
|
||||||
|
{"event":"action","seq":220,"wall_ts_ms":1789265739622,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0220","position":{"x":-1494.2794165389562,"y":749.8626130220727},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739622,"virtual_time_s":4159.218128,"measure_result":"direction","svd_deg":137.48}}
|
||||||
|
{"event":"action","seq":221,"wall_ts_ms":1789265739623,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0221","position":{"x":-1505.3219950372888,"y":760.3331531575229},"channel":5},"response":{"accepted":true,"real_timestamp_ms":1789265739623,"virtual_time_s":4167.261618,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":222,"wall_ts_ms":1789265739805,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0222","position":{"x":-1408.4825659904257,"y":512.8845928212788},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739805,"virtual_time_s":4226.4062,"measure_result":"direction","svd_deg":63.41}}
|
||||||
|
{"event":"action","seq":223,"wall_ts_ms":1789265739822,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0223","position":{"x":-1195.7660646685601,"y":953.7522119734411},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739822,"virtual_time_s":4329.306673,"measure_result":"direction","svd_deg":51.15}}
|
||||||
|
{"event":"action","seq":224,"wall_ts_ms":1789265739830,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0224","position":{"x":-1189.5871642775382,"y":964.1176386186069},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739830,"virtual_time_s":4336.720143,"measure_result":"near"}}
|
||||||
|
{"event":"action","seq":225,"wall_ts_ms":1789265739831,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0225","position":{"x":-1188.4182050448148,"y":963.2096685709439},"channel":12},"response":{"accepted":true,"real_timestamp_ms":1789265739831,"virtual_time_s":4342.016175,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":226,"wall_ts_ms":1789265739832,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0226","position":{"x":-1200.0,"y":700.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739832,"virtual_time_s":4400.709046,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":227,"wall_ts_ms":1789265739833,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0227","position":{"x":-1200.0,"y":700.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739833,"virtual_time_s":4406.709046,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":228,"wall_ts_ms":1789265739834,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0228","position":{"x":-1200.0,"y":700.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739834,"virtual_time_s":4412.709046,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":229,"wall_ts_ms":1789265739834,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0229","position":{"x":-1200.0,"y":700.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739834,"virtual_time_s":4418.709046,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":230,"wall_ts_ms":1789265739835,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0230","position":{"x":-1200.0,"y":700.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739835,"virtual_time_s":4424.709046,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":231,"wall_ts_ms":1789265739836,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0231","position":{"x":-1200.0,"y":700.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739836,"virtual_time_s":4430.709046,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":232,"wall_ts_ms":1789265739836,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0232","position":{"x":-1200.0,"y":700.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739836,"virtual_time_s":4436.709046,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":233,"wall_ts_ms":1789265739837,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0233","position":{"x":-1200.0,"y":700.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739837,"virtual_time_s":4442.709046,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":234,"wall_ts_ms":1789265739838,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0234","position":{"x":-1200.0,"y":700.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739838,"virtual_time_s":4448.709046,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":235,"wall_ts_ms":1789265739838,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0235","position":{"x":-1200.0,"y":700.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739838,"virtual_time_s":4454.709046,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":236,"wall_ts_ms":1789265739839,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0236","position":{"x":-1200.0,"y":700.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739839,"virtual_time_s":4460.709046,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":237,"wall_ts_ms":1789265739840,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0237","position":{"x":-1200.0,"y":700.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739840,"virtual_time_s":4466.709046,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":238,"wall_ts_ms":1789265739840,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0238","position":{"x":-1800.0,"y":400.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739840,"virtual_time_s":4605.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":239,"wall_ts_ms":1789265739841,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0239","position":{"x":-1800.0,"y":400.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739841,"virtual_time_s":4611.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":240,"wall_ts_ms":1789265739842,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0240","position":{"x":-1800.0,"y":400.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739842,"virtual_time_s":4617.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":241,"wall_ts_ms":1789265739842,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0241","position":{"x":-1800.0,"y":400.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739842,"virtual_time_s":4623.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":242,"wall_ts_ms":1789265739843,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0242","position":{"x":-1800.0,"y":400.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739843,"virtual_time_s":4629.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":243,"wall_ts_ms":1789265739843,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0243","position":{"x":-1800.0,"y":400.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739843,"virtual_time_s":4635.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":244,"wall_ts_ms":1789265739844,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0244","position":{"x":-1800.0,"y":400.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739844,"virtual_time_s":4641.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":245,"wall_ts_ms":1789265739845,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0245","position":{"x":-1800.0,"y":400.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739845,"virtual_time_s":4647.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":246,"wall_ts_ms":1789265739845,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0246","position":{"x":-1800.0,"y":400.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739845,"virtual_time_s":4653.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":247,"wall_ts_ms":1789265739846,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0247","position":{"x":-1800.0,"y":400.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739846,"virtual_time_s":4659.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":248,"wall_ts_ms":1789265739846,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0248","position":{"x":-1800.0,"y":400.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739846,"virtual_time_s":4665.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":249,"wall_ts_ms":1789265739848,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0249","position":{"x":-1800.0,"y":400.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739848,"virtual_time_s":4671.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":250,"wall_ts_ms":1789265739849,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0250","position":{"x":-1800.0,"y":-300.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739848,"virtual_time_s":4816.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":251,"wall_ts_ms":1789265739849,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0251","position":{"x":-1800.0,"y":-300.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739849,"virtual_time_s":4822.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":252,"wall_ts_ms":1789265739850,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0252","position":{"x":-1800.0,"y":-300.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739850,"virtual_time_s":4828.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":253,"wall_ts_ms":1789265739850,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0253","position":{"x":-1800.0,"y":-300.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739850,"virtual_time_s":4834.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":254,"wall_ts_ms":1789265739851,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0254","position":{"x":-1800.0,"y":-300.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739851,"virtual_time_s":4840.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":255,"wall_ts_ms":1789265739851,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0255","position":{"x":-1800.0,"y":-300.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739851,"virtual_time_s":4846.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":256,"wall_ts_ms":1789265739852,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0256","position":{"x":-1800.0,"y":-300.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739852,"virtual_time_s":4852.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":257,"wall_ts_ms":1789265739852,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0257","position":{"x":-1800.0,"y":-300.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739852,"virtual_time_s":4858.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":258,"wall_ts_ms":1789265739853,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0258","position":{"x":-1800.0,"y":-300.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739853,"virtual_time_s":4864.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":259,"wall_ts_ms":1789265739854,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0259","position":{"x":-1800.0,"y":-300.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739854,"virtual_time_s":4870.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":260,"wall_ts_ms":1789265739854,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0260","position":{"x":-1800.0,"y":-300.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739854,"virtual_time_s":4876.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":261,"wall_ts_ms":1789265739855,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0261","position":{"x":-1800.0,"y":-300.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739855,"virtual_time_s":4882.873125,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":262,"wall_ts_ms":1789265739855,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0262","position":{"x":-1700.0,"y":-500.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739855,"virtual_time_s":4932.594485,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":263,"wall_ts_ms":1789265739856,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0263","position":{"x":-1700.0,"y":-500.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739856,"virtual_time_s":4938.594485,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":264,"wall_ts_ms":1789265739856,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0264","position":{"x":-1700.0,"y":-500.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739856,"virtual_time_s":4944.594485,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":265,"wall_ts_ms":1789265739857,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0265","position":{"x":-1700.0,"y":-500.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739857,"virtual_time_s":4950.594485,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":266,"wall_ts_ms":1789265739858,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0266","position":{"x":-1700.0,"y":-500.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739858,"virtual_time_s":4956.594485,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":267,"wall_ts_ms":1789265739858,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0267","position":{"x":-1700.0,"y":-500.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739858,"virtual_time_s":4962.594485,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":268,"wall_ts_ms":1789265739859,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0268","position":{"x":-1700.0,"y":-500.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739859,"virtual_time_s":4968.594485,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":269,"wall_ts_ms":1789265739859,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0269","position":{"x":-1700.0,"y":-500.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739859,"virtual_time_s":4974.594485,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":270,"wall_ts_ms":1789265739860,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0270","position":{"x":-1700.0,"y":-500.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739860,"virtual_time_s":4980.594485,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":271,"wall_ts_ms":1789265739860,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0271","position":{"x":-1700.0,"y":-500.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739860,"virtual_time_s":4986.594485,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":272,"wall_ts_ms":1789265739861,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0272","position":{"x":-1700.0,"y":-500.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739861,"virtual_time_s":4992.594485,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":273,"wall_ts_ms":1789265739861,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0273","position":{"x":-1700.0,"y":-500.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739861,"virtual_time_s":4998.594485,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":274,"wall_ts_ms":1789265739862,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0274","position":{"x":-1500.0,"y":-1300.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739862,"virtual_time_s":5168.51871,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":275,"wall_ts_ms":1789265739863,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0275","position":{"x":-1500.0,"y":-1300.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739863,"virtual_time_s":5174.51871,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":276,"wall_ts_ms":1789265739863,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0276","position":{"x":-1500.0,"y":-1300.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739863,"virtual_time_s":5180.51871,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":277,"wall_ts_ms":1789265739864,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0277","position":{"x":-1500.0,"y":-1300.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739864,"virtual_time_s":5186.51871,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":278,"wall_ts_ms":1789265739864,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0278","position":{"x":-1500.0,"y":-1300.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739864,"virtual_time_s":5192.51871,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":279,"wall_ts_ms":1789265739865,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0279","position":{"x":-1500.0,"y":-1300.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739865,"virtual_time_s":5198.51871,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":280,"wall_ts_ms":1789265739865,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0280","position":{"x":-1500.0,"y":-1300.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739865,"virtual_time_s":5204.51871,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":281,"wall_ts_ms":1789265739866,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0281","position":{"x":-1500.0,"y":-1300.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739866,"virtual_time_s":5210.51871,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":282,"wall_ts_ms":1789265739867,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0282","position":{"x":-1500.0,"y":-1300.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739867,"virtual_time_s":5216.51871,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":283,"wall_ts_ms":1789265739867,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0283","position":{"x":-1500.0,"y":-1300.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739867,"virtual_time_s":5222.51871,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":284,"wall_ts_ms":1789265739868,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0284","position":{"x":-1500.0,"y":-1300.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739868,"virtual_time_s":5228.51871,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":285,"wall_ts_ms":1789265739868,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0285","position":{"x":-1500.0,"y":-1300.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739868,"virtual_time_s":5234.51871,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":286,"wall_ts_ms":1789265739869,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0286","position":{"x":-2500.0,"y":500.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739869,"virtual_time_s":5651.343916,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":287,"wall_ts_ms":1789265739869,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0287","position":{"x":-2500.0,"y":500.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739869,"virtual_time_s":5657.343916,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":288,"wall_ts_ms":1789265739870,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0288","position":{"x":-2500.0,"y":500.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739870,"virtual_time_s":5663.343916,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":289,"wall_ts_ms":1789265739871,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0289","position":{"x":-2500.0,"y":500.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739870,"virtual_time_s":5669.343916,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":290,"wall_ts_ms":1789265739871,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0290","position":{"x":-2500.0,"y":500.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739871,"virtual_time_s":5675.343916,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":291,"wall_ts_ms":1789265739872,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0291","position":{"x":-2500.0,"y":500.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739872,"virtual_time_s":5681.343916,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":292,"wall_ts_ms":1789265739872,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0292","position":{"x":-2500.0,"y":500.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739872,"virtual_time_s":5687.343916,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":293,"wall_ts_ms":1789265739873,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0293","position":{"x":-2500.0,"y":500.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739873,"virtual_time_s":5693.343916,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":294,"wall_ts_ms":1789265739873,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0294","position":{"x":-2500.0,"y":500.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739873,"virtual_time_s":5699.343916,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":295,"wall_ts_ms":1789265739874,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0295","position":{"x":-2500.0,"y":500.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739874,"virtual_time_s":5705.343916,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":296,"wall_ts_ms":1789265739874,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0296","position":{"x":-2500.0,"y":500.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739874,"virtual_time_s":5711.343916,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":297,"wall_ts_ms":1789265739875,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0297","position":{"x":-2500.0,"y":500.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739875,"virtual_time_s":5717.343916,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":298,"wall_ts_ms":1789265739876,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0298","position":{"x":-1300.0,"y":1500.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739876,"virtual_time_s":6034.753903,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":299,"wall_ts_ms":1789265739876,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0299","position":{"x":-1300.0,"y":1500.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739876,"virtual_time_s":6040.753903,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":300,"wall_ts_ms":1789265739877,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0300","position":{"x":-1300.0,"y":1500.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739877,"virtual_time_s":6046.753903,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":301,"wall_ts_ms":1789265739877,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0301","position":{"x":-1300.0,"y":1500.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739877,"virtual_time_s":6052.753903,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":302,"wall_ts_ms":1789265739878,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0302","position":{"x":-1300.0,"y":1500.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739878,"virtual_time_s":6058.753903,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":303,"wall_ts_ms":1789265739878,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0303","position":{"x":-1300.0,"y":1500.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739878,"virtual_time_s":6064.753903,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":304,"wall_ts_ms":1789265739879,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0304","position":{"x":-1300.0,"y":1500.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739879,"virtual_time_s":6070.753903,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":305,"wall_ts_ms":1789265739879,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0305","position":{"x":-1300.0,"y":1500.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739879,"virtual_time_s":6076.753903,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":306,"wall_ts_ms":1789265739880,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0306","position":{"x":-1300.0,"y":1500.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739880,"virtual_time_s":6082.753903,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":307,"wall_ts_ms":1789265739880,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0307","position":{"x":-1300.0,"y":1500.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739880,"virtual_time_s":6088.753903,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":308,"wall_ts_ms":1789265739881,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0308","position":{"x":-1300.0,"y":1500.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739881,"virtual_time_s":6094.753903,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":309,"wall_ts_ms":1789265739882,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0309","position":{"x":-1300.0,"y":1500.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739881,"virtual_time_s":6100.753903,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":310,"wall_ts_ms":1789265739882,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0310","position":{"x":-400.0,"y":1800.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265739882,"virtual_time_s":6295.490563,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":311,"wall_ts_ms":1789265739883,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0311","position":{"x":-400.0,"y":1800.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265739883,"virtual_time_s":6301.490563,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":312,"wall_ts_ms":1789265739883,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0312","position":{"x":-400.0,"y":1800.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265739883,"virtual_time_s":6307.490563,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":313,"wall_ts_ms":1789265739884,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0313","position":{"x":-400.0,"y":1800.0},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265739884,"virtual_time_s":6313.490563,"measure_result":"direction","svd_deg":354.21}}
|
||||||
|
{"event":"action","seq":314,"wall_ts_ms":1789265739913,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0314","position":{"x":-400.0,"y":1800.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265739913,"virtual_time_s":6319.490563,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":315,"wall_ts_ms":1789265739914,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0315","position":{"x":-400.0,"y":1800.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265739914,"virtual_time_s":6325.490563,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":316,"wall_ts_ms":1789265739915,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0316","position":{"x":-400.0,"y":1800.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265739915,"virtual_time_s":6331.490563,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":317,"wall_ts_ms":1789265739915,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0317","position":{"x":-400.0,"y":1800.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265739915,"virtual_time_s":6337.490563,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":318,"wall_ts_ms":1789265739916,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0318","position":{"x":-400.0,"y":1800.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265739916,"virtual_time_s":6343.490563,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":319,"wall_ts_ms":1789265739916,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0319","position":{"x":-400.0,"y":1800.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265739916,"virtual_time_s":6349.490563,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":320,"wall_ts_ms":1789265739917,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0320","position":{"x":-400.0,"y":1800.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265739917,"virtual_time_s":6355.490563,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":321,"wall_ts_ms":1789265739918,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0321","position":{"x":-400.0,"y":1800.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265739917,"virtual_time_s":6361.490563,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":322,"wall_ts_ms":1789265740014,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0322","position":{"x":-24.55089621140732,"y":1727.78050764454},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265740014,"virtual_time_s":6443.956944,"measure_result":"direction","svd_deg":7.73}}
|
||||||
|
{"event":"action","seq":323,"wall_ts_ms":1789265740060,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0323","position":{"x":101.49926410957077,"y":1747.4479135884048},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265740060,"virtual_time_s":6474.471998,"measure_result":"near"}}
|
||||||
|
{"event":"action","seq":324,"wall_ts_ms":1789265740064,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0324","position":{"x":101.54406236532077,"y":1747.1545857629853},"channel":4},"response":{"accepted":true,"real_timestamp_ms":1789265740064,"virtual_time_s":6479.531344,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":325,"wall_ts_ms":1789265740066,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0325","position":{"x":400.0,"y":1800.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740066,"virtual_time_s":6546.151006,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":326,"wall_ts_ms":1789265740068,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0326","position":{"x":400.0,"y":1800.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740068,"virtual_time_s":6552.151006,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":327,"wall_ts_ms":1789265740070,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0327","position":{"x":400.0,"y":1800.0},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265740070,"virtual_time_s":6558.151006,"measure_result":"direction","svd_deg":191.2}}
|
||||||
|
{"event":"action","seq":328,"wall_ts_ms":1789265740116,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0328","position":{"x":400.0,"y":1800.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740116,"virtual_time_s":6564.151006,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":329,"wall_ts_ms":1789265740118,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0329","position":{"x":400.0,"y":1800.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740118,"virtual_time_s":6570.151006,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":330,"wall_ts_ms":1789265740119,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0330","position":{"x":400.0,"y":1800.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740119,"virtual_time_s":6576.151006,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":331,"wall_ts_ms":1789265740120,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0331","position":{"x":400.0,"y":1800.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740120,"virtual_time_s":6582.151006,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":332,"wall_ts_ms":1789265740120,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0332","position":{"x":400.0,"y":1800.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740120,"virtual_time_s":6588.151006,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":333,"wall_ts_ms":1789265740121,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0333","position":{"x":400.0,"y":1800.0},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740121,"virtual_time_s":6594.151006,"measure_result":"direction","svd_deg":272.2}}
|
||||||
|
{"event":"action","seq":334,"wall_ts_ms":1789265740153,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0334","position":{"x":400.0,"y":1800.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740153,"virtual_time_s":6600.151006,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":335,"wall_ts_ms":1789265740154,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0335","position":{"x":400.0,"y":1800.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740154,"virtual_time_s":6606.151006,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":336,"wall_ts_ms":1789265740313,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0336","position":{"x":-24.20475655272145,"y":1636.8980627348978},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265740313,"virtual_time_s":6703.046972,"measure_result":"direction","svd_deg":160.88}}
|
||||||
|
{"event":"action","seq":337,"wall_ts_ms":1789265740330,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0337","position":{"x":-158.52431169665903,"y":1687.3397389277611},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265740330,"virtual_time_s":6736.74269,"measure_result":"direction","svd_deg":192.73}}
|
||||||
|
{"event":"action","seq":338,"wall_ts_ms":1789265740332,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0338","position":{"x":-165.6025782014923,"y":1685.833818291656},"channel":6},"response":{"accepted":true,"real_timestamp_ms":1789265740332,"virtual_time_s":6743.190028,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":339,"wall_ts_ms":1789265740480,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0339","position":{"x":171.91074610145796,"y":1285.0122857297256},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740480,"virtual_time_s":6853.989483,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":340,"wall_ts_ms":1789265740610,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0340","position":{"x":429.14297023213675,"y":1391.5613616440485},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740610,"virtual_time_s":6914.674714,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":341,"wall_ts_ms":1789265740744,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0341","position":{"x":686.3751943628156,"y":1285.0122857297256},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740744,"virtual_time_s":6975.359945,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":342,"wall_ts_ms":1789265740884,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0342","position":{"x":429.1429702321368,"y":1755.3426616890501},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740884,"virtual_time_s":7087.575444,"measure_result":"direction","svd_deg":265.21}}
|
||||||
|
{"event":"action","seq":343,"wall_ts_ms":1789265740908,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0343","position":{"x":409.83408878169837,"y":1586.197737192631},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740908,"virtual_time_s":7126.624138,"measure_result":"direction","svd_deg":272.13}}
|
||||||
|
{"event":"action","seq":344,"wall_ts_ms":1789265740925,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0344","position":{"x":411.1387584130592,"y":1552.2577508333961},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740925,"virtual_time_s":7138.417149,"measure_result":"near"}}
|
||||||
|
{"event":"action","seq":345,"wall_ts_ms":1789265740928,"method":"POST","path":"/clear","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0345","position":{"x":411.13875841306526,"y":1552.2577508333966},"channel":15},"response":{"accepted":true,"real_timestamp_ms":1789265740928,"virtual_time_s":7143.417149,"clear_result":"success"}}
|
||||||
|
{"event":"action","seq":346,"wall_ts_ms":1789265740929,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0346","position":{"x":600.0,"y":1900.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740929,"virtual_time_s":7228.560877,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":347,"wall_ts_ms":1789265740930,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0347","position":{"x":600.0,"y":1900.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740930,"virtual_time_s":7234.560877,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":348,"wall_ts_ms":1789265740931,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0348","position":{"x":600.0,"y":1900.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740931,"virtual_time_s":7240.560877,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":349,"wall_ts_ms":1789265740932,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0349","position":{"x":600.0,"y":1900.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740932,"virtual_time_s":7246.560877,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":350,"wall_ts_ms":1789265740934,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0350","position":{"x":600.0,"y":1900.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740934,"virtual_time_s":7252.560877,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":351,"wall_ts_ms":1789265740935,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0351","position":{"x":600.0,"y":1900.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740935,"virtual_time_s":7258.560877,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":352,"wall_ts_ms":1789265740936,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0352","position":{"x":600.0,"y":1900.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740936,"virtual_time_s":7264.560877,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":353,"wall_ts_ms":1789265740937,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0353","position":{"x":600.0,"y":1900.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740937,"virtual_time_s":7270.560877,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":354,"wall_ts_ms":1789265740938,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0354","position":{"x":600.0,"y":1900.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740938,"virtual_time_s":7276.560877,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":355,"wall_ts_ms":1789265740939,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0355","position":{"x":800.0,"y":1200.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740939,"virtual_time_s":7427.163075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":356,"wall_ts_ms":1789265740940,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0356","position":{"x":800.0,"y":1200.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740940,"virtual_time_s":7433.163075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":357,"wall_ts_ms":1789265740942,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0357","position":{"x":800.0,"y":1200.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740942,"virtual_time_s":7439.163075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":358,"wall_ts_ms":1789265740943,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0358","position":{"x":800.0,"y":1200.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740943,"virtual_time_s":7445.163075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":359,"wall_ts_ms":1789265740944,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0359","position":{"x":800.0,"y":1200.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740944,"virtual_time_s":7451.163075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":360,"wall_ts_ms":1789265740946,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0360","position":{"x":800.0,"y":1200.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740946,"virtual_time_s":7457.163075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":361,"wall_ts_ms":1789265740947,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0361","position":{"x":800.0,"y":1200.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740947,"virtual_time_s":7463.163075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":362,"wall_ts_ms":1789265740949,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0362","position":{"x":800.0,"y":1200.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740949,"virtual_time_s":7469.163075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":363,"wall_ts_ms":1789265740950,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0363","position":{"x":800.0,"y":1200.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740950,"virtual_time_s":7475.163075,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":364,"wall_ts_ms":1789265740950,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0364","position":{"x":700.0,"y":700.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740950,"virtual_time_s":7582.143465,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":365,"wall_ts_ms":1789265740951,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0365","position":{"x":700.0,"y":700.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740951,"virtual_time_s":7588.143465,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":366,"wall_ts_ms":1789265740952,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0366","position":{"x":700.0,"y":700.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740952,"virtual_time_s":7594.143465,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":367,"wall_ts_ms":1789265740953,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0367","position":{"x":700.0,"y":700.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740953,"virtual_time_s":7600.143465,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":368,"wall_ts_ms":1789265740954,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0368","position":{"x":700.0,"y":700.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740954,"virtual_time_s":7606.143465,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":369,"wall_ts_ms":1789265740955,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0369","position":{"x":700.0,"y":700.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740955,"virtual_time_s":7612.143465,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":370,"wall_ts_ms":1789265740956,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0370","position":{"x":700.0,"y":700.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740956,"virtual_time_s":7618.143465,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":371,"wall_ts_ms":1789265740957,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0371","position":{"x":700.0,"y":700.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740957,"virtual_time_s":7624.143465,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":372,"wall_ts_ms":1789265740957,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0372","position":{"x":700.0,"y":700.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740957,"virtual_time_s":7630.143465,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":373,"wall_ts_ms":1789265740958,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0373","position":{"x":800.0,"y":200.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740958,"virtual_time_s":7737.123855,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":374,"wall_ts_ms":1789265740959,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0374","position":{"x":800.0,"y":200.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740959,"virtual_time_s":7743.123855,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":375,"wall_ts_ms":1789265740959,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0375","position":{"x":800.0,"y":200.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740959,"virtual_time_s":7749.123855,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":376,"wall_ts_ms":1789265740960,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0376","position":{"x":800.0,"y":200.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740960,"virtual_time_s":7755.123855,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":377,"wall_ts_ms":1789265740961,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0377","position":{"x":800.0,"y":200.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740961,"virtual_time_s":7761.123855,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":378,"wall_ts_ms":1789265740961,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0378","position":{"x":800.0,"y":200.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740961,"virtual_time_s":7767.123855,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":379,"wall_ts_ms":1789265740962,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0379","position":{"x":800.0,"y":200.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740962,"virtual_time_s":7773.123855,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":380,"wall_ts_ms":1789265740963,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0380","position":{"x":800.0,"y":200.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740963,"virtual_time_s":7779.123855,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":381,"wall_ts_ms":1789265740963,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0381","position":{"x":800.0,"y":200.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740963,"virtual_time_s":7785.123855,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":382,"wall_ts_ms":1789265740964,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0382","position":{"x":1800.0,"y":300.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740964,"virtual_time_s":7991.121367,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":383,"wall_ts_ms":1789265740965,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0383","position":{"x":1800.0,"y":300.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740965,"virtual_time_s":7997.121367,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":384,"wall_ts_ms":1789265740966,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0384","position":{"x":1800.0,"y":300.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740966,"virtual_time_s":8003.121367,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":385,"wall_ts_ms":1789265740969,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0385","position":{"x":1800.0,"y":300.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740969,"virtual_time_s":8009.121367,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":386,"wall_ts_ms":1789265740970,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0386","position":{"x":1800.0,"y":300.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740970,"virtual_time_s":8015.121367,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":387,"wall_ts_ms":1789265740971,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0387","position":{"x":1800.0,"y":300.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740971,"virtual_time_s":8021.121367,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":388,"wall_ts_ms":1789265740972,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0388","position":{"x":1800.0,"y":300.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740972,"virtual_time_s":8027.121367,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":389,"wall_ts_ms":1789265740972,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0389","position":{"x":1800.0,"y":300.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740972,"virtual_time_s":8033.121367,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":390,"wall_ts_ms":1789265740973,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0390","position":{"x":1800.0,"y":300.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740973,"virtual_time_s":8039.121367,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":391,"wall_ts_ms":1789265740974,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0391","position":{"x":1300.0,"y":1100.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740974,"virtual_time_s":8232.80099,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":392,"wall_ts_ms":1789265740975,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0392","position":{"x":1300.0,"y":1100.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740975,"virtual_time_s":8238.80099,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":393,"wall_ts_ms":1789265740975,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0393","position":{"x":1300.0,"y":1100.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740975,"virtual_time_s":8244.80099,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":394,"wall_ts_ms":1789265740976,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0394","position":{"x":1300.0,"y":1100.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740976,"virtual_time_s":8250.80099,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":395,"wall_ts_ms":1789265740976,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0395","position":{"x":1300.0,"y":1100.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740976,"virtual_time_s":8256.80099,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":396,"wall_ts_ms":1789265740977,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0396","position":{"x":1300.0,"y":1100.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740977,"virtual_time_s":8262.80099,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":397,"wall_ts_ms":1789265740978,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0397","position":{"x":1300.0,"y":1100.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740978,"virtual_time_s":8268.80099,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":398,"wall_ts_ms":1789265740979,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0398","position":{"x":1300.0,"y":1100.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740979,"virtual_time_s":8274.80099,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":399,"wall_ts_ms":1789265740981,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0399","position":{"x":1300.0,"y":1100.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740981,"virtual_time_s":8280.80099,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":400,"wall_ts_ms":1789265740983,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0400","position":{"x":1500.0,"y":1300.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740983,"virtual_time_s":8342.369532,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":401,"wall_ts_ms":1789265740985,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0401","position":{"x":1500.0,"y":1300.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740985,"virtual_time_s":8348.369532,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":402,"wall_ts_ms":1789265740986,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0402","position":{"x":1500.0,"y":1300.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740986,"virtual_time_s":8354.369532,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":403,"wall_ts_ms":1789265740987,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0403","position":{"x":1500.0,"y":1300.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740987,"virtual_time_s":8360.369532,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":404,"wall_ts_ms":1789265740988,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0404","position":{"x":1500.0,"y":1300.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740987,"virtual_time_s":8366.369532,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":405,"wall_ts_ms":1789265740988,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0405","position":{"x":1500.0,"y":1300.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740988,"virtual_time_s":8372.369532,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":406,"wall_ts_ms":1789265740989,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0406","position":{"x":1500.0,"y":1300.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740989,"virtual_time_s":8378.369532,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":407,"wall_ts_ms":1789265740990,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0407","position":{"x":1500.0,"y":1300.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740990,"virtual_time_s":8384.369532,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":408,"wall_ts_ms":1789265740990,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0408","position":{"x":1500.0,"y":1300.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740990,"virtual_time_s":8390.369532,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":409,"wall_ts_ms":1789265740991,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0409","position":{"x":-200.0,"y":900.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265740991,"virtual_time_s":8744.654516,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":410,"wall_ts_ms":1789265740992,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0410","position":{"x":-200.0,"y":900.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740992,"virtual_time_s":8750.654516,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":411,"wall_ts_ms":1789265740993,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0411","position":{"x":-200.0,"y":900.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740993,"virtual_time_s":8756.654516,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":412,"wall_ts_ms":1789265740994,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0412","position":{"x":-200.0,"y":900.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265740994,"virtual_time_s":8762.654516,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":413,"wall_ts_ms":1789265740994,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0413","position":{"x":-200.0,"y":900.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265740994,"virtual_time_s":8768.654516,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":414,"wall_ts_ms":1789265740995,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0414","position":{"x":-200.0,"y":900.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265740995,"virtual_time_s":8774.654516,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":415,"wall_ts_ms":1789265740996,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0415","position":{"x":-200.0,"y":900.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265740996,"virtual_time_s":8780.654516,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":416,"wall_ts_ms":1789265740996,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0416","position":{"x":-200.0,"y":900.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265740996,"virtual_time_s":8786.654516,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":417,"wall_ts_ms":1789265740997,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0417","position":{"x":-200.0,"y":900.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740997,"virtual_time_s":8792.654516,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":418,"wall_ts_ms":1789265740998,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0418","position":{"x":-500.0,"y":700.0},"channel":17},"response":{"accepted":true,"real_timestamp_ms":1789265740998,"virtual_time_s":8869.765542,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":419,"wall_ts_ms":1789265740998,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0419","position":{"x":-500.0,"y":700.0},"channel":1},"response":{"accepted":true,"real_timestamp_ms":1789265740998,"virtual_time_s":8875.765542,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":420,"wall_ts_ms":1789265740999,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0420","position":{"x":-500.0,"y":700.0},"channel":3},"response":{"accepted":true,"real_timestamp_ms":1789265740999,"virtual_time_s":8881.765542,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":421,"wall_ts_ms":1789265741000,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0421","position":{"x":-500.0,"y":700.0},"channel":7},"response":{"accepted":true,"real_timestamp_ms":1789265741000,"virtual_time_s":8887.765542,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":422,"wall_ts_ms":1789265741000,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0422","position":{"x":-500.0,"y":700.0},"channel":9},"response":{"accepted":true,"real_timestamp_ms":1789265741000,"virtual_time_s":8893.765542,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":423,"wall_ts_ms":1789265741001,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0423","position":{"x":-500.0,"y":700.0},"channel":11},"response":{"accepted":true,"real_timestamp_ms":1789265741001,"virtual_time_s":8899.765542,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":424,"wall_ts_ms":1789265741001,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0424","position":{"x":-500.0,"y":700.0},"channel":13},"response":{"accepted":true,"real_timestamp_ms":1789265741001,"virtual_time_s":8905.765542,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":425,"wall_ts_ms":1789265741002,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0425","position":{"x":-500.0,"y":700.0},"channel":14},"response":{"accepted":true,"real_timestamp_ms":1789265741002,"virtual_time_s":8911.765542,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":426,"wall_ts_ms":1789265741003,"method":"POST","path":"/measure","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0426","position":{"x":-500.0,"y":700.0},"channel":18},"response":{"accepted":true,"real_timestamp_ms":1789265741003,"virtual_time_s":8917.765542,"measure_result":"no_signal"}}
|
||||||
|
{"event":"action","seq":427,"wall_ts_ms":1789265741003,"method":"POST","path":"/exit","status":200,"request":{"arena_id":"default","robot_id":"1","request_id":"baa9dc681441-0427"},"response":{"accepted":true,"real_timestamp_ms":1789265741003,"virtual_time_s":8917.765542,"exit_reason":"user_exit"}}
|
||||||
|
{"event":"session_end","reason":"user_exit","virtual_time_s":8917.765542,"real_elapsed_s":10.027643,"request_count":427,"cleared_count":11}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
"""兼容入口,转发到统一 CLI(mcm26b)。"""
|
"""用于转发到统一 CLI(mcm26b)的统一入口"""
|
||||||
from mcm26b.cli import main
|
from mcm26b.cli import main
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||