16 KiB
问题二算法说明:保证接收的第二检测点选择(当前实现)
本文按当前仓库实际运行路径重写。生产入口是
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 的选择策略、定位效果与候选区域。两个约束必须同时满足:
- 接收保证:
q到所有仍可能为真源的位置都不超过有效接收半径下界R_-=1000m,否则第二次测量可能返回no_signal,几何收益落空; - 定位效果:在保证接收的候选点中,使第二次测量后的保守位置集合 尽量小。当前实现以“最坏后验最小包围半径”为主指标,以移动耗时为次指标。
| 层次 | 文件 | 内容 |
|---|---|---|
| 在线入口 | 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$,最坏后验半径按以下有限枚举计算:
- 在候选集边界上以
witness_spacing_m=60m 采样见证点 $g$(region.witnesses,含全部顶点); - 对每个 $g$,真实方位 $\phi=\operatorname{bearing}(q,g)$,枚举允许的 读数区间端点 $\phi\pm\delta_{\rm eff}$;
- 对每个端点,复制候选多边形并用
clip_wedge(q, 读数, δ_eff)得到后验 凸外包,记录其 MEC 半径; - 额外处理
near分支:以B(q,5)裁剪候选集,若交集非空,记录其 MEC 半径;它代表“源离第二点不超过 5 m,直接光学定位清除”的分支; - 以上全部有效半径取最大值,就是该候选点的评估值。
该评估是启发式上界近似:它只对目标边界采样和读数区间端点取值, 没有覆盖连续集合上所有可能读数;但它可在候选点之间做一致比较。 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(位置、最坏后验、移动耗时) |
问题三把它推广到定位子过程;问题四把它作为联合信念选点的基础候选之一 |
| 保证口径 | 几何精确(在输入模型内) | 接收严格保证;最坏后验是采样启发式 | 清除证书严格;选点与调度是启发式 |
关键区别:
- 问题二不直接复用问题一的
solve,而是复用其角域语义和smallest_enclosing_circle;候选集多出圆盘和距离上界,不能当作 “纯角域问题一”处理。 - 问题一的输出是直径和直径圆,问题二的清除判断改用最小包围半径 $\rho\le20$;直径圆本身不参与在线清除。
- 问题三对同一个
select_measurement_point做任意后验集上的复用, 但同时引入网格粒子滤波处理K无法表示的负观测(no_signal); 问题二没有负观测更新,因为它假设第二次测量点已在保证接收盘内。 - 问题四不能直接使用“安全盘内必收到信号”的结论:定向源在安全盘内
也可能因朝向遮挡返回
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 证书前继续测量。
严格保证与启发式性能优化在文档和代码中始终分开:接收保证有证明, 全局最优性没有证明;后者依赖自建的有限候选与固定评估口径。
参考文献
- 全国大学生数学建模竞赛组委会. 2026 年高教社杯全国大学生数学建模竞赛 B 题[Z]. 2026. 本地题面
issue/B题.pdf。 - 模拟器配套材料. 附件 2:模拟器通信接口说明及编程指南[Z]. 2026. 本地附件
issue/附件/附件2.docx。 - BOYD S, VANDENBERGHE L. Convex Optimization[M]. Cambridge University Press, 2004. 凸性、最坏情形与鲁棒可行性背景。
- 本项目.
docs/algo-1.md(问题一当前实现与复用差异)。 - 本项目.
docs/algo-3.md、docs/algo-4.md(选点器在后续问题中的推广与边界)。