一、环境建模
-
地图表示方式
使用二维网格地图(Grid Map)表示搜索空间,令地图大小为 M×NM \times N,每个网格代表一个节点。-
值为
0
表示可通行区域,1
表示障碍物。 -
起点记为
S(x_s, y_s)
,终点记为G(x_g, y_g)
。
-
-
邻域定义
-
4邻域:上下左右四个方向 (0,1),(1,0),(0,−1),(−1,0)(0,1), (1,0), (0,-1), (-1,0)
-
8邻域:增加对角线 (1,1),(−1,1),(−1,−1),(1,−1)(1,1), (-1,1), (-1,-1), (1,-1)
-
16邻域:引入更远的方向,如 (2,1),(1,2),(−2,1),(−1,2),…(2,1), (1,2), (-2,1), (-1,2), \ldots,共16个可选方向,需设定合理代价。
-
二、代价函数设计
A星算法核心使用以下总代价函数:
f(n)=g(n)+h(n)f(n) = g(n) + h(n)
-
g(n)g(n):从起点到当前节点 nn 的实际代价
-
h(n)h(n):从当前节点 nn 到目标点的启发式估计(启发函数)
常用启发函数:
-
4邻域:曼哈顿距离 h(n)=∣x−xg∣+∣y−yg∣h(n) = |x - x_g| + |y - y_g|
-
8邻域:对角线距离或欧几里得距离
-
16邻域:可使用欧几里得距离,也可根据方向设定分段代价函数
三、A星搜索流程
-
初始化开放列表和封闭列表
-
开放列表存储候选节点(按照 f 值排序)
-
封闭列表记录已访问节点
-
-
主循环逻辑
-
每次从开放列表取出 f 最小节点
-
如果该节点为终点,终止并回溯路径
-
否则对其邻居执行:
-
若不在封闭列表中,计算 g、h、f 值
-
判断是否更新已有路径(若 g 更小)
-
-
-
路径回溯
-
终点找到后,通过每个节点的父节点回溯路径
-
四、建模扩展考虑
-
节点代价权重可扩展为非均匀地图(如泥泞、草地等)
-
邻域跳跃代价设计:16邻域中,远跳应设更高的 g 增量
-
可视化建模:使用 Python 的
matplotlib
或pygame
可视化路径搜索过程 -
障碍膨胀(Obstacle Inflation):模拟真实导航中安全边距