Files
mcm-26-b/docs/algo-2.md
T
2026-09-13 08:29:30 +08:00

16 KiB
Raw Blame History

问题二算法说明:保证接收的第二检测点选择(当前实现)

本文按当前仓库实际运行路径重写。生产入口是 src/mcm26b/planner.select_second_point,其核心选点器是 select_measurement_point;src/mcm26b/geometry/planning.py 中的 first_bearing_candidate_disk 是解析充分证书与独立校核工具, 并不在运行时被 select_second_point 调用(见 §6 核对结果)。

1. 问题、实现入口与交付物

问题二给定一个全向干扰源的首次有效示向度 $(s,\theta)$,要求给出第二个 检测点 q 的选择策略、定位效果与候选区域。两个约束必须同时满足:

  1. 接收保证:q 到所有仍可能为真源的位置都不超过有效接收半径下界 R_-=1000 m,否则第二次测量可能返回 no_signal,几何收益落空;
  2. 定位效果:在保证接收的候选点中,使第二次测量后的保守位置集合 尽量小。当前实现以“最坏后验最小包围半径”为主指标,以移动耗时为次指标。
层次 文件 内容
在线入口 src/mcm26b/planner/__init__.py::select_second_point 由首次 direction 构造 $K_1$,返回 SecondPointPlan
核心选点 同文件 select_measurement_point 任意候选集的保证接收盘内选点
几何证书 src/mcm26b/geometry/planning.py::first_bearing_candidate_disk 截断角域解析外包圆与安全候选盘
信念构造 src/mcm26b/belief/__init__.py::BeliefState、CandidateRegion K_1 的保守凸外包与更新
对比框架 project/q2/{optimal,baseline,reference,region,cases,compare}.py 生产选点器 / 两种朴素基线 / 保证盘内网格参考
回归 tests/test_planner.py、tests/test_geometry_certificates.py、tests/test_belief.py 接收保证、后验收缩、near 分支、解析证书
结果 project/results/q2.{md,json} 30 个随机首次示向度算例配对结果

2. 首次观测后的候选集 K_1

2.1 精确定义

记首次检测点为 $s$、首次示向度为 $\theta$、误差半角 $\delta_{\rm eff}=1^\circ+0.005^\circ$(题设误差 + 两位小数舍入裕量), 有效接收半径上界 R_+=1500 m,源位置圆域 $\Omega=B(0,1800)$。则


K_1=\Omega\cap W(s,\theta,\delta_{\rm eff})\cap B(s,R_+).

真实源在合法观测下必属于 $K_1$。注意 B(s,R_+) 的半径是接收半径上界: direction 读数本身就隐含测得距离不超过 $R_+$;而 B(s,R_-) 不在 K_1 之中,因为第二次是否收到信号正是本问要保证的事。

2.2 实际保守表示

在线实现不直接处理圆弧边界,而用以下外切多边形表示 $K_1$:

  • 先取 \Omega 的 192 边外切正多边形 $P_M(0,1800)$;
  • 再与 B(s,1500) 的 192 边外切正多边形求交;
  • 最后用 Sutherland–Hodgman 逐半平面裁剪两条测向边界。

设圆盘外切多边形相对圆盘的最大径向超出为 $R(1-\cos(\pi/M))$。实现把每次 圆盘裁剪的该量累加到 CandidateRegion.slack_m,因此维护的多边形满足 $K_1\subseteq P_{\rm out}$,且 slack_m 是可审计的外包半径余量。

这条路径与问题一的区别:问题一在纯角域上枚举边界直线交点,精确处理 空集/无界;问题二候选集一开始就被 \Omega 和 B(s,R_+) 限成有界集, 因此可以只用凸多边形裁剪。角域系数与问题一 halfplanes 完全一致: \sin(\theta-\delta)x-\cos(\theta-\delta)y\le c 与 $-\sin(\theta+\delta)x+\cos(\theta+\delta)y\le c$。

3. 保证接收区域

3.1 一般集合形式

对非空紧候选集 $K$,定义


F_K(q)=\max_{g\in K}\lVert q-g\rVert,\qquad
\mathcal Q(K)=\{q:F_K(q)\le R_-\}=\bigcap_{g\in K}B(g,R_-).

F_K 是凸函数且 1-Lipschitz,\mathcal Q(K) 是闭凸集。

定理 1. \mathcal Q(K)\ne\varnothing 当且仅当 $\rho(K)=\min_q F_K(q)\le R_-$,其中 \rho(K) 是 K 的最小包围半径。

