A*算法详解

一、什么是A*算法

A*算法是一种启发式搜索算法,它在寻找从起点到终点的最短路径时极具有效性和实用性。它采用估价函数来计算从某个点到目标点的距离,进而选取优先级最高的点进行搜索。相较于其他算法,A*算法拥有更高的搜索效率和准确性。

关于估价函数,需要注意的是,它并不一定要与实际的距离一致,而是根据当前状态下获取的信息进行推导,得出最为可能的结果。A*采用的是启发函数,有较强的启发作用,这是它优于其他算法的优点之一。

二、A*算法的原理

任何搜索算法都需要寻找一种方式来衡量每个节点的价值,然后以某种规则决定查找的先后顺序。A*算法通过综合考虑两个因素来计算每个节点的价值:从起点到当前节点的真实代价(g(x))和从当前节点到终点的估计代价(h(x))。

因此,对于一个节点x,它的总代价就是 f(x) = g(x) + h(x)。在这个算法中,我们希望找到代价最小的点来作为下一个搜索节点。

三、A*算法的实现步骤

1. 构建地图

首先,需要确定起点、终点以及地图的其他状态。地图的构建可以采用矩阵等方式表达。

例如,我们可以使用二维数组来表示地图,1表示可通行,0表示障碍物。

  int[][] map = {
        {1, 1, 1, 1, 0},
        {1, 0, 1, 1, 0},
        {1, 1, 1, 1, 0},
        {0, 0, 0, 1, 0},
        {0, 0, 0, 1, 1}
    };

2. 定义节点和构建搜索树

我们用结构体来定义一个节点,它包括横坐标x、纵坐标y、f(g+h),g和h。我们采用优先队列来存储搜索过程中的所有节点,节点从队首到队尾按照f值的大小递增排序。

deque<pair> q; //定义队列

int vis[111][111] = {}; //记录某个点是否被搜索过

struct node{
int x, y, f, g, h;
};

3. 搜索

使用A*算法实现搜索的主要流程:

(1)将起点节点入队,并将f、g、h值初始化为0。

(2)重复以下操作,直到队列为空或找到了终点节点:

(3)从队列中选取f值最小的节点,并将其出队。

(4)遍历该节点周围的节点,如果找到了终点,返回结果。

(5)如果当前节点未被访问过,更新其f、g、h值,并将其入队。

流程展示:

//起点入队
q.push_back([start_x,start_y,0,0,0]);
while(!q.empty()) {
node a = q.front();
q.pop_front();
vis[a.x][a.y] = 1;
if(a.x == end_x && a.y == end_y) return a.g;
for(int i=0;i<4;i++){
int x = a.x + dx[i], y = a.y + dy[i]; //dx dy 是四个方向
if(x>=1 && x=1 && y<=M && !vis[x][y] && map[x][y]) {
node b; b.x = x; b.y = y; b.g = a.g + 1; b.h = abs(x-end_x)+abs(y-end_y); b.f = b.g + b.h; q.push_back(b);
} } sort(q.begin(),q.end(),cmp);
}
return -1;//没有路径

其中f值的大小可以通过改变启发函数h(x)的取值来实现A*算法的不同策略,例如如果h(x)始终为0,则等同于广度优先搜索。

4. 代码示例

下面是A*算法的完整代码,其中有详细的注释信息。请注意对于实际问题,需要根据具体场景修改代码。

const int dx[4] = {0,-1,0,1}, dy[4] = {1,0,-1,0}; //四个方向
int N = 5, M = 5;  //地图大小
int vis[111][111] = {}; //记录某个点是否被搜索过
int map[111][111] = {};  //存储地图信息

struct node{
    int x, y, f, g, h;
};

bool cmp(const node &a, const node &b){
    return a.f > b.f;
}

