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

313 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 问题二算法说明:保证接收的第二检测点选择(当前实现)
> 本文按**当前仓库实际运行路径**重写。生产入口是
> `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`(选点器在后续问题中的推广与边界)。