证明:\min_q F_K(q) 就是最小包围半径;存在 q 使 F_K(q)\le R_- 与 其最小值不超过 R_- 等价。证毕。

3.2 多边形外包给出的充分安全盘

设在线维护的多边形 $P_{\rm out}\supseteq K$,其最小包围圆为 $B(m,\rho_{\rm out})$。任取


q\in B(m,\ R_- - \rho_{\rm out}-\eta),\qquad \eta=10^{-3}\ {\rm m},

则对任意真源 $g\in K$:


\lVert q-g\rVert\le\lVert q-m\rVert+\lVert m-g\rVert
\le (R_--\rho_{\rm out}-\eta)+\rho_{\rm out}
=R_--\eta<1000.

实现中 safe_disk_radius(region) 直接返回 $R_--\rho_{\rm out}-10^{-3}$;因为 \rho_{\rm out} 已是包含真实候选集 的多边形最小包围半径,这个盘内的点到真实源的三角不等式上界严格小于 1000 m。1 mm 的数值余量避免浮点贴边被 r_{\rm eff}=1000 的源判成 no_signal。若该半径 $<0$,说明当前凸外包的 MEC 半径已超过 1000 m:

  • 这不能证明真实 \mathcal Q(K) 为空,只说明这个充分证书不够紧;
  • 实现退化为探索 MEC 圆心,并在 reason 中明确标注“可能 no_signal”。

3.3 首次截断角域的解析候选盘

完全去掉 \Omega 后,完整的截断角域 S=W(s,\theta,\delta)\cap B(s,R_+) 有一个精确最小包围圆:


c=s+a\,u(\theta),\qquad a=\frac{R_+}{2\cos\delta},\qquad
S\subseteq B(c,a),

对 0\le\delta\le45^\circ 成立。简证:设 $g=s+t,u(\theta+\varphi)$,$0\le t\le R_+$, $|\varphi|\le\delta$,则 $\lVert g-c\rVert^2=t^2+a^2-2at\cos\varphi$。固定 \varphi 时该式 关于 t 是凸二次函数,最大值在 t=0 或 t=R_+ 处:前者为 $a^2$, 后者不超过 $R_+^2+a^2-2aR_+\cos\delta=a^2$(代入 $a=R_+/(2\cos\delta)$),故 $S\subseteq B(c,a)$。最小性由三点 $s$、s+R_+u(\theta\pm\delta) 的加权距离恒等式给出:权重 $\lambda_\pm=1/(4\cos^2\delta)$、 \lambda_0=1-1/(2\cos^2\delta) 非负且和为 1,且 $c=\lambda_0s+\lambda_+p_++\lambda_-p_-$,故任何覆盖这三点的圆半径 至少为 $a$。于是


\mathcal Q_0=B(c,\ R_- - a)

是保证接收的充分候选区域。题设 \delta_{\rm eff}\le1.005^\circ 时:

误差半角 轴向中心距离 a / m 安全候选半径 R_- - a / m
1^\circ 750.114246 249.885754
1.005^\circ 750.115391 249.884609

该解析盘由 first_bearing_candidate_disk 实现并测试。它给出的是 S 的最小圆;由于 $K_1\subseteq S$,B(c,R_- - a)\subseteq\mathcal Q(K_1) 是严格充分的。实际在线路径使用比 S 更紧的 K_1 凸外包,因此其安全盘 通常大于该解析下界(例:q2-4200 的 \rho_{\rm out}=674.59 m, 安全盘半径 325.41 m,而解析下界约 249.89 m)。

4. 实际选点算法

4.1 入口伪代码

select_second_point(client, s, theta):
    region = CandidateRegion.initial(s)          # Ω ∩ B(s,1500) 的外包
    region.clip_wedge(s, theta, 1.005°)          # 交入首次角域
    return select_measurement_point(region, client.position)

select_measurement_point(region, from_position):
    (m, rho) = region.mec()                       # Welzl 最小包围圆
    safe = 1000 - rho - 1e-3
    if safe < 0: return MEC 圆心(探索,可能 no_signal)
    候选 = {m} ∪ {m + f*safe*(cos ψ, sin ψ)}
           f ∈ {0.4, 0.75, 1.0}, ψ 取 12 个均匀方向
    对每个候选 q:
        最坏后验 = max( 方向分支、near 分支 )
        分数 = (最坏后验, 移动时间)
    取分数最小的 q
    用 1/4 间距加密复核 q 的最坏后验
    return q、最坏后验半径、移动耗时、理由

