# 寻路算法实验室

## 原始提示词

见 [完整原始输入](prompt.md)。本轮为模型 minimax-m3-1-flash-preview、档位 max 在测试分支执行任务正文 v1。

## 运行方式

入口为本目录 `index.html`，单文件、零依赖、无 CDN。用浏览器直接打开，或放到任意静态服务器（Pages 预览同样可用）均可运行。

## 实现要点

- 40×28 网格，BFS / Dijkstra / A* 三套独立搜索状态机，共用一套绘制管线。
- BFS 使用步数（普通格 1，高代价格 5，**不按代价**扩展）；Dijkstra / A* 使用代价，A* 的启发函数是曼哈顿距离，起点代价不计入。
- 加权搜索用手写二叉最小堆维护开集，弹出即扩展；A* 的 f = g + h。
- 绘制层把「已访问 / 前沿 / 路径 / 障碍 / 高代价」分层渲染，路径用连线单独描出。
- 编辑器用 Pointer Events 统一鼠标与触摸；搜索期间编辑地图会主动停止并清空结果。
- 预设地图（空旷草地 / 回廊迷宫 / 高代价走廊 / 封闭终点）全部由固定规则生成，结果可重复。

## 验证记录

- 无障碍网格：直接运行 A*，终点可达，路径步数与代价实时显示。
- 加权走廊预设下分别运行 Dijkstra 与 A*，两者总代价一致，说明启发函数没有牺牲最优性。
- 封闭终点预设：搜索前沿清空后给出红色「终点不可达」提示，而不是静默结束。
- 暂停 / 单步：单步每次只推进一层，暂停后画布停止变化，状态栏显示「已暂停」。
- 起点与终点不会被障碍覆盖；在其上绘制时操作被忽略。
- 390px 视口下页面无水平溢出（`scrollWidth === clientWidth`）。
- 浏览器控制台无报错，内联脚本通过 `node --check`。

## 复盘

**做得好的**：任务正文里的验收条款几乎逐条落地，尤其是「BFS 与 Dijkstra 的差异」「起点不计代价」「编辑时停止搜索」这几条容易被忽略的约束都做了显式处理；异常状态（不可达）给出了明确的用户提示而不是静默失败。

**不足**：
1. BFS 的队列去重用的是 `queue.includes()`，复杂度是 O(n)，网格放大后会明显变慢，应当换成 visited 标记。
2. 速度滑块只影响定时器间隔，没有和「单步」的粒度统一，用户难以预期一格对应多少毫秒。
3. 路径是绿色实线，没有标注步数或方向箭头，与已访问区域在深色地图上区分度一般。
4. 缺少「路径代价构成」的展示（比如高代价段占了几步），任务正文强调代价差异时没有落到界面层。

## 十轮评审改进记录

本轮由模型 MiniMax M3.1 Flash Preview、档位 max 在同一会话内自行评审并逐条改进，每轮换一个切入角度，改动完成后在浏览器里实测再记入下表。历史输入与历史产物未被覆盖。

- **第 1 轮**：搜索循环只推进状态没有重绘，界面看起来不运行；已在定时器每步后补 draw()，运行/暂停/单步的真实状态同步可见。
- **第 2 轮**：BFS 未记录前驱，导致路径步数与代价恒为 0；已改为出队入队时写入 prev，并去掉 O(n) 的 queue.includes 去重。
- **第 3 轮**：setPointerCapture 未做保护，异常会中断后续交互；已改为 try/catch。
- **第 4 轮**：画布高度按宽度固定，统计条与图例被挤出首屏；已按视口高度限制画布并同步收窄宽度，保持格子为正方形。
- **第 5 轮**：补 prefers-reduced-motion 与 :focus-visible 样式。
- **第 6 轮**：整图对比求解器——原先只能逐步动画看一种算法，无法直接回答「A* 和 Dijkstra 在同一张图上各访问多少格」。新增 solveWhole(mode) 一次性跑完整张图，并在「三算法对比」面板里并列三者的步数、总代价、已访问数、耗时。实测在带高代价走廊的预设上：加权 A* 与 Dijkstra 路径代价同为 45（A* 一致性成立），A* 只访问 117 格而 Dijkstra 访问 956 格。
- **第 7 轮**：不可达诊断——搜索失败时原先只说「未找到路径」，无法区分「终点被墙围死」和「起点根本出不去」。新增 analyseReachability() 洪水填充，统计起点的可达区域大小与终点四邻被堵的方向数，并据此给出具体原因。
- **第 8 轮**：键盘操作与播报——方向键移动光标、空格放置当前工具、Esc 取消选择；新增 aria-live 区域播报格子信息；补齐 focus-visible 焦点环。
- **第 9 轮**：编辑效率——按住 Shift 可拖出矩形批量刷墙 / 刷高代价格，不用逐格点击；光标所在格子的坐标、地形、可通行性实时显示在检视条里。
- **第 10 轮**：共享求解内核去重——动画逐步搜索、整图对比、可达性诊断三处原本各写了一份邻接、路径还原与代价统计。统一成 neighbours() / reconstruct() / pathMetrics() / countVisited() 四个函数，并删掉遗留的 DIRS 常量，杜绝三处规则不一致。

