为a*算法编程一个启发式函数
Program a heuristic function for A* algorithm
我必须对机器人进行编程,以找到到目标位置的最短距离。在包含随机位置的障碍物的竞技场中(事先未知)。
问题是,我将得到一个表示网格的数组。在该网格中,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方向的情况。但在移动受限的情况下,曼哈顿距离通常会给出一个更接近实际路径长度的路径长度,因此可能会加快寻路速度,计算速度也更快。
相关文章:
- 在一个模板函数中,若输入的类型是enum类,我该如何使用std::underlying_type
- 如何制作一个将函数作为参数的类方法
- 如何将指针从一个void函数传递到另一个C++
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- A*算法中魔方的启发式函数 人工智能
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 将值传递到另一个类函数在打印时为零
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?
- 我用字符串做了一个C++构造函数,但它不会打印出字符串
- 如何将一个 void 函数传递给另一个 void 函数?
- 类函数返回到另一个类函数返回打印不同的值
- 有一个构造函数,但有两个析构函数
- 无法将指向类的成员函数的函数指针作为参数传递给同一类的另一个成员函数
- 在模板化的 Rcpp 函数中调用另一个 cpp 函数
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- 使用带有一个参数函数的递归找到数字的平方
- 我已经创建了一个模板函数,但是在检查输入是奇数还是偶数时收到错误 C++.
- 为a*算法编程一个启发式函数