A*算法

news/2024/11/8 15:12:20/

简介:

   A*算法是一个种静态路网中求解最短路径最有效的直接搜索方法,是一种启发式搜索

地图:

 

大致思路:

首先要有一个开启列表和一个关闭列表

开启列表中用来存放所有可能走的点(可以使用优先队列)

关闭列表中存放所有走过的点

1:先将起点加入开启列表中

2:在开启列表中找到F值最低的点(F值的计算下面讲)

3:将该点加入到关闭列表中,并从开始列表中移除

4:遍历该点的周围8格

{

      如果不能走,或者在关闭列表中,则continue

      否则判断是否在开启列表中,如果在就继续比较该点当前的G值和原来的G值,并更新状态,更新该点的父节点

      如果不在开启列表,则计算GHF值,设置父节点

      判断是否找到最终点,如果找到退出循环,否则重复循环

}

5:当开启列表不为空,或者没有找到最终点时,一直循环234,当开启列表为空时,则表示没有找到点

 

GHF值的计算:

f(n):从起点到终点的估计代价值,f(n)=g(n)+h(n)

g(n):从起点到节点的实际代价值,g(n)=当前代价值+父节点的g值,方便计算,将距离都*10,直边:10,斜边:14

h(n):从节点到达终点的估计代价值,一般用2种计算方式,欧几里和曼哈顿

欧几里:斜边长度(2点间距离公式)

曼哈顿:x的距离差+y的距离差

 

代码:

void AStar::Astar()  
{  Point begin;  begin.x = hero.x;  begin.y = hero.y;  begin.f = begin.g = begin.h = 0;  begin.next = nullptr;  OpenList.push_back(begin);                                                              //将起始点放入关闭列表中  while (!OpenList.empty())  {  OpenList.sort(AStar());                                                             //将开启列表按f值从小到大排序  CloseList.push_back(OpenList.front());                                              //将开启列表的f值最小的点,加入关闭列表中  OpenList.pop_front();                                                               //将该点从开启列表中删除  for (int i = 0; i < 8; i++)  {  Point Temp;  Temp.x = CloseList.back().x + nextX[i];   Temp.y = CloseList.back().y + nextY[i];  if (map[Temp.x][Temp.y] == 1 || true == Find(Temp.x, Temp.y))                   //该点不为墙,或者该点不在关闭列表中  continue;  if (false == Judge(i))                                                          //判断该点能不能走  continue;  Temp.g = CloseList.back().g + (int)sqrt(abs(nextX[i]) + abs(nextY[i])) * 10;    //计算点的g值  Temp.h = (abs(target.x - Temp.x) + abs(target.y - Temp.y)) * 10;                //计算点的h值  Temp.f = Temp.g + Temp.h;                                                       //计算点的f值  Temp.next = &CloseList.back();                                                  //设置父节点  if (false == FindOpen(Temp))  {  OpenList.push_back(Temp);                                                   //将该点加入开启列表中  }   if (true == Find(target.x, target.y))                                           //找到目标点,结束函数  {  return;  }  }  }  
}  

 


http://www.ppmy.cn/news/547607.html

相关文章

交互原型案例Axure50套

百度网盘链接下载&#xff1a;https://pan.baidu.com/s/19Ghf5VFlrAZDhj43O5L0HA 提取码&#xff1a;4wuh 想了解更多Axure资讯&#xff0c;赶快下方扫码加入【Axure修炼手册】微信公众号吧&#xff01;&#xff01;&#xff01;

a*自动寻路算法详解

这篇博文是在其他博客基础上加工的&#xff0c;主要原因是感觉原博客举得例子不太好&#xff0c;很多细节感觉没有描述。 A*算法主要是在父节点更新那个地方很容易误解&#xff0c;但是父节点的更新又是A*算法的核心&#xff0c;因为遍历到目标节点之后就是根据父节点回溯返回…

常见算法合集[java源码+持续更新中...]

一、引子 本文搜集从各种资源上搜集高频面试算法&#xff0c;慢慢填充...每个算法都亲测可运行&#xff0c;原理有注释。Talk is cheap,show me the code! 走你~ 二、常见算法 2.1 判断单向链表是否有环 1 package study.algorithm.interview;2 3 /**4 * 判断单向链表是否有环…

OpenFOAM中参考压力p_rgh的由来

在OpenFOAM的动量方程UEqn.H中经常能看到以下代码&#xff1a; solve (UEqnfvc::reconstruct((- ghf*fvc::snGrad(rho)- fvc::snGrad(p_rgh))*mesh.magSf()) ); 其中p_rgh为参考压力&#xff0c;它是通过将压力p拆分得到的&#xff0c;如下式&#xff1a; $$\begin{equation…

CMOS逻辑门笔记

1.MOS管种类 MOS管又分为两种类型&#xff1a;N型和P型。 以N型MOS管为例, 2端为控制端,称为“栅极”; 3端通常接地,称为“源极”; 源极电压记作Vss&#xff0c;1端接正电压,称为“漏极”, 漏极电压记作VDD。要使1端与3端导通,栅极2上要加高电平。 对P型MOS管,栅极、源极、漏…

理解A*寻路算法具体过程

这两天研究了下 A* 寻路算法, 主要学习了这篇文章, 但这篇翻译得不是很好, 我花了很久才看明白文章中的各种指代. 特写此篇博客用来总结, 并写了寻路算法的代码, 觉得有用的同学可以看看. 另外因为图片制作起来比较麻烦, 所以我用的是原文里的图片. 当然寻路算法不止 A* 这一种…

打图啊啊啊啊

//1.识别&#xff1a;抓宠、找人、战斗、寻物、领取 //寻物开始 KeyPress "F5", 1 BeginThread 判断卡死 Call 重置() //Call 出售物品() Call 专门宝图任务() Call 关闭左边() BeginThread 屏蔽人物 For 26 Call 重置() Call 判断是否完成() Call 看是哪种任务&…

MATLAB频域处理-傅里叶变换和滤波

主要demo&#xff1a; 二维傅立叶变换&#xff0c;二维FFT&#xff0c;频域低通滤波&#xff0c;高通滤波&#xff0c;拉普拉斯算子 fimread(你的图片);Ffft2(f); %对图像f进行傅里叶变换Sabs(F); %S是F的频谱imshow(S,[]); %显示频谱&#xff0c…