为A *算法编写启发式函数

时间:2015-06-26 12:35:41

标签: c++ algorithm heuristics

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

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

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

1 个答案:

答案 0 :(得分:2)

正如@Vesper在评论中所说,A *是要走的路。至于启发式......

如果您的机器人仅限于向左/向右和向上/向下移动,通常是曼哈顿(或Taxicab L 1 )distance用作启发式函数:

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

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

如果您的机器人可以在对角线上移动,则曼哈顿距离不再允许,因此您可以使用Euclidean(或 L 2 )距离:

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

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

这使得欧几里德距离不仅可以允许对角线运动(任何角度),也可以允许上面的情况,其中运动被限制在x和y方向。但是在运动受限的情况下,曼哈顿距离通常会给出更接近实际路径长度的路径长度,因此可以加快寻路速度,并且计算速度更快。