目录

简介

A*算法的原理与思想

A*算法处理与搜索

实例(引用见文末)


简介

A*算法(启发式搜索)的首要条件是在静态路网中,相对于广度优先遍历(BFS)求最短路径的最有效算法(BFS缺点是效率低耗时久,而A*更高效)。

A* BFS
高效率耗时短 低效率耗时久

A*算法,A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。

宽度优先搜索算法(又称广度优先搜索,简称BFS)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。

A*算法的原理与思想

运用了一个很重要的式子:f(n)=g(n)+h(n)

起点至终点的x轴与y轴距离之和即为曼哈顿距离。

如图黄色线与红色线的长度即为曼哈顿距离的值。

A*算法结合了贪心算法(深度优先)与Dijkatra算法(广度优先),优先计算代价更低的方向。

A*算法处理与搜索

  1. 将整个地图网格化,可以理解为化为一个个像素点,即栅格法,将每一个像素点作为一个节点。
  2. 给每一个节点定义一个属性:①可通过②不可通过。如图中黑色格可通行,蓝色格不可通行。
  3. 定义一个列表集合openlist和closelist,给每一个节点都可有一个状态openlist或closelist,分别属于两个集合。(属性为不可通过的节点默认为closelist状态,该节点就属于closelist集合)
  4. openlist为待考察节点,closelist为已考察节点。先以初位置节点A为父节点,其状态为closelist,以其为中心的九宫格的其余八个节点为子节点,都附加状态openlist。
  5. 定义横纵移动的代价为10,斜向移动大家为14.每个方格左上角为f(n),左下角为g(n),右下角为h(n)
  6. 选择f(n)值最小的节点B。
  7. 检查B周围的方格,首先考察g(n),其他 4 个相邻的方格均在 open list 中,我们需要检查经由这个方格到达那里的路径是否更好,使用g(n) 值来判定。
  8. 让我们看看B上面的方格。它现在的 g(n) 值为 14 。如果我们经由当前方格到达那里, g(n)值将会为 20(其中 10 为到达当前方格的 g(n) 值,此外还要加上从当前方格纵向移动到上面方格的 g(n) 值 10) 。显然 20 比 14 大,因此这不是最优的路径。如果你看图你就会明白。直接从起点沿对角线移动到那个方格比先横向移动再纵向移动要好。
  9. 而如果有更小的g(n)值再考察h(n),按照曼哈顿距离计算估计代价,再计算出f(n)=g(n)+h(n)的值。
  10. 以B子节点为新的父节点,其余子节点放入closelist,选择周围f(n)最小的节点,发现上下两格都是54,我们选择下方的格子C。
  11. 以此类推,分别计算出剩余openlist的节点的f(n)值,挑选最小的代价节点一刀closelist中。
  12. 从openlist中选择f(n)最小的节点放入closelist中并将它视作新的父节点,按照以上步骤类推,不断的重复,一直到搜索到终点节点,完成路径搜索,结束算法。
  13. 要注意,例如以C为父节点后,C的右下方为墙的下方,而C不能通过对角线到墙的下方,故忽略墙的周围格子的对角线通行。

实例(引用见文末)

如图浅绿色点到草绿色点。