当前 search.candidate_rings=(0.0,0.4,0.75,1.0)、candidate_angles=12, 去重后实际是 37 个候选点(圆心 + 3 环 × 12 方向)。所有点严格属于 保证接收盘,因此第二次测量不会因距离不足返回 no_signal。

4.2 最坏后验评估

对候选点 $q$,最坏后验半径按以下有限枚举计算:

  1. 在候选集边界上以 witness_spacing_m=60 m 采样见证点 $g$(region.witnesses,含全部顶点);
  2. 对每个 $g$,真实方位 $\phi=\operatorname{bearing}(q,g)$,枚举允许的 读数区间端点 $\phi\pm\delta_{\rm eff}$;
  3. 对每个端点,复制候选多边形并用 clip_wedge(q, 读数, δ_eff) 得到后验 凸外包,记录其 MEC 半径;
  4. 额外处理 near 分支:以 B(q,5) 裁剪候选集,若交集非空,记录其 MEC 半径;它代表“源离第二点不超过 5 m,直接光学定位清除”的分支;
  5. 以上全部有效半径取最大值,就是该候选点的评估值。

该评估是启发式上界近似:它只对目标边界采样和读数区间端点取值, 没有覆盖连续集合上所有可能读数;但它可在候选点之间做一致比较。 1/4 间距(15 m)的加密复核只提高输出数值的可信度,不改变“采样启发式” 这一事实。定理 1 保证接收,选点最优性没有全局证明。

4.3 清除与 near

若第二次测量返回 near,源在 q 的 5 m 内。由 clear_certificate: 候选集 B(q,5) 的 MEC 半径至多略大于 5 m(外包多边形余量很小), 工程余量后仍远小于 20 m,因此可以在当前位置直接 /clear,不需要再取 第三个测向读数。若返回 direction,则用新角域更新 K 并继续按 问题三/四的定位流程处理;后验半径若仍大于 20 m,不能声称两次定位 已经完成。

5. 参数与复杂度

参数 默认值 作用
polygon_sides 192 圆盘外切多边形边数;\Omega 处径向超出约 0.24 m
bearing_rounding_margin_deg 0.005° 两位小数舍入的显式裕量
witness_spacing_m 60 m 粗评边界见证间距
candidate_rings (0, 0.4, 0.75, 1.0) 安全盘内半径比例
candidate_angles 12 每环方向数;连同圆心共 37 个候选
near_radius_m 5 m near 分支判定
clear_margin_m 0.5 m 清除证书的额外工程余量

若候选集顶点数为 $m$、候选点数为 $N_q$、边界见证数为 $N_g$,单次选点的 粗评估约为 $O(N_qN_g\cdot{\rm clip}+N_q{\rm MEC})$,clip 为 Sutherland–Hodgman 裁剪的 O(m) 代价;再加一次 1/4 间距加密复核。 这是明显可并行/缓存的小规模在线计算,不追求全局最优。

6. 实现核对结果:文档旧说法与当前运行路径的差异

早期说明只写到 geometry/planning.py 的解析候选盘,容易让人误以为 select_second_point 直接调用它。当前代码的实际情况是:

  • select_second_point 构造 CandidateRegion(\Omega\cap B(s,1500) 的 192 边形外包)并用 clip_wedge 交入首次角域;
  • 真正的选点发生在 select_measurement_point:它在上述凸外包的 MEC 保证盘内做 37 点候选评估;
  • first_bearing_candidate_disk 是解析证书函数,用于证明 B(s+au,1000-a) 的充分性,并被 tests/test_geometry_certificates.py 以稠密角域采样校核;
  • 生产路径不调用 first_bearing_candidate_disk,但两者给出同一性质的 保证:选出的点必能收到 direction/near。生产路径通常比解析盘更紧, 因为它利用了 K_1 完整形状而不是仅用其外包扇区。

因此,问题二的严格保证来自“安全盘点到候选集所有点的距离 $\le R_-$”, 解析盘是充分但不唯一的一种实现方式;最优性来自有限候选评估, 两者必须在说明中分开陈述。

7. 已验证结果

project/q2 在 30 个随机首次示向度算例上,用同一 $K_1$、同一评估器 对四种方法配对比较(初始 \rho 均值 681.47 m):

