A_star算法

article/2025/10/2 19:16:19

A*算法

A* 搜索算法,即A star search algorithm,简称A* 算法。 是一种在图形平面上对于多个节点的路径求出最低通过成本的算法。是对图的遍历和最佳优先搜索算法,也是对BFS的改进。其思想在于为每个状态建立启发函数,用启发函数制约搜索沿着最有效的方向行进。

在这里插入图片描述

如图为八数码,求将左图变为右图需要的步骤。传统的BFS算法是将0四周的数与0交换,然后将其放入队列中,通过盲目地对有限的数据进行尝试最后求得答案,这样的时间复杂度较为复杂。而A*算法中通过加入启发函数对搜索的优先次序进行约束,以最快的方式得到答案。即 f ( n ) = g ( n ) + h ( n ) f(n) = g(n) + h(n) f(n)=g(n)+h(n),其中 g ( n ) g(n) g(n)为该状态的实际情况, h ( n ) h(n) h(n)为启发函数,而得到的 f ( n ) f(n) f(n)即是对状态的估价,用于安排搜索的优先顺序。在该图中, g ( n ) g(n) g(n)为此刻矩阵的状态, h ( n ) h(n) h(n)为此刻的矩阵与目标矩阵值不同的坐标的数量。

定理:

定义起点** s s s** ,终点** t t t** ,从起点(初始状态)开始的距离函数 g ( x ) g(x) g(x) ,到终点(最终状态)的距离函数 h ( x ) , h ∗ ( x ) h(x),h^{*}(x) h(x),h(x) ,以及每个点的估价函数 f ( x ) = g ( x ) + h ( x ) f(x) = g(x) + h(x) f(x)=g(x)+h(x)

A*算法每次从优先队列中取出一个 ** f f f**最小的元素,然后更新相邻的状态。

如果 h ≤ h ∗ h \le h^* hh,则 A* 算法能找到最优解。

上述条件下,如果** h h h**满足三角形不等式,则 A*算法不会将重复结点加入队列。

当时 h = 0 h = 0 h=0,A*算法变为Dijkstra;当并且边权为时变为 BFS。

证明:

复杂度分析:

外循环中每次从open中取出点,共取n次,

内循环:遍历它的邻接点 n ( E ) n(E) n(E),并将这些邻接点放入open中,对open进行排序,open表大小是 O ( n ) O(n) O(n)量级的,若用快排就是 O ( n l o g n ) O(n~log~n) O(n log n),内循环总的复杂度为 O ( n ∗ l o g n + E ) = O ( n ∗ l o g n ) O(n*logn+E)=O(n*logn) O(nlogn+E)=O(nlogn)

总复杂度为 O ( n 2 ∗ l o g n ) O(n^2*logn) O(n2logn)

题目分析:

【八数码难题】

题目描述

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。

输入格式

输入初始状态,一行九个数字,空格用0表示

输出格式

只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)

输入输出样例

输入 #1复制

283104765

输出 #1复制

4

题目来源:https://www.luogu.com.cn/problem/P1379

试题解析:

首先,我们创建两个字符串,str_s用于读入起始状态,str_e用于存储目标状态,在样例中即为str_s=“283104765”,str_e=“123804765”。然后将起始状态读入。

创建a_star函数,利用STL中的unordered_map函数创建哈希表:unordered_map<string,int>dist(用于存储由起始状态到状态的变化次数)和unordered_map<string,bool>vis(用于表示该状态是否被访问过)。然后是优先队列priority_queue<pair<int,string>,vector<pair<int,string>,greater<pair<int,string>>>q,该优先队列用于存储每个点的估价函数,即 f ( n ) = g ( n ) + h ( n ) f(n) = g(n) + h(n) f(n)=g(n)+h(n),然后根据估价函数进行小根堆排序,估价距离目标状态最近的状态优先弹出。

不断访问并弹出队头元素,如果该状态已经被访问过,则取下一个元素,直到队头状态未被访问为止。将该状态标记为true,表示其已经被访问过。将字符串遍历一遍,找到0的位置,将其在二维数组中的坐标表示出来(当前下标/3为x,当前下标%3为y)。然后根据其二维坐标进行交换,分别上下左右四个坐标交换,如果交换之后的状态未曾出现或者可以更新为更短的距离,则更新,然后加入到队列中。

最后返回目标状态的dist即可。