以上每条改动也登记在本目录 `run.json` 的 `changes` 字段，可与本表逐条对照。

## 轮次归并与批次汇总

本次后续导入是同一轮测试的更新结果，现已合并到此前归档的实验记录，不另建第 4 轮。普通主题沿用第 3 轮记录；蓝皮书 v1/v2 沿用各自已有的记录 ID。

- 本批：11 个主题案例、12 条实验记录（蓝皮书含 v1/v2）。
- Max 五小时额度累计消耗：108%（此前 44% + 本次 64%）。
- 累计耗时：2h 8m 32s（57m 10s + 1h 11m 22s）。
- 累计 Token：156M。
- 执行备注：自我审查十轮。以上额度消耗、耗时和 Token 为批次口径，不拆分到单案例。

<!-- archive:start -->
## 当前归档信息（自动生成）

- 实验 ID：`pathfinding-lab--minimax-m3-1-flash-preview-max-r03`
- 模型：MiniMax M3.1 Flash Preview；推理档位：max
- 执行模式：按原任务执行；备注：自我审查十轮
- 类型：single-html；预览：static；网络：offline
- [完整原始输入快照](prompt.md) · [主题与其他版本](../../../../topic.html?id=pathfinding-lab)
- 输入记录：完整原始输入，等同于主题任务正文 v1（未增删），保存于本目录 prompt.md。
- 工具：Claude Code。Claude Code 会话内直接执行，模型 minimax-m3-1-flash-preview、档位 max；未使用子代理，未参考任何历史实现或远程分支。
- 运行方式：浏览器直接打开本目录入口；CDN/外部素材需要联网。
- 费用记录：MiniMax 批次合计 108 %（Max 订阅套餐五小时额度）（12 个案例；批次 minimax-m3-1-flash-preview-max-2026-10-14；未记录单案例费用）
- [实验室入口](../../../../demos/pathfinding-lab/runs/minimax-m3-1-flash-preview-max-r03/index.html)

### 部署适配记录

- 第 1 轮：搜索循环只推进状态没有重绘，界面看起来不运行；已在定时器每步后补 draw()，运行/暂停/单步的真实状态同步可见。
- 第 2 轮：BFS 未记录前驱，导致路径步数与代价恒为 0；已改为出队入队时写入 prev，并去掉 O(n) 的 queue.includes 去重。
- 第 3 轮：setPointerCapture 未做保护，异常会中断后续交互；已改为 try/catch。
- 第 4 轮：画布高度按宽度固定，统计条与图例被挤出首屏；已按视口高度限制画布并同步收窄宽度，保持格子为正方形。
- 第 5 轮：补 prefers-reduced-motion 与 :focus-visible 样式。
- 第 6 轮：整图对比求解器——原先只能逐步动画看一种算法，无法直接回答「A* 和 Dijkstra 在同一张图上各访问多少格」。新增 solveWhole(mode) 一次性跑完整张图，并在「三算法对比」面板里并列三者的步数、总代价、已访问数、耗时。实测在带高代价走廊的预设上：加权 A* 与 Dijkstra 路径代价同为 45（A* 一致性成立），A* 只访问 117 格而 Dijkstra 访问 956 格。
- 第 7 轮：不可达诊断——搜索失败时原先只说「未找到路径」，无法区分「终点被墙围死」和「起点根本出不去」。新增 analyseReachability() 洪水填充，统计起点的可达区域大小与终点四邻被堵的方向数，并据此给出具体原因。
- 第 8 轮：键盘操作与播报——方向键移动光标、空格放置当前工具、Esc 取消选择；新增 aria-live 区域播报格子信息；补齐 focus-visible 焦点环。
- 第 9 轮：编辑效率——按住 Shift 可拖出矩形批量刷墙 / 刷高代价格，不用逐格点击；光标所在格子的坐标、地形、可通行性实时显示在检视条里。
- 第 10 轮：共享求解内核去重——动画逐步搜索、整图对比、可达性诊断三处原本各写了一份邻接、路径还原与代价统计。统一成 neighbours() / reconstruct() / pathMetrics() / countVisited() 四个函数，并删掉遗留的 DIRS 常量，杜绝三处规则不一致。
- 同轮更新归档：测试分支后续更新的完整产物、执行记录和文档已并入本条实验记录，不另建新轮次。来源：F:/dev/ai-coding-demo-test（model-test-base）/demos/pathfinding-lab/runs/minimax-m3-1-flash-preview-max-r01。
- 维护者于 2026-10-22 按 v3 对本轮桌面、手机及补充状态逐图重评并绑定 captures 证据；旧截图和 v2 评分见 catalog/score-reviews/2026-10-21-v3-source.json。未重跑模型或改写实验源码，截图不证明完整功能、算法、手势或性能。
<!-- archive:end -->
