为a*算法编程一个启发式函数

Program a heuristic function for A* algorithm

本文关键字:一个 启发式函数 算法 编程      更新时间:2023-10-16

我必须对机器人进行编程,以找到到目标位置的最短距离。在包含随机位置的障碍物的竞技场中(事先未知)。

问题是,我将得到一个表示网格的数组。在该网格中,0表示可移动空间,1表示障碍物。我必须对它进行编程,以找到到达我选择的目标位置的最短路径,避开所有障碍物(墙)。

A*是解决这个问题的好方法,还是有更好的方法?

正如@Vesper在评论中所说,A*是一条路。至于启发式。。。

如果你的机器人被限制向左/向右和向上/向下移动,通常曼哈顿(或出租车或L1)距离被用作启发式函数:

h(x,y) = |x - x_goal| + |y - y_goal|

显而易见的是,如果没有障碍物,那么将|x - x_goal|向右或向左移动一步,然后将|y - y_goal|向上或向下移动一步(或y,然后x)不能长于到达有障碍物的目标的实际最短路径,因此启发式是可接受的。

如果你的机器人可以在对角线上移动,那么曼哈顿距离就不再是可接受的,所以你可以使用欧几里得(或L2)距离:

h(x,y) = sqrt( (x - x_goal)^2 + (y - y_goal)^2 )

这是两点之间的直线距离,永远不会比任何其他可能的路径长。

这使得欧几里得距离不仅适用于对角线运动(在任何角度),而且适用于上述运动限制在x和y方向的情况。但在移动受限的情况下,曼哈顿距离通常会给出一个更接近实际路径长度的路径长度,因此可能会加快寻路速度,计算速度也更快。