使用Best First Search求解网格s到g首路径的问题咨询
基于Best First Search(曼哈顿距离+多路径剪枝)的网格路径求解步骤
核心纠正:曼哈顿距离就是你的启发值
你之前误以为没有启发值是错误的,曼哈顿距离是Best First Search在这里的核心评估函数,公式为:曼哈顿距离 = |当前格子x坐标 - 终点g的x坐标| + |当前格子y坐标 - 终点g的y坐标|
这个值越小,说明当前格子离终点越近,是优先级队列排序的依据。
完整执行流程(含多路径剪枝)
初始化操作
- 把起点
s放入优先级队列(队列按节点的曼哈顿距离从小到大排序,距离越小越先被取出)。 - 维护一个
已访问集合,初始时把s加入其中(剪枝用,防止重复处理同一格子)。 - 每个节点要记录自身坐标+从
s到它的路径信息。
- 把起点
循环处理队列
- 取出队列头部的节点(当前曼哈顿距离最小的节点)。
- 如果这个节点是终点
g,直接返回它记录的路径——这就是首次找到的符合要求的路径。 - 生成当前节点的上下左右四个相邻节点:
- 筛掉超出网格边界、属于阴影禁区的节点。
- 筛掉已经在
已访问集合里的节点(多路径剪枝:既然之前已经处理过这个格子,说明有更早/更优的路径到达它,无需再处理)。 - 给每个有效相邻节点计算曼哈顿距离,把节点+路径信息加入优先级队列,同时将该节点标记为已访问。
- 重复上述步骤,直到找到终点或队列为空(无路径)。
关键注意点
- Best First Search的核心是每次优先处理离终点最近(曼哈顿距离最小)的节点,所以首次到达终点的路径就是算法给出的结果。
- 多路径剪枝的核心是:一旦某个格子被加入已访问集合,就不再处理任何后续到达它的路径,避免冗余计算和绕路。
内容的提问来源于stack exchange,提问作者Fabian Shamano
相关产品推荐
相关产品推荐

