目录
前言
A.建议
1.学习算法最重要的是理解算法的每一步,而不是记住算法。
2.建议读者学习算法的时候,自己手动一步一步地运行算法。
B.简介
A*搜索算法(A-Star Search Algorithm)是一种启发式搜索算法,主要用于在图形或网络结构中寻找从起始节点到目标节点的最短路径。它结合了Dijkstra算法确定性的最优性(保证找到的是实际最短路径)和Best-First Search(最佳优先搜索)的高效性(通过启发式信息指导搜索方向),在保证找到最优解的同时尽可能减少搜索范围。
一 代码实现
数据结构定义: 首先,我们需要定义一些数据结构来表示搜索空间中的节点。每个节点通常包含位置信息、从起始点到该节点的代价 g(n)
、估计到达目标点的成本 h(n)
以及父节点引用。
typedef struct Node {
int x, y; // 假设这是一个二维地图上的节点坐标
double g; // 从起始节点到当前节点的实际代价
double h; // 到达目标节点的启发式估计代价
double f; // f(n) = g(n) + h(n),综合评估函数值
struct Node* parent; // 指向父节点的指针,用于追踪路径
} Node;
// 可能还会有用于存储整个地图或开放列表和关闭列表的数据结构
初始化: 初始化起始节点,设置其 g
值为0,计算 h
值,并将起始节点添加到开放列表中。
Node start;
start.x = startX;
start.y = startY;
start.g = 0;
start.h = heuristic(start, target); // 使用某种启发式函数计算初始h值
start.f = start.g + start.h;
pushToOpenList(&start);
启发式函数: 定义一个启发式函数,它提供了一种对从当前节点到目标节点距离的估算。例如,在网格环境中,可以使用曼哈顿距离或欧几里得距离作为启发式函数。
double heuristic(Node current, Node goal) {
return abs(current.x - goal.x) + abs(current.y - goal.y); // 曼哈顿距离
// 或者
return sqrt(pow((current.x - goal.x), 2) + pow((current.y - goal.y), 2)); // 欧几里得距离
}
开放列表与关闭列表管理: 创建两个集合,一个是开放列表(Open List),存放待检查的节点;另一个是关闭列表(Closed List),存放已检查过的节点。
搜索循环: 在每一步迭代中,从开