一. 算法步骤:
1. 初始化图,openlist,closedlist
2. 将起点加入openlist,
3. 在openlist中寻找启发函数值F=G+H最小的节点v,
4. 将v从openlist中删除,
5. 将从openlist中删除的节点v加入closedlist
6. 对于节点v周围的8个节点v1而言:
如果v1是障碍物或者已经处于closedlist中了,则不做任何处理
如果v1不在openlist中则将v1加入openlist中
如果v1已经在openlist中,则比较v1经过v到达起点的代价G1是否比之前的代价G0要小,如果G1大于G0,不做任何处理,如果G1<G0,则将v1的父节点设为v,并更新F=G1+H的值,
7. 如果终点goal也位于openlist中,说明路径已经找到,否则返回步骤3进行循环
8. 如果openlist为空,终点还没有找到,则说明路径不存在
9. 最后从终点gaol通过其父节点回溯,寻找起点到终点的路径。
二. 算法实现
用C++实现A*, 其中包含两个对象,节点对象,及A*路径搜索对象。
节点类可以如下定义:
1. AStarNode:
#include<algorithm>
class AStarNode
{
public:
int x; //节点的x坐标
int y; //节点的y坐标
int F; // 节点总代价
int G; // 节点到起点的代价
int H; // 节点到终点的代价
AStarNode *parent; // 节点的父节点
AStarNode & operator=(const AStarNode &node)
// 重载=号运算符,因为含有指针成员parent,需要进行深拷贝,把parent指向的对象也重新复制一份
{
x = node.x;
y = node.y;
F = node.F;
G = node.G;
H = node.H;
if (node.parent != NULL)
parent = new AStarNode(*node.parent);
else
parent = NULL;
return *this;
}
void cal_F()
{
F = G + H;
}
void cal_G(AStarNode* cur_point)
{
int tempG