int A_star(int start_x, int start_y, int end_x, int end_y){
    deque q;  //定义队列 
    //起点入队
    q.push_back((node){start_x,start_y,0,0,0});
    while(!q.empty()) {
        node a = q.front();
        q.pop_front();
        vis[a.x][a.y] = 1; //标记该点已被搜索过
        if(a.x == end_x && a.y == end_y) return a.g; //找到了终点
        for(int i=0;i=1 && x=1 && y<=M && !vis[x][y] && map[x][y]) { //如果未访问且可通过
                node b;
                b.x = x; b.y = y;
                b.g = a.g + 1;
                b.h = abs(x-end_x)+abs(y-end_y); //曼哈顿距离
                b.f = b.g + b.h;
                q.push_back(b);
            }
        }
        sort(q.begin(),q.end(),cmp); //节点按照f值排序,保证每次搜索最优的点
    }
    return -1; //没有路径
}

int main(){
    //地图的初始化
    int map_array[5][5] = {
        {1, 1, 1, 1, 0},
        {1, 0, 1, 1, 0},
        {1, 1, 1, 1, 0},
        {0, 0, 0, 1, 0},
        {0, 0, 0, 1, 1}
    };
    for(int i=0;i<N;++i){
        for(int j=0;j<M;++j){
            map[i+1][j+1] = map_array[i][j];
        }
    }
    //寻找最短路径
    int step = A_star(1,1,5,5);
    cout<<step<<"\n";
    return 0;
}

原创文章,作者:UBYGL,如若转载,请注明出处:https://www.506064.com/n/360715.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
UBYGLUBYGL
上一篇 2025-02-24 00:33
下一篇 2025-02-24 00:33

相关推荐

  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • Python实现爬楼梯算法

    本文介绍使用Python实现爬楼梯算法,该算法用于计算一个人爬n级楼梯有多少种不同的方法。 有一楼梯,小明可以一次走一步、两步或三步。请问小明爬上第 n 级楼梯有多少种不同的爬楼梯…

    编程 2025-04-29
  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • Harris角点检测算法原理与实现

    本文将从多个方面对Harris角点检测算法进行详细的阐述,包括算法原理、实现步骤、代码实现等。 一、Harris角点检测算法原理 Harris角点检测算法是一种经典的计算机视觉算法…

    编程 2025-04-29
  • 数据结构与算法基础青岛大学PPT解析

    本文将从多个方面对数据结构与算法基础青岛大学PPT进行详细的阐述,包括数据类型、集合类型、排序算法、字符串匹配和动态规划等内容。通过对这些内容的解析,读者可以更好地了解数据结构与算…

    编程 2025-04-29
  • 瘦脸算法 Python 原理与实现

    本文将从多个方面详细阐述瘦脸算法 Python 实现的原理和方法,包括该算法的意义、流程、代码实现、优化等内容。 一、算法意义 随着科技的发展,瘦脸算法已经成为了人们修图中不可缺少…

    编程 2025-04-29
  • 神经网络BP算法原理

    本文将从多个方面对神经网络BP算法原理进行详细阐述,并给出完整的代码示例。 一、BP算法简介 BP算法是一种常用的神经网络训练算法,其全称为反向传播算法。BP算法的基本思想是通过正…

    编程 2025-04-29
  • 粒子群算法Python的介绍和实现

    本文将介绍粒子群算法的原理和Python实现方法,将从以下几个方面进行详细阐述。 一、粒子群算法的原理 粒子群算法(Particle Swarm Optimization, PSO…

    编程 2025-04-29
  • Python回归算法算例

    本文将从以下几个方面对Python回归算法算例进行详细阐述。 一、回归算法简介 回归算法是数据分析中的一种重要方法,主要用于预测未来或进行趋势分析,通过对历史数据的学习和分析,建立…

    编程 2025-04-28
  • 象棋算法思路探析

    本文将从多方面探讨象棋算法,包括搜索算法、启发式算法、博弈树算法、神经网络算法等。 一、搜索算法 搜索算法是一种常见的求解问题的方法。在象棋中,搜索算法可以用来寻找最佳棋步。经典的…

    编程 2025-04-28

发表回复

登录后才能评论