fix: 高度偏好默认关闭 —— 它让寻路器完全规划不出路径(自动扩地的直接拦路虎)
实测定位:高度偏好的启发值实现与 mineflayer-pathfinder 的内部约定冲突。 该库每次 compute() 返回 partial 时,用 h 最小的节点当 partial 路径的终点 (astar.js: if (neighborNode.h < this.bestNode.h) this.bestNode = neighborNode), 而 AltitudeGoal 把 h 减去了 权重 × y,于是「又高又偏」的节点 h 反而更小, partial 路径被引向高处而不是目标附近 —— A* 一直在算、永不收敛, 机器人一次移动指令都发不出来。 王城平台上的对照实测(其余配置完全相同): - altitudePreference = true → inputTicks = 0,任务永远停在「寻路超时,重新寻路」 - altitudePreference = false → inputTicks = 237,立刻开始移动 顺带排除:searchRadius 从 -1 改到 128 对结果没有任何影响, 所以不是「搜索空间无界」导致的;pathfinder 与 manual 两种执行器表现一致。 改动: - expansionConfig 默认 altitudePreference 改为 false,并在注释里写清原因与 「想重新启用应该怎么做」(把偏置改成低处加移动代价,保持启发值只反映真实距离); - AltitudeGoal 的类注释补上完整推导与实测数据,避免以后有人又把它打开; - 新增回归用例:断言默认关闭,并用启发值差值把「为什么必然出问题」固化下来。 测试 468 → 469,全绿。
这个提交包含在:
+24
@@ -2,6 +2,30 @@
|
||||
|
||||
本项目遵循 [约定式提交](https://www.conventionalcommits.org/zh-hans/) 与 [语义化版本](https://semver.org/lang/zh-CN/)。
|
||||
|
||||
## [1.9.1] - 2026-10-01
|
||||
|
||||
**修复「寻路器完全规划不出路径」** —— 这是自动扩地跑不起来的直接原因。
|
||||
|
||||
### 修复
|
||||
|
||||
- **高度偏好(`altitudePreference`)默认关闭**:它的启发值实现与
|
||||
mineflayer-pathfinder 的内部约定冲突。该库每次 `compute()` 返回 `partial` 时,
|
||||
用 **`h` 最小**的节点当作 partial 路径的终点
|
||||
(`astar.js`: `if (neighborNode.h < this.bestNode.h) this.bestNode = neighborNode`),
|
||||
而 `AltitudeGoal` 把 `h` 减去了 `权重 × y`,于是「又高又偏」的节点胜出,
|
||||
partial 路径被引向高处而不是目标附近 —— 表现为 A* 一直在算、永不收敛,
|
||||
**机器人一次移动指令都发不出来**。
|
||||
- 实测(王城平台上,其余配置完全相同):开启 `inputTicks = 0`、任务永远停在
|
||||
「寻路超时,重新寻路」;关闭 `inputTicks = 237`、立刻开始移动。
|
||||
- `searchRadius` 从 -1 改到 128 对此**没有影响**,所以不是搜索空间无界导致的。
|
||||
- 想重新启用,应把偏置改成**低处加移动代价**(改 `getNeighbors` 的 `cost`),
|
||||
保持启发值只反映到目标的真实距离。`AltitudeGoal` 的注释里记了完整推导。
|
||||
|
||||
### 测试
|
||||
|
||||
新增 1 个回归用例(468 → 469):断言高度偏好默认关闭,并用启发值差值
|
||||
把「为什么它必然出问题」固化下来。
|
||||
|
||||
## [1.9.0] - 2026-09-29
|
||||
|
||||
补上诊断「走不动」的最后一块拼图:抓包只能看到「客户端发了什么」,
|
||||
|
||||
在新工单中引用
屏蔽一个用户