#include<bits/stdc++.h>
using namespace std;string str_s, str_e = "123804765";//起始状态和目标状态int f(string start)//求该状态的估价函数
{int res = 0;for (int i = 0; i < 9; i++)if (start[i] != str_e[i])res++;return res;z
}int a_star(string start)
{int mx[4]{ 0,-1,0,1 }, my[4]{ -1,0,1,0 };//偏移数组,用于交换坐标点unordered_map<string, int>dist;//存储距离unordered_map<string, bool>vis;//标记该状态是否访问过priority_queue < pair<int, string>, vector<pair<int, string>>, greater<pair<int, string>>>q;//优先队列q.push({ f(start),start });//存入该状态的估价函数和状态while (!q.empty()){auto t = q.top();//取队头元素q.pop();if (t.second == str_e)break;//如果当前弹出的状态于目标状态一致时,则退出循环if (vis[t.second])continue;//如果该状态被访问过时,逃过本次循环string p = t.second;vis[p] = 1;int step = dist[p];int x, y;for (int i = 0; i < 9; i++)//遍历得到0的坐标if (p[i] == '0'){x = i / 3, y = i % 3;break;}for (int i = 0; i < 4; i++){int a = x + mx[i], b = y + my[i];if (a < 0 || a >= 3 || b < 0 || b >= 3)continue;//如果交换之后的坐标越界,则跳过本次操作swap(p[x * 3 + y], p[a * 3 + b]);//将两坐标交换if (!dist.count(p) || dist[p] > step + 1)//状态为存储或能更新为更小值{dist[p] = step + 1;//更新状态q.push({ dist[p] + f(p),p });//将状态加入优先队列中}swap(p[x * 3 + y], p[a * 3 + b]);//将状态复原}}return dist[str_e];//返回移动步骤次数
}int main()
{cin >> str_s;cout << a_star(str_s) << endl;return 0;
}

http://chatgpt.dhexx.cn/article/oUOHsbOE.shtml

相关文章

A star算法

A star算法介绍 我们在解空间搜索问题的可行解或者最优解时常用宽度优先搜索(BFS)或者深度优先搜索(DFS)&#xff0c;但是有时候会扩展出很多无用节点&#xff0c;搜索时间较长&#xff0c;而A*算法则是选择当前估计成本最低的节点进行扩展&#xff0c;图示如下: g(n)为从起始…

