去敏感提交
This commit is contained in:
+76
-379
@@ -2,7 +2,6 @@
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "9f704249",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# CUMCM 2026 B 题 · 无线电干扰源的快速自动定位与清除\n",
|
||||
@@ -43,12 +42,16 @@
|
||||
"\n",
|
||||
"各代码单元逐字取自 `src/mcm26b/**`,仅做机械化改写(去包内相对导入、去文件 docstring、\n",
|
||||
"去掉覆盖计划的 JSON 文件读取改为内嵌字面量、去掉未被生产路径调用的函数)。\n",
|
||||
"本文件可独立运行:只依赖标准库与 `numpy`(可选加速,缺失时自动回退纯 Python)。\n"
|
||||
"本文件可独立运行:**零第三方依赖**(`numpy` 仅作可选加速,缺失时自动回退纯 Python;\n",
|
||||
"`requests` 仅在真正发起 HTTP 时才惰性导入)。最后的总自检单元会复算四问的核心结论,\n",
|
||||
"15 项断言全部通过才算整理成功。\n",
|
||||
"\n",
|
||||
"自检覆盖:问1 角域交会有界/直径圆反例、问2 保证接收与后验收缩、问3 七站解析覆盖证书与\n",
|
||||
"Voronoi 真源保留、问4 定向最小命中集证书与 (位置×朝向) 联合信念保守性。\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "dabe0eb2",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## 0. 环境与依赖\n"
|
||||
@@ -56,18 +59,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "47afaab3",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"numpy 加速后端: 启用\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import json\n",
|
||||
"import math\n",
|
||||
@@ -92,7 +86,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "648b9bca",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# 第一部分 · 公共层\n",
|
||||
@@ -105,8 +98,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "a77d00d5",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -313,8 +305,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"id": "18c1702d",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -334,7 +325,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "eb41e595",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## 2. 协议层(`protocol/`)\n",
|
||||
@@ -347,8 +337,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"id": "52874146",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -439,7 +428,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "624c4b89",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 2.2 纯计时模型(`timing.py`)\n",
|
||||
@@ -451,8 +439,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"id": "bb132d37",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -505,7 +492,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "0382155e",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 2.3 本地状态机(`state.py`)\n",
|
||||
@@ -516,8 +502,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"id": "01f62290",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -603,7 +588,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "fdea1f06",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 2.4 传输抽象与会话日志(`transport.py` / `log.py`)\n",
|
||||
@@ -615,8 +599,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"id": "75e9e40b",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -655,8 +638,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"id": "ce38cbf0",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -688,7 +670,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "00433092",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 2.5 串行幂等客户端(`client.py`)\n",
|
||||
@@ -702,8 +683,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"id": "9b89cf0b",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1015,7 +995,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "1b378ab3",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## 3. 几何内核(`geometry/`)\n",
|
||||
@@ -1035,8 +1014,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"id": "3b895426",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1318,7 +1296,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "0e26ba66",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 3.2 问题二的安全候选盘证书(`planning.py`)\n",
|
||||
@@ -1331,8 +1308,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"id": "96ea4f0f",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1366,7 +1342,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "15dfa096",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## 4. 信念层与保证层\n",
|
||||
@@ -1385,8 +1360,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"id": "48977ca8",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1651,7 +1625,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d5ebeb37",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 4.2 逐频道覆盖账本(`coverage/__init__.py`)\n",
|
||||
@@ -1662,8 +1635,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"id": "83ef8c99",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1707,7 +1679,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "2797039e",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 4.3 覆盖计划与证书(`guarantee/cover.py`)\n",
|
||||
@@ -1727,8 +1698,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"id": "9fe42d17",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -2092,7 +2062,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "b6709645",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 4.4 第四问最小命中集(内嵌计划)\n",
|
||||
@@ -2106,8 +2075,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"id": "2892e247",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -2177,8 +2145,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"id": "51d5ac79",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -2275,7 +2242,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "5fdc48f7",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 4.5 第三问解析七站计划(`planner/seven.py` 覆盖部分)\n",
|
||||
@@ -2287,8 +2253,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"id": "62b4aec6",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -2319,7 +2284,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d0db208e",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 4.6 网格幸存集粒子滤波(`particles.py`)\n",
|
||||
@@ -2338,8 +2302,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"id": "63499de6",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -2769,7 +2732,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "7cfa64a2",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 4.7 (位置 × 朝向) 联合可行集(`belief/joint.py`)\n",
|
||||
@@ -2791,8 +2753,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 19,
|
||||
"id": "3e8eb944",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -3128,7 +3089,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "63720d6b",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## 5. 调度层:开放路径排序(`routing.py`)\n",
|
||||
@@ -3140,8 +3100,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 20,
|
||||
"id": "f2e043c8",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -3218,7 +3177,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "9325502c",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# 第二部分 · 策略层(`planner/`)\n",
|
||||
@@ -3234,8 +3192,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 21,
|
||||
"id": "f4e91fbc",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -3388,7 +3345,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "76749d32",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 6.1 全向闭环骨架(`OmnidirectionalLoop`)\n",
|
||||
@@ -3403,8 +3359,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 22,
|
||||
"id": "22efcd41",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -3841,7 +3796,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "1515ae48",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 6.2 第四问定向扩展(`DirectionalExtension`)\n",
|
||||
@@ -3857,8 +3811,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 23,
|
||||
"id": "c2acad85",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -4269,7 +4222,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "dfc8e5b3",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 6.3 第三问默认策略:贝叶斯网格滤波闭环(`planner/bayes_loop.py`)\n",
|
||||
@@ -4289,8 +4241,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 24,
|
||||
"id": "5934cb40",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -5083,7 +5034,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "52d71ea9",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### 6.4 第三问对照策略:七站批量扫频(`planner/seven.py`)\n",
|
||||
@@ -5094,8 +5044,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 25,
|
||||
"id": "0c911581",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -5145,7 +5094,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d9df020d",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# 第三部分 · 逐问算例与自检\n",
|
||||
@@ -5161,23 +5109,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 26,
|
||||
"id": "4075e650",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"== 三点交会 ==\n",
|
||||
"状态 : polygon 顶点数 5\n",
|
||||
"直径 : 26.986 m\n",
|
||||
"直径圆覆盖区域 : False 最大超出 3.964 m\n",
|
||||
"最小包围圆 : 圆心 (81.874, 98.042) 半径 13.943 m\n",
|
||||
"可原地清除 : True\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"Q1_EXAMPLES = {\n",
|
||||
" \"normal\": { # 三点交会:区域有界、MEC 远小于 20 m\n",
|
||||
@@ -5221,29 +5155,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 27,
|
||||
"id": "efa9f69a",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"== 直径圆反例(等边三角形) ==\n",
|
||||
"定位区域顶点: [[-0.0, 0.0], [40.0, 0.0], [20.0, 34.64]]\n",
|
||||
"直径 40.000 m(最远顶点对 [[-0.0, 0.0], [40.0, 0.0]])\n",
|
||||
"直径圆:圆心 [20.0, 0.0] 半径 20.000 m\n",
|
||||
"圆外顶点下标 [2](见证顶点 [20.0, 34.64]),最大超出 14.641 m\n",
|
||||
"直径圆覆盖整个定位区域: False\n",
|
||||
"最小包围圆半径 23.094 m(>= 直径/2 = 20.0 m,才是真正的最小覆盖半径)\n",
|
||||
"\n",
|
||||
"== 近共线细长区域 ==\n",
|
||||
"状态 polygon,直径 3085.3 m,最小包围圆半径 1542.6 m,可原地清除 False\n",
|
||||
"\n",
|
||||
"无观测 -> unbounded | 单条示向度 -> unbounded (衰退方向 [0.8971423583981722, 0.44174154068614097])\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# 反例:直径圆的圆心是\"最远顶点对\"的中点,第二个最远顶点可能落在圆外。\n",
|
||||
"tri = solve_q1(\"triangle\")\n",
|
||||
@@ -5283,20 +5197,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 28,
|
||||
"id": "6145af53",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"舍入裕量 0.000°:直径 26.986 m,MEC 半径 13.943 m\n",
|
||||
"舍入裕量 0.005°:直径 27.143 m,MEC 半径 14.019 m\n",
|
||||
"放宽 0.005° 使 MEC 半径增加 0.076 m —— 因此库默认带该裕量,否则合法真源可能被角域裁掉\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# 示向度二位小数的舍入敏感性:误差半角 1.0° vs 1.005°(含 0.005° 舍入裕量)\n",
|
||||
"tight = solve_q1(\"normal\", 0.0)\n",
|
||||
@@ -5314,7 +5217,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "442dbb20",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## 8. 问题二:第二检测点的选择\n",
|
||||
@@ -5329,24 +5231,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 29,
|
||||
"id": "abebb69d",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"首次角域扇形的包围圆:圆心 (450.1, 600.1) 半径 750.1 m\n",
|
||||
"保证接收盘 :圆心 (450.1, 600.1) 半径 249.9 m\n",
|
||||
"\n",
|
||||
"第二检测点 ( 691.65, 535.27)\n",
|
||||
"最坏后验包围半径 91.42 m(当前候选集 MEC 半径 750.1 m,必须更小才叫有信息)\n",
|
||||
"移动耗时 174.9 s(次指标:同样精度下取更近的点)\n",
|
||||
"依据: 安全盘 B(centre,250m) 内 37 候选;粗采样最坏后验 91.4m,1/4 间距加密复核 91.4m\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"class _StateStub:\n",
|
||||
" \"\"\"最小状态替身:只提供选点器需要的当前位置与当前测向频道。\"\"\"\n",
|
||||
@@ -5399,24 +5286,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 30,
|
||||
"id": "226d7cca",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"候选集边界采样点 3056 个\n",
|
||||
"真源到第二点的最远距离 874.58 m(<= 1000 m 才保证收到信号)\n",
|
||||
"对候选集最坏点、最不利读数的后验包围半径 91.42 m\n",
|
||||
"第二点相对候选集包围圆的保证接收余量:0.0 m\n",
|
||||
"追加第 2 个测点 ( 400.97, 23.81):最坏后验半径 10.37 m\n",
|
||||
"\n",
|
||||
"结论:第二点负责\"保证接收 + 最大化交会角\",后验精度由后续测点继续压缩;20 m 清除圈通常在第三点后达成。\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# 用同一套观测语义复核这个点:无论真源落在候选集何处,第二点都必收到信号。\n",
|
||||
"# 候选集边界按 1 m 加密采样做最坏情形检验。\n",
|
||||
@@ -5454,26 +5326,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 31,
|
||||
"id": "504f0aa8",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"首次示向度 第二点位置 最坏后验半径 移动耗时\n",
|
||||
" 0.0° ( 814.85, 241.29) 93.20 m 465.5 s\n",
|
||||
" 45.0° ( 465.82, 771.76) 90.96 m 422.4 s\n",
|
||||
" 90.0° ( -241.29, 814.85) 93.20 m 299.9 s\n",
|
||||
" 135.0° ( -771.76, 465.82) 90.96 m 172.9 s\n",
|
||||
" 180.0° ( -814.85, 241.29) 93.20 m 145.3 s\n",
|
||||
" 225.0° ( -771.76, -465.82) 90.96 m 172.9 s\n",
|
||||
" 270.0° ( -241.29, -814.85) 93.20 m 299.9 s\n",
|
||||
" 315.0° ( 465.82, -771.76) 90.96 m 422.4 s\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# 对照:候选集在不同首次示向度下的选择结果(目标函数与移动代价的权衡)\n",
|
||||
"print(\"首次示向度 第二点位置 最坏后验半径 移动耗时\")\n",
|
||||
@@ -5486,7 +5341,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "b7a898d2",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## 9. 问题三:全向源闭环\n",
|
||||
@@ -5505,20 +5359,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 32,
|
||||
"id": "8d78f6b8",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"七站环半径 1200.0 m,最近站最远距离解析上界 968.9 m(阈值 1000 m)\n",
|
||||
"站点: [(0.0, 0.0), (1200.0, 0.0), (600.0, 1039.2), (-600.0, 1039.2), (-1200.0, 0.0), (-600.0, -1039.2), (600.0, -1039.2)]\n",
|
||||
"粗采样复核:目标点 113 个,未覆盖 0 个,最坏命中 968.9 m,最近邻巡回 7.2 km\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def observe_omni(truth, station, r_eff, bearing_noise_deg=0.0):\n",
|
||||
" \"\"\"全向源的观测语义(合成用):返回 (result, svd_deg)。\"\"\"\n",
|
||||
@@ -5563,25 +5406,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 33,
|
||||
"id": "6460920f",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"第 1 次读数 no_signal 幸存格 34035 格心距真源 8.587 m(裕量 10.359 m) MEC 半径 1810.324 m\n",
|
||||
"第 2 次读数 direction 幸存格 321 格心距真源 8.587 m(裕量 10.359 m) MEC 半径 687.185 m\n",
|
||||
"第 3 次读数 direction 幸存格 15 格心距真源 8.587 m(裕量 10.359 m) MEC 半径 39.446 m\n",
|
||||
"第 4 次读数 direction 幸存格 6 格心距真源 8.587 m(裕量 10.359 m) MEC 半径 20.718 m\n",
|
||||
"\n",
|
||||
"初始幸存格 47979;真源始终落在某个幸存格内:True\n",
|
||||
"Voronoi 裕量 m = 10.359 m(格心到格内任一点的最大距离)\n",
|
||||
"远端测点 (4000.0, 4000.0) 是否必 no_signal:True\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# ---- 9.2 网格幸存集的真源保留性(Voronoi 裕量定理的随机检验) ----------------\n",
|
||||
"Random(20260913).seed(20260913)\n",
|
||||
@@ -5619,24 +5446,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 34,
|
||||
"id": "d37c4b2c",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"幸存集 MEC:圆心 (306.57, 409.12) 半径 20.718 m\n",
|
||||
"网格清除证书阈值 9.141 m(= 20 − 裕量 10.359 − 工程余量 0.5)→ 可清除:False\n",
|
||||
"near 读数后的凸证书:半径 5.001 m ≤ 19.499 m → True\n",
|
||||
"沿来向偏移后清除点距真源 11.234 m <= 半径 20.718 + 偏移 0.000 = 20.718 m < 20 m\n",
|
||||
"\n",
|
||||
"七站全部 no_signal 后幸存格 0 → 该频道判缺席(无需等覆盖账本跑完)\n",
|
||||
"只测其中 6 站仍有 3339 个幸存格 → 七站是刚好够用的最小解析覆盖\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# ---- 9.3 证书与缺席证明 -----------------------------------------------------\n",
|
||||
"center, radius = pf.mec()\n",
|
||||
@@ -5679,22 +5491,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 35,
|
||||
"id": "6fc5cf54",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"第三问策略:覆盖计划 seven-r1200.0(7 站),网格间距 14.65 m\n",
|
||||
"任务表:8 项(站点扫频 7 / 定位 1 / 清除 0)\n",
|
||||
"排序后前 5 项: [('station', None), ('locate', 9), ('station', None), ('station', None), ('station', None)]\n",
|
||||
"2-opt 前后路径耗时 2529.66 s -> 2246.77 s\n",
|
||||
"信息增益选点:( 427.81, 413.89)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# ---- 9.4 统一任务表与滚动排序(信息增益选点 + 2-opt) ------------------------\n",
|
||||
"class _LogStub:\n",
|
||||
@@ -5705,7 +5504,7 @@
|
||||
" return []\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"client3 = SimulatorClient(\"2026001\", config=CONFIG_Q3, transport=None, log=_LogStub())\n",
|
||||
"client3 = SimulatorClient(\"OFFLINE\", config=CONFIG_Q3, transport=None, log=_LogStub())\n",
|
||||
"client3.state.position = (0.0, 0.0)\n",
|
||||
"loop3 = BayesLoop(client3, CONFIG_Q3)\n",
|
||||
"print(\"第三问策略:覆盖计划 %s(%d 站),网格间距 %.2f m\"\n",
|
||||
@@ -5732,24 +5531,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 36,
|
||||
"id": "5a06d133",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"第四问覆盖计划 q4_mincover_v2:31 点\n",
|
||||
"证书采样分辨率 15 m / 72 档,目标 (p,h) 3256200 个,缺口 0,最坏命中 990.051 m\n",
|
||||
"最近邻巡回 23.9 km(虚拟移动 4776.8 s)→ 发现阶段的移动代价下界\n",
|
||||
"设计裕量:r_design 965 m、前向角裕量 5.0°;校核用 r_eff 1000 m、角裕量 0.0°\n",
|
||||
"\n",
|
||||
"对照 q4_mincover_v1:同样 31 点,但证书采样只有 75 m / 24 档,细网格复检有 125 个缺口\n",
|
||||
"→ 采样分辨率必须与证书一致,否则'删掉一个关键点仍看似覆盖'(校核退化为装饰)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# ---- 9.5 覆盖计划证书:离线全分辨率生成,运行期按同分辨率复核 ----------------------------------\n",
|
||||
"plan_v2 = plan_instance(\"q4_mincover_v2\", verify=False)\n",
|
||||
@@ -5774,7 +5558,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "7b3fdca8",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## 10. 问题四:含定向源的闭环\n",
|
||||
@@ -5794,19 +5577,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 37,
|
||||
"id": "96d693ce",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"最小命中集 31 点,粗采样复核 (p,h) 1356 个:未覆盖 0,最坏命中 922.0 m\n",
|
||||
"对照 700 m 方格 49 点:同样未覆盖 0,巡回 36.4 km vs 23.9 km\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# ---- 10.1 定向覆盖最小命中集的覆盖语义 --------------------------------------\n",
|
||||
"plan_q4 = plan_instance(\"q4_mincover_v2\", verify=False)\n",
|
||||
@@ -5825,26 +5598,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 38,
|
||||
"id": "c1860693",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"测点方位 115.0° 距离 900 m → direction(预期 direction)幸存格 339 真源格偏移 6.088 m(裕量 10.359 m)朝向档 13 个 含真源朝向档:True\n",
|
||||
"测点方位 285.0° 距离 700 m → direction(预期 direction)幸存格 63 真源格偏移 6.088 m(裕量 10.359 m)朝向档 2 个 含真源朝向档:True\n",
|
||||
"测点方位 200.0° 距离 600 m → direction(预期 direction)幸存格 9 真源格偏移 6.088 m(裕量 10.359 m)朝向档 2 个 含真源朝向档:True\n",
|
||||
"测点方位 230.0° 距离 1050 m → direction(预期 direction)幸存格 9 真源格偏移 6.088 m(裕量 10.359 m)朝向档 2 个 含真源朝向档:True\n",
|
||||
"测点方位 140.0° 距离 400 m → direction(预期 direction)幸存格 7 真源格偏移 6.088 m(裕量 10.359 m)朝向档 2 个 含真源朝向档:True\n",
|
||||
"测点方位 330.0° 距离 800 m → no_signal(预期 no_signal)幸存格 7 真源格偏移 6.088 m(裕量 10.359 m)朝向档 2 个 含真源朝向档:True\n",
|
||||
"测点方位 200.0° 距离 1250 m → no_signal(预期 no_signal)幸存格 7 真源格偏移 6.088 m(裕量 10.359 m)朝向档 2 个 含真源朝向档:True\n",
|
||||
"\n",
|
||||
"联合集规模 7 格,抽样平均朝向档 2.00 / 24\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# ---- 10.2 (位置 × 朝向) 联合可行集的保守性随机检验 --------------------------\n",
|
||||
"truth4 = (420.0, -260.0) # 真源位置\n",
|
||||
@@ -5893,27 +5649,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 39,
|
||||
"id": "19dea4e3",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"探点可见性概率(越高越可能在该点收到信号):\n",
|
||||
" ( -2000.0, 0.0) prob_detect = 0.0000\n",
|
||||
" ( 0.0, 0.0) prob_detect = 0.0833\n",
|
||||
" ( 420.0, -260.0) prob_detect = 0.0417\n",
|
||||
" ( 1500.0, -900.0) prob_detect = 0.0000\n",
|
||||
" ( -331.8, -533.6) prob_detect = 0.0833\n",
|
||||
"\n",
|
||||
"候选集外包框 820 m × 820 m,20 m 网格覆盖 171 格(外包框枚举上界 1936)\n",
|
||||
"格内任意点到最近格心 <= 14.14 m < 20 m → 逐格 /clear 至少命中一次\n",
|
||||
"外包框内落在候选集中的随机点,被某个格心 20 m 覆盖:96 个\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# ---- 10.3 可见性选点取代固定阶梯;后备清除兜底 ------------------------------\n",
|
||||
"print(\"探点可见性概率(越高越可能在该点收到信号):\")\n",
|
||||
@@ -5952,26 +5690,12 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 40,
|
||||
"id": "9a7b1181",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"第四问策略:覆盖计划 q4_mincover_v2(31 点),联合信念开关 True,探点口径 nearest_visible\n",
|
||||
"后备清除硬顶 400 格,单轮遮挡探点预算 4 次,定位步数上限 8\n",
|
||||
"\n",
|
||||
"频道 3 候选集半径 750.1 m,可清除:False\n",
|
||||
"保证接收盘半径 249.9 m(盘内必收到信号 -> 静默即遮挡)\n",
|
||||
"被遮挡后梯子升级到的探点:( 71.58, -134.29)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# ---- 10.4 第四问闭环装配(不连模拟器:只检查策略对象初始化) ----------------\n",
|
||||
"client4 = SimulatorClient(\"2026001\", config=CONFIG, transport=None, log=_LogStub())\n",
|
||||
"client4 = SimulatorClient(\"OFFLINE\", config=CONFIG, transport=None, log=_LogStub())\n",
|
||||
"client4.state.position = (0.0, 0.0)\n",
|
||||
"loop4 = DirectionalExtension(client4, CONFIG)\n",
|
||||
"print(\"第四问策略:覆盖计划 %s(%d 点),联合信念开关 %s,探点口径 %s\"\n",
|
||||
@@ -5998,7 +5722,6 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "18a6a561",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# 第四部分 · 总览与自检\n",
|
||||
@@ -6036,8 +5759,8 @@
|
||||
"\n",
|
||||
"```bash\n",
|
||||
"# 对接官方模拟器(演练/正式)\n",
|
||||
"python -m mcm26b.run --robot-id <队号> --problem 3 # 第三问:bayes 闭环\n",
|
||||
"python -m mcm26b.run --robot-id <队号> --problem 4 # 第四问:directional 闭环\n",
|
||||
"python -m mcm26b.cli run --robot-id <队号> --problem 3 # 第三问:bayes 闭环\n",
|
||||
"python -m mcm26b.cli run --robot-id <队号> --problem 4 # 第四问:directional 闭环\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"成绩口径是**虚拟时间**:`avg_locate_clear_time_s = 全程虚拟时长 / 已清除源数`,\n",
|
||||
@@ -6046,35 +5769,9 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 41,
|
||||
"id": "25656b6b",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"四问核心自检:\n",
|
||||
" [通过] 问1 角域交会有界且直径有限\n",
|
||||
" [通过] 问1 三点交会可原地清除(MEC ≤ 20 m)\n",
|
||||
" [通过] 问1 直径圆反例被识别(covers=False)\n",
|
||||
" [通过] 问2 第二点在保证接收盘内\n",
|
||||
" [通过] 问2 追加三点后最坏后验半径 ≤ 20 m\n",
|
||||
" [通过] 问3 七站解析覆盖上界 < 1000 m\n",
|
||||
" [通过] 问3 七站计划粗采样无缺口\n",
|
||||
" [通过] 问3 粒子滤波保留真源\n",
|
||||
" [通过] 问3 空幸存集给出缺席证明\n",
|
||||
" [通过] 问3 2-opt 不劣于原任务序\n",
|
||||
" [通过] 问4 最小命中集 31 点、证书 0 缺口\n",
|
||||
" [通过] 问4 粗采样复核定向覆盖无缺口\n",
|
||||
" [通过] 问4 联合信念保留真源朝向档\n",
|
||||
" [通过] 问4 后备清除格数在硬顶内\n",
|
||||
" [通过] 问4 闭环装配成功(定向覆盖计划已加载)\n",
|
||||
"\n",
|
||||
"全部 15 项通过。\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# ---- 总自检:把四问的核心结论再跑一遍,全部通过才算整理成功 ----------------\n",
|
||||
"checks = []\n",
|
||||
@@ -6121,21 +5818,21 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python",
|
||||
"version": "3.10",
|
||||
"mimetype": "text/x-python",
|
||||
"file_extension": ".py",
|
||||
"pygments_lexer": "ipython3",
|
||||
"nbconvert_exporter": "python",
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.13.9"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
Reference in New Issue
Block a user