clear;
clc;
clf;
figure(1);
map =[
0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0
0   0   0   .3  0   0   0   1   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   1   0   0   .7  0   0   0   0   0
0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   1   1   1   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
];
pcolor(map)
colormap summer
[row,col] = size(map);
[start_px,start_py] = find(map == .3);
[end_px,end_py] = find(map == .7);close = struct([]);
closelen = 0;
open = struct([]);
openlen = 0;%% 将起点添加到open列表
open(1).row = start_px;
open(1).col = start_py;
open(1).g = 0;
open(1).h = abs(end_py - start_py) + abs(end_px - start_px);
openlen = openlen + 1;
%% 四种运动格式
sport = [0,1;0,-1;-1,0;1,0];
backNum = 0;
prev = [];
while openlen > 0%% 获取代价最小的值for i = 1:openlenf(i,:) = [i,open(i).g + open(i).h];       endf1 = sortrows(f,2);current = open(f1(1));choose = 0;chooseArr = [];%% 回溯将走过的点标记出来if current.row == end_px && current.col == end_pyi = 1;while(i<=size(prev,1))if prev(i,3) == current.row && prev(i,4) == current.colchoose = choose +1;chooseArr(choose,1) = prev(i,1);chooseArr(choose,2) = prev(i,2);current.row =  prev(i,1);current.col =  prev(i,2);i = 1;elsei = i + 1;endend      for j = 1: size(chooseArr,1)map(chooseArr(j,1),chooseArr(j,2)) = 0.5;endfigure(2);pcolor(map);colormap winter;return;         endcloselen = closelen + 1;close(closelen).row = open(f1(1)).row;close(closelen).col = open(f1(1)).col;close(closelen).g = open(f1(1)).g;close(closelen).h = open(f1(1)).h;   open(f1(1)) = [];openlen = openlen -1;     for i = 1:4dimNormal = all([current.row,current.col]+sport(i,:)>0) ...&& current.row+sport(i,1)<=row && current.col+sport(i,2)<=col;neighbor.row = current.row + sport(i,1);neighbor.col = current.col + sport(i,2);neighbor.g = abs(start_px - neighbor.row) + abs(start_py - neighbor.col);neighbor.h = abs(end_px - neighbor.row) + abs(end_py - neighbor.col);if dimNormalinCloseFlag = 0; if closelen ==0elsefor j = 1:closelenif close(j).row == neighbor.row && close(j).col ==neighbor.colinCloseFlag = 1;break;endendendif inCloseFlagcontinue;endtemp_g = current.g + abs(current.row - neighbor.row) + abs(current.col - neighbor.col);inOpenFlag = 0;for j =1:openlenif open(j).row == neighbor.row && open(j).col ==neighbor.colinOpenFlag = 1;break;endend        if ~inOpenFlag && map(neighbor.row,neighbor.col) ~= 1openlen = openlen + 1;open(openlen).row = neighbor.row;open(openlen).col = neighbor.col;open(openlen).g = abs(start_px - neighbor.row) + abs(start_py - neighbor.col);open(openlen).h = abs(end_px - neighbor.row) + abs(end_py - neighbor.col);               elseif temp_g >= neighbor.gcontinue;endbackNum = backNum +1;prev(backNum,:) = [current.row ,current.col,neighbor.row ,neighbor.col];neighbor.g = temp_g;            elsecontinue;endend
end

结果为

参考与引用http://www.gamedev.net/reference/articles/article2003.asp

https://b23.tv/I3GLzp

https://blog.csdn.net/lmq_zzz/article/details/88999480

