# 问题二算法说明:保证接收的第二检测点选择(当前实现) > 本文按**当前仓库实际运行路径**重写。生产入口是 > `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 入口伪代码 ```text 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`(选点器在后续问题中的推广与边界)。