方法 保证接收率 最坏后验均值 终值比 \rho'/\rho 平均移动 结论
生产选点器(保证盘内最小最坏后验) 100% 73.89 m 0.104 170.4 s 保证接收且后验最小
基线① 垂直 1000 m 最大交会角 0% 80.11 m 0.116 200.0 s 忽略接收距离,真源在远端必 no_signal
基线② 直接取 MEC 圆心 100% 340.75 m 0.500 136.3 s 保证接收但几乎不收缩
独立参考:保证盘内 9×9 网格枚举 100% 75.63 m 0.106 170.3 s 生产采样接近网格最优

代表性单例 q2-4200:

指标 数值
K_1 MEC 圆心 (1172.85, −225.68)
K_1 MEC 半径 \rho 674.59 m
保证接收盘半径 325.41 m
选中第二点 (1257.07, 88.64)
最坏后验半径 54.45 m
移动耗时 181.42 s

8. 与问题一及问题三/四的关系(核对结果)

对比 问题一 问题二(本文) 问题三/四中的去向
信息模型 纯角域 W 角域 W + 距离先验 K_1=\Omega\cap W\cap B(s,R_+) 问题三在任意后验 K_c 上重复使用;问题四再叠加朝向维度
求解方式 枚举半平面边界交点、凸包、精确直径 圆盘外切多边形 + Sutherland–Hodgman 裁剪 问题三/四沿用 CandidateRegion 凸外包
决策类型 对固定观测做几何分析 主动选择下一个测量点 问题三是多源闭环;问题四是混合源闭环
主要输出 直径与直径圆覆盖 SecondPointPlan(位置、最坏后验、移动耗时) 问题三把它推广到定位子过程;问题四把它作为联合信念选点的基础候选之一
保证口径 几何精确(在输入模型内) 接收严格保证;最坏后验是采样启发式 清除证书严格;选点与调度是启发式

关键区别:

  1. 问题二不直接复用问题一的 solve,而是复用其角域语义和 smallest_enclosing_circle;候选集多出圆盘和距离上界,不能当作 “纯角域问题一”处理。
  2. 问题一的输出是直径和直径圆,问题二的清除判断改用最小包围半径 $\rho\le20$;直径圆本身不参与在线清除。
  3. 问题三对同一个 select_measurement_point 做任意后验集上的复用, 但同时引入网格粒子滤波处理 K 无法表示的负观测(no_signal); 问题二没有负观测更新,因为它假设第二次测量点已在保证接收盘内。
  4. 问题四不能直接使用“安全盘内必收到信号”的结论:定向源在安全盘内 也可能因朝向遮挡返回 no_signal。问题四保留问题二的安全盘作为 基础候选,但新增(位置 × 朝向)联合信念来判断可见性(见 algo-4.md)。

9. 结论

问题二的当前实现可以概括为:

  • 候选集:$K_1=\Omega\cap W(s,\theta,\delta_{\rm eff})\cap B(s,R_+)$, 用 192 边形外包圆盘 + 半平面裁剪保守维护;
  • 保证接收:B(m,R_--\rho_{\rm out}-10^{-3}) 内的点必不返回 no_signal;解析扇区最小圆给出可独立复核的充分候选盘 $B(s+au,1000-a)$,$a=1500/(2\cos\delta)$;
  • 选点:在保证盘内取 37 个候选,以边界见证点 × 读数端点的最坏后验 包围半径为第一指标、移动时间为第二指标,选出后再做 1/4 间距加密复核;
  • 清除:若第二次返回 near,直接就地清除;否则把新角域交入后验, 未达到 20 m 证书前继续测量。

严格保证与启发式性能优化在文档和代码中始终分开:接收保证有证明, 全局最优性没有证明;后者依赖自建的有限候选与固定评估口径。

参考文献

  1. 全国大学生数学建模竞赛组委会. 2026 年高教社杯全国大学生数学建模竞赛 B 题[Z]. 2026. 本地题面 issue/B题.pdf。
  2. 模拟器配套材料. 附件 2:模拟器通信接口说明及编程指南[Z]. 2026. 本地附件 issue/附件/附件2.docx。
  3. BOYD S, VANDENBERGHE L. Convex Optimization[M]. Cambridge University Press, 2004. 凸性、最坏情形与鲁棒可行性背景。
  4. 本项目. docs/algo-1.md(问题一当前实现与复用差异)。
  5. 本项目. docs/algo-3.md、docs/algo-4.md(选点器在后续问题中的推广与边界)。