什么是A*(Astar)算法?(简单叙述)相关推荐

  1. unity学习:寻路算法(AStar算法)与简单AI(势能场估价算法)

    项目地址:https://github.com/kotomineshiki/AIFindPath 视频地址:多重寻路 综合寻路--包括攻击考量的寻路算法 GamePlay 这是一个<文明> ...

  2. 【算法】A-star 算法摘录整合

    文章目录 1. 定义 1.1 定义解析 1.2 Dijkstra算法与最佳优先搜索 1.2.1 Dijkstra算法(距离起始点的信息) 1.2.2 最佳优先搜索(距离终点的信息) 1.2.3 以上两 ...

  3. AStar 算法 ---在Unity当中实现

    介绍 AStar算法,是一种在静态路网中求最短路径的一种算法,是一种启发式的算法.其中,算法当中起点与终点的距离,与算法当中的预估距离越接近,则搜索速度越快. 其实,在AStar算法当中,他的搜索路径 ...

  4. 数据结构与算法--简单栈实现及其应用

    栈 栈(Stack)是一种限制插入和删除只能在一个位置上进行的表,改位置是表的末端,叫做栈顶top.栈的基本操作有push (进栈)pop(出栈) 栈又叫做LIFO(后进先出)表,下图展示普通push ...

  5. 深度学习中反向传播算法简单推导笔记

    反向传播算法简单推导笔记 1.全连接神经网络 该结构的前向传播可以写成: z(1)=W(1)x+b(1)z^{(1)} = W^{(1)}x+b^{(1)}z(1)=W(1)x+b(1) a(1)=σ ...

  6. python分类算法的应用_Python基于sklearn库的分类算法简单应用示例

    Python基于sklearn库的分类算法简单应用示例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python基于sklearn库的分类算法简单应用示例.tx ...

  7. python分类算法的应用_Python使用sklearn库实现的各种分类算法简单应用小结

    本文实例讲述了Python使用sklearn库实现的各种分类算法简单应用.分享给大家供大家参考,具体如下: KNN from sklearn.neighbors import KNeighborsCl ...

  8. Karplus-Strong 算法简单介绍和实现

    Karplus-Strong 算法简单介绍和实现 本文为Coursera数字信号处理课程第一周内容,对相关课程刚兴趣的同学,请参看这里 为了有更好的交互性,本文所有代码均上传至Microsoft Az ...

  9. c语言写拼图游戏算法,[原创]拼图游戏移动算法,简单易懂

    [原创]拼图游戏移动算法,简单易懂 这是我第一次发表关于算法的贴子, 希望大家支持下 原理:判断用户点击的按扭的X或Y坐标是否与移动按扭相同, 并且移动按扭的X,Y坐标是否与用户点击按扭相邻. 拼图游 ...

  10. 摄像头Optical Center检测算法简单实现

    摄像头Optical Center检测算法简单实现 光线通过透镜时,都会产生偏折,使光线传播方向发生变化:但透镜上有一点,任意方向的光线通过该点时,光线的传播方向不变,即出射方向和入射方向相互平行,这 ...

最新文章

  1. 华为手机如何关闭通知栏推送消息_如果华为手机升级EMUI10后,电池耗电很快!要记得调整这3个设置...
  2. Android 跳转网页链接
  3. 使用Schematics启用SAP Spartacus的SSR模式
  4. Learning Cocos2d-x for WP8(7)——让Sprite动起来
  5. mysql获取最好成绩对应数据的其他项_开源数据同步神器——canal
  6. 树莓派文件夹系统说明
  7. 机器学习python_深入浅出Python机器学习[PDF][176.39MB]
  8. mac安装虚拟机win10,Mac安装VirtualBox
  9. 微信开发errcode:40125
  10. 百度扩容软件V.2.3版,第四代扩容带自助修复功能
  11. 财务分析之资产负债表
  12. 计算机视觉入门(一)
  13. 自定义控件之Canvas图形绘制基础练习-青春痘笑脸^_^
  14. Java实现第八届蓝桥杯青蛙跳杯子
  15. National day present
  16. Anubis配置文件说明记录
  17. 关于个人的年度小目标 --2019
  18. bbz10 android,10万应用20%靠安卓移植 黑莓BB10原生难
  19. 使用python实现unix2dos和dos2unix命令
  20. 顶点着色器-经过的空间变换

热门文章

  1. Android长图文截图的实现(支持截取微博,知乎,头条等第三方app)
  2. Github hosts修改
  3. 基于logistic模型,GM模型和Leslie模型全国人口预测
  4. 几种常见排序算法时间复杂度
  5. 微软云加速器助edoc2入云腾飞
  6. C#坦克大战流程设计与源代码(1):基本对象类规划
  7. 通过Kali模拟CC攻击进行WEB压力测试实操
  8. php gmssl,关于GmSSL
  9. 大数据技术原理与应用学习笔记(五)
  10. 使用adb命令启动模拟器