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