C语言经典算法之A*搜索算法

目录

前言

A.建议

B.简介

一 代码实现

二 时空复杂度

A.时间复杂度(Time Complexity):

B.空间复杂度(Space Complexity):

C.总结

三 优缺点

A.优点:

B.缺点:

四 现实中的应用


前言

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),存放已检查过的节点。

搜索循环: 在每一步迭代中,从开

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JJJ69

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值