A*(A星)寻路算法讲解
引言
终于把A*寻路算法看懂了,虽然还有点小问题,但A*寻路算法我已经略知一二,帮助还不知道的朋友进入A*算法入门阶级,应该不成问题,下面就来看看A*算法的原理(以下讲解不带入任何程序语言,因此只要你看懂了下面所有的话,那么你可以随意用在任意程序语言中)
在下也是初学,写这篇文章的目的只是让新手入门,因此高手看到这就飘过吧,当然愿意给予指点的高手请继续往下看
在下也是初学,写这篇文章的目的只是让新手入门,因此高手看到这就飘过吧,当然愿意给予指点的高手请继续往下看
前言
在文中可能会出现一些专业术语或者是我信口雌黄的话语,未免看官不明白,前面我先加以注解,具体意思可以从文中体会到
该寻路算法是在一个由很多方格组成的图像中,你操纵一个蓝色小方格进行寻路的环境下进行讲解,具体请看文章一开始的flash示例,或者是查看A*寻路算法例子
方格:一个一个的小方块
障碍物:挡着去路的东西
目标方格:你想到达的方格
操控方格:你控制的寻路对象
标记:临时为某一个方格做的标记
父标记:除了操控方格所创建的临时标记,每个标记都有个父标记,但父标记不是随便乱定的,请看下文
开启标记列表:当该标记还未进行过遍历,会先加入到开启标记列表中
关闭标记列表:当该标记已经进行过遍历,会加入到关闭标记列表中
路径评分:通过某种算法,计算当前所遍历的标记离目标方格的路径耗费估值(后面会讲一种通用的耗费算法)
该寻路算法是在一个由很多方格组成的图像中,你操纵一个蓝色小方格进行寻路的环境下进行讲解,具体请看文章一开始的flash示例,或者是查看A*寻路算法例子
方格:一个一个的小方块
障碍物:挡着去路的东西
目标方格:你想到达的方格
操控方格:你控制的寻路对象
标记:临时为某一个方格做的标记
父标记:除了操控方格所创建的临时标记,每个标记都有个父标记,但父标记不是随便乱定的,请看下文
开启标记列表:当该标记还未进行过遍历,会先加入到开启标记列表中
关闭标记列表:当该标记已经进行过遍历,会加入到关闭标记列表中
路径评分:通过某种算法,计算当前所遍历的标记离目标方格的路径耗费估值(后面会讲一种通用的耗费算法)
在脑海中,先创建开启标记列表、关闭标记列表,然后把我的初始位置设置为开始标记进行遍历,同时因为开始标记已经遍历过了,因此把开始标记加入到关闭列表。通过开始标记我们找出了相邻的八个方格,为它们创建相应的标记,加入到开启标记列表中,并把每个标记的父标记设置为开始标记,是因为开始标记才让我们这些方格创建了属于自己的标记,它就是我们的再生父母。但不符合条件的我们就不加入开启标记列表(下面的条件符合任何一条都不要加入到开启标记列表中):
1、它在我们的搜寻地图范围外,比如你地图的寻路范围是 0*0 - 50*50,那么但这个点在边缘的时候,那它相邻的八个方格,必定有几个是处在外面的!
2、搜寻的这个方格是否有障碍物、或不可到达,比如河流,石头,山川等
3、判断它是否已经加入关闭标记列表,若已经加入表示该方格已经遍历过了,在遍历一次也无济于事,还会影响效率
4、判断它是否已经加入开启标记列表,若已经加入那么咋们就来判断一下该标记是否离开始标记更近一些
5、判断当斜着走的时候,它的上下或左右是否有障碍,如果有则表示你无法斜着走,需要先横走一下,再竖走一下或者是竖走一下,再横走一下
如果想象不出来,可以看着这个A*寻路算法例子进行学习和比较。
把相邻的八方向都添加到开启标记列表中后,现在从开启标记列表中取出一个路径评分最低标记,对他开始进行遍历相邻的八个方格,并进行创建标记、添加到开启标记列表、设置父标记为该标记,并且重复判断上面的创建条件,然后把这个标记加入到关闭标记列表
如此循环的做着上面所说的事,然后每次判断下面条件:
1、判断开启列表是否已经为空,如果空了则表示从操控方格到目标方格是不可能达到,是死路!
2、判断当前所遍历的标记的坐标与目标方格的坐标是否相同,如果相同则表示到达了目标方格!
当得到第一个条件,则表示这条路是死路,因此咱们不用遍历了,宣告结果吧。当得到第二个条件,则表示咱们已经找到路了,从最后创建的这个标记开始,一直向上访问它的父标记,直到开始标记的时候没有父标记为止,这就是一条从操控方格到目标方格的路径,但这可能不是捷径。
A*寻路算法,只是保证在低消耗的情况在最短的时间找出路径,但A*寻路算法寻出来的路不一定是最近,但也绝对不会远的离谱,可也不排除你对路径评分算法的优化可以做到最快最短最低消耗,或者对最终路径的优化来达到目的,下面就来讲讲通用的路径评分计算公式:
首先看公式: F = G + H
F值表示路径评分,G值表示当前所判断的标记离开始标记的路径耗费,H值表示当前所判断的标记离目标方格的路径估值耗费
G值的计算方式是,如果为斜走判断则用父标记的G值加上14表示当前标记的G值,如果为直走判断则用父标记的G值加上10表示当前标记G值
H值通常的计算方式是一种称作为曼哈顿方法的方式,当前标记离目标方格横着的方格数加上竖着的方格数,然后乘以10,最后得值就是H值。当然若你想通过A*寻出最好的路径,那么改善算法的主要地方就是这个H值的算法(如果你对本计算方式还有更好的办法可以到我博客中去发表自己的意见)
根据上面讲的A*算法的做法来讲,则表示前面判断哪个标记离开始标记更近一些只需判断一下G值即可;前面所说的取出一个路径评分最低标记,也就是将F值进行升序排序取出第一个,或降序排序取出最后一个。
sunbright总结:本文只是初略的讲解A*寻路算法的入门,相信仔细看过该文用心体会肯定能入门A*算法,但该文不是A*算法的权威,因为我自己也知道这篇文章是按照我自己的想法对A*的理解所写出来的,可能跟A*算法的原理是一样的,但讲解方式可能大不同,毕竟国内大部分A*算法的讲解都是来自于国外的译本。希望还不懂A*寻路算法的朋友通过这篇文章能理解过来!——本文出至sunbright博客
对于高手看过本文后,有什么见解可以提出来,在下也是菜鸟,也希望能得到进步;如果新手看过本文后,有什么好的建议或疑问,也可以提出来,我尽量解答!
相关推荐
A*(A-star)算法是一种广泛应用的路径搜索算法,它在自动寻路系统中起着核心作用。易语言是一种中国本土开发的、面向对象的编程语言,它以其简单易学的特点受到很多程序员的喜爱。这个“A*走路 自动寻路A*算法 ...
使用A*算法求解迷宫寻路问题,使用python编程,人工智能导论课后实验
下载本程序仅可演示A*自动寻路算法实现(java),该程序是基于我写的网络版贪吃蛇基础上编写的(网络版贪吃蛇...wasd键控制太阳的方向,鼠标左击目的地,会根据A*自动寻路算法计算出一条最优路线,太阳按最优路线移动。
**a*算法详解** a*(A-star)算法是一种在图形搜索中用于寻找从起点到终点最短路径的启发式搜索算法。它结合了Dijkstra算法的最优性和BFS(广度优先搜索)的效率,通过引入启发式函数来指导搜索方向,从而更快地...
入口坐标和出口坐标分别为(startx,starty)和(endx,eny),每一个坐标点有两种可能:0或1,其中0表示该位置允许通过,1表示该位置不允许通过。以寻路问题为例实现A*算法的求解程序,设计两种不同的估价函数。
实验四 人工智能 matlab A*算法求解迷宫寻路问题实验 寻路问题常见于各类游戏中角色寻路、三维虚拟场景中运动目标的路径规划、机器人寻路等多个应用领域。迷宫寻路问题是在以方格表示的地图场景中,对于给定的起点、...
A*(A-star)寻路算法是一种广泛应用在游戏开发、地图导航、机器人路径规划等领域的高效路径搜索算法。它结合了Dijkstra算法的全局最优性和Greedy最佳优先搜索的效率,通过引入启发式函数来估计从当前节点到目标节点...
标题中的“A*寻路”和“弗洛伊德(Floyd)算法”都是图论中的经典路径搜索算法,它们在计算机科学,尤其是游戏开发、网络路由和人工智能等领域有着广泛的应用。在这里,我们将深入探讨这两种算法及其在实际问题中的...
B*(B-star)寻路算法是A*(A-star)算法的一个改进版本,由Hart、Pohl和Nilson在1968年提出,旨在解决路径规划问题,特别是在环境变化或者不确定性较大的场景中。B*算法通过引入期望代价来动态调整节点的评估函数,...
总的来说,这个"人工智能 A*算法实现自动寻路的程序"是一个实用的教学工具,它不仅展示了A*算法的基本原理,还让用户能够直观地理解算法如何在复杂环境中找到最优路径。通过学习和实践这个程序,开发者能够提升对...
A星(A*)寻路算法是计算机科学中用于路径搜索和图遍历的一种高效算法,尤其在游戏开发、导航系统、机器人路径规划等领域广泛应用。它结合了最佳优先搜索(如Dijkstra算法)和启发式搜索(如Greedy Best-First ...
A*算法的C++实现,注释详尽,直接编译运行
A星(A*)算法是一种高效的启发式搜索算法,它结合了Dijkstra算法和最佳优先搜索,能够找到从起点到终点的最短路径。 A星算法的核心思想是结合实际距离(G值)和预计剩余距离(H值)来评估节点的总成本F值,并利用...
A*算法是自动寻路的理想解决办法 像自动寻找NPC 自动寻找地图出口 我写的这个只是简单的实现了功能 在运算效率上没有做优化 在接下来的版本中我会增加二*堆算法 来提高A*算法的效率 请大家多多关注 包中还有一个我用...
A星寻路算法(A* Search Algorithm)是一种广泛应用的路径搜索算法,主要用在游戏开发、图形界面编程、机器人导航等领域,用于寻找从起点到终点的最短路径。在这个MFC(Microsoft Foundation Classes)编写的动态演示...
A星(A*)寻路算法是计算机图形学和游戏开发中常用的一种路径搜索算法,它结合了最佳优先搜索(Dijkstra算法)和启发式搜索。在AS3.0中,这个算法通常用于创建智能角色在复杂网格环境中的移动路径,比如游戏中的NPC或...
在MATLAB环境中实现A星算法寻路,能够利用其强大的数学计算能力和可视化功能。下面将详细介绍A星算法的核心原理以及如何在MATLAB中实现这一算法。 一、A星算法原理 1. **核心思想**:A星算法结合了Dijkstra算法的...
**Flash AS3 A* 寻路算法详解** 在游戏开发和路径规划中,A*(发音为"A-star")寻路算法是一种广泛应用的路径搜索算法,它基于Dijkstra算法但更高效,因为它考虑了启发式信息来指导搜索方向。在Flash AS3环境中,A*...
B星算法(BStar)是A星算法的一个改进版本,它在处理动态环境或有大量可变因素的情况下表现得更为优秀。BStar引入了一个叫做"记忆"的概念,用来存储之前搜索的信息,以便在环境变化时能够更快地重新规划路径。与A星...