【A星算法】A星寻路算法详解(小白也可以看懂+C#代码+零基础学习A*)

1.问题背景 在制作RPG游戏角色和NPC移动时&#xff0c;需要角色自动避开障碍物&#xff0c;到达终点 怎么快速找到一条到达终点的路径&#xff1f; 使用a星寻路算法 2.A星算法的思路 绿色&#xff1a;起点&#xff1b;红色&#xff1a;终点 &#xff1b;黑色&#xff1a;障碍…

A-star算法自学

搜索过程 广度优先搜索&#xff08;BFS&#xff09;算法与Dijsktra算法的结合&#xff0c;可以得出最短的路径。 将地图信息通过划分为方形或者其他多边形格子的方法进行表示&#xff0c;便于利用二维数组存放地图信息&#xff0c;每个格子有可行和不可行两种状态&#xff1b;…

python3.6实现的A星算法

A星算法原理: 原理我就不再赘述,可以参考这篇博客https://blog.csdn.net/hitwhylz/article/details/23089415 最近用js写了一遍&#xff0c;用的同样的算法&#xff0c;需要js代码的看这里&#xff1a;https://blog.csdn.net/qq_39687901/article/details/85697127 代码实现: …

A星寻路算法介绍

你是否在做一款游戏的时候想创造一些怪兽或者游戏主角&#xff0c;让它们移动到特定的位置&#xff0c;避开墙壁和障碍物呢&#xff1f; 如果是的话&#xff0c;请看这篇教程&#xff0c;我们会展示如何使用A星寻路算法来实现它&#xff01; 在网上已经有很多篇关于A星寻路算…

对A星算法的理解

1、A*算法的**搜索区域 ** 传统A星算法是将地图简化成栅格&#xff0c;计算路径时是用每个栅格的中心点作为单位进行计算。 搜索区域分为两部分&#xff1a;开放列表和封闭列表 开放列表可以进行访问&#xff0c;封闭列表则不可以访问&#xff08;包括不可走 (unwalkable) 的方…

A星算法(Java实现)

一、适用场景 在一张地图中&#xff0c;绘制从起点移动到终点的最优路径&#xff0c;地图中会有障碍物&#xff0c;必须绕开障碍物。 二、算法思路 1. 回溯法得到路径 (如果有路径)采用“结点与结点的父节点”的关系从最终结点回溯到起点&#xff0c;得到路径。 2. 路径代…

A-Star(A*)算法

【由于专栏后几篇限制vip观看&#xff0c;我又把完整算法在公众号“武汉AI算法研习”进行了发布&#xff0c;可以查看全专栏文章。】 A-Star(A*)算法作为Dijkstra算法的扩展&#xff0c;在寻路和图的遍历过程中具有一定的高效性。 【适用范围】静态图搜索 【算法流程】A-Sta…

A星算法代码

A星算法代码python3实现 前言一、A*&#xff1f; A星1.一个搜索算法2.结果展示 二、使用环境1.python 3.x2.一些解释说明 一些话 前言 产生本文的缘由 学校计科课程要求的小作业, 在csdn上看了好多, 记录一下自己的学习 以下是本篇文章正文内容 一、A*&#xff1f; A星 1.一…

A星算法(基于matlab)

概述 基于上一篇文章提到的DFS算法和BFS算法 A星算法属于图这种数据结构的搜索算法&#xff0c;对比于树的遍历搜索&#xff0c;需要考虑到的问题是&#xff1a;同一个节点的重复访问&#xff0c;所以需要对于已经访问过的节点进行标记。 曼哈顿距离&#xff1a; 在几何度量空…

【A星算法】--第四篇(A星算法)

本篇主要介绍A星算法的过程&#xff1a; * 把起始节点加进openList * while openList 不为空 { * 当前节点 openList 中成本最低的节点 * if&#xff08;当前节点 目标节点&#xff09;{ * 路径完成 …

A星算法详解(个人认为最详细,最通俗易懂的一个版本)

A* 寻路算法 原文地址&#xff1a; http://www.gamedev.net/reference/articles/article2003.asp 概述 虽然掌握了 A* 算法的人认为它容易&#xff0c;但是对于初学者来说&#xff0c; A* 算法还是很复杂的。 搜索区域(The Search Area) 我们假设某人要从 A 点移动到 B 点&…

A星算法理解

A星算法理解 1.选择A星算法的原因 为了进行路径规划算法是不可回避的&#xff1a;启发式搜索算法是比较常规的一类算法就是在状态空间中的搜索对每一个搜索的位置进行评估&#xff0c;得到最好的位置&#xff0c;再从这个位置进行搜索直到目标。这样可以省略大量无谓的搜索路…

A星(A*, A Star)算法详解

MulinB按&#xff1a;经典的智能寻路算法&#xff0c;一个老外写的很透彻很清晰&#xff0c;很容易让人理解神秘的A*算法。以下是一个中文翻译版。 A*寻路初探 GameDev.net 作者&#xff1a; Patrick Lester 译者&#xff1a;Panic 2005年3月18日 译者序&#xff1a;很久以前就…

A星算法

A星算法 1.简述 A星算法就是试图在地图中找到一条最短路径&#xff0c;但不保证一定存在。 任务 小猫去找青蛙玩&#xff08;好TM弱智啊~&#xff09;条件 黑色方块无法通行&#xff0c;每走一个格子小猫消耗的体力都为1。 2.如果说你是小猫&#xff0c;你会怎么走&#xf…

A星算法说明

A*算法说明 文章目录 前言原理说明如何构造 h ( n ) h(n) h(n)一、欧氏距离二、曼哈顿距离三、其他 关于 g ( n ) g(n) g(n)路况设置如何实现 完整的流程搜索过程图示允许斜走&#xff0c;使用优先队列禁止斜走&#xff0c;使用优先队列允许斜走&#xff0c;使用普通队列禁止斜…

A星算法优化(一)启发函数

基于Python语言对A星算法进行优化&#xff1a;(视频中会拿python与matlab作对比) 源码地址&#xff1a;https://github.com/Grizi-ju/ros_program/blob/main/path_planning/Astar.py B站详解视频&#xff1a;https://www.bilibili.com/video/BV1FL4y1M7PM?spm_id_from333.999…

猴子都能看懂的A星算法原理

文章目录 A星算法基本原理什么是寻路算法算法的思路 算法实现脚本1————cconst.cs脚本2————AStar.cs Unity演示演示样例一演示样例二演示样例三演示样例四 俗话说&#xff0c;好记性不如烂笔头&#xff0c;对于有了解过寻路算法的同学&#xff0c;对于A星算法应该不陌生…

A星寻路算法详解(C++实现 完整代码+图片演示 )

文章目录 三种寻路算法 A星寻路算法A星寻路算法思想A星寻路准备A星寻路过程&#xff08;图例&#xff09;A星寻路代码&#xff08;完整&#xff09; 三种寻路算法 深度寻路算法&#xff1a;不一定能找到最佳路径&#xff0c;但是寻路快速&#xff0c;只能走直线。广度寻路算法…

A星(A*、A Star)路径规划算法详解(附MATLAB代码)

首先看看运行效果&#xff0c;分别有三种模式&#xff0c;代码运行前需要通过鼠标点击设置起点和终点。 第一种模式直接输出最短路径 第二种模式输出最短路径的生成过程 第三种模式输出最短路径的生成过程和详细探索的过程 代码获取 gitee链接&#xff1a;https://gitee.c…