`

A星算法原理【转】-上篇

阅读更多
这篇文章并不试图对这个话题作权威的陈述。取而代之的是,它只是描述算法的原理,使你可以在进一步的阅读中理解其他相关的资料。 最后,这篇文章没有程序细节。你尽可以用任意的计算机程序语言实现它。如你所愿,我在文章的末尾包含了一个指向例子程序的链接。 压缩包包括C++和Blitz Basic两个语言的版本,如果你只是想看看它的运行效果,里面还包含了可执行文件。 我们正在提高自己。让我们从头开始。。。

 

序:搜索区域 

假设有人想从A点移动到一墙之隔的B点,如下图,绿色的是起点A,红色是终点B,蓝色方块是中间的墙。



 

[图1] 
 
你首先注意到,搜索区域被我们划分成了方形网格。像这样,简化搜索区域,是寻路的第一步。这一方法把搜索区域简化成了一个二维数组。数组的每一个元素是网 格的一个方块,方块被标记为可通过的和不可通过的。路径被描述为从A到B我们经过的方块的集合。一旦路径被找到,我们的人就从一个方格的中心走向另一个, 直到到达目的地。 
这些中点被称为“节点”。当你阅读其他的寻路资料时,你将经常会看到人们讨论节点。为什么不把他们描述为方格呢?因为有可能你的路径被分割成其他不是方格 的结构。他们完全可以是矩形,六角形,或者其他任意形状。节点能够被放置在形状的任意位置-可以在中心,或者沿着边界,或其他什么地方。我们使用这种系 统,无论如何,因为它是最简单的。
 
开始搜索 
正如我们处理上图网格的方法,一旦搜索区域被转化为容易处理的节点,下一步就是去引导一次找到最短路径的搜索。在A*寻路算法中,我们通过从点A开始,检查相邻方格的方式,向外扩展直到找到目标。 我们做如下操作开始搜索:
 
 1,从点A开始,并且把它作为待处理点存入一个“开启列表”。开启列表就像一张购物清单。尽管现在列表里只有一个元素,但以后就会多起来。你的路径可能会通过它包含的方格,也可能不会。基本上,这是一个待检查方格的列表。   
 2,寻找起点周围所有可到达或者可通过的方格,跳过有墙,水,或其他无法通过地形的方格。也把他们加入开启列表。为所有这些方格保存点A作为“父方格”。当我们想描述路径的时候,父方格的资料是十分重要的。后面会解释它的具体用途。   
 3,从开启列表中删除点A,把它加入到一个“关闭列表”,列表中保存所有不需要再次检查的方格。 在这一点,你应该形成如图的结构。在图中,暗绿色方格是你起始方格的中心。它被用浅蓝色描边,以表示它被加入到关闭列表中了。所有的相邻格现在都在开启列表中,它们被用浅绿色描边。每个方格都有一个灰色指针反指他们的父方格,也就是开始的方格。


    [图2]
 
 接着,我们选择开启列表中的临近方格,大致重复前面的过程,如下。但是,哪个方格是我们要选择的呢?是那个F值最低的。 
 
路径评分
选择路径中经过哪个方格的关键是下面这个等式: 
F = G + H 
这里:     
  * G = 从起点A,沿着产生的路径,移动到网格上指定方格的移动耗费。    
  * H = 从网格上那个方格移动到终点B的预估移动耗费。这经常被称为启发式的,可能会让你有点迷惑。这样叫的原因是因为它只是个猜测。我们没办法事先知道路径的长 度,因为路上可能存在各种障碍(墙,水,等等)。虽然本文只提供了一种计算H的方法,但是你可以在网上找到很多其他的方法。 我们的路径是通过反复遍历开启列表并且选择具有最低F值的方格来生成的。文章将对这个过程做更详细的描述。首先,我们更深入的看看如何计算这个方程。
正如上面所说,G表示沿路径从起点到当前点的移动耗费。在这个例子里,我们令水平或者垂直移动的耗费为10,对角线方向耗费为14。我们取这些值是因为沿 对角线的距离是沿水平或垂直移动耗费的的根号2(别怕),或者约1.414倍。为了简化,我们用10和14近似。比例基本正确,同时我们避免了求根运算和 小数。这不是只因为我们怕麻烦或者不喜欢数学。使用这样的整数对计算机来说也更快捷。你不就就会发现,如果你不使用这些简化方法,寻路会变得很慢。
既然我们在计算沿特定路径通往某个方格的G值,求值的方法就是取它父节点的G值,然后依照它相对父节点是对角线方向或者直角方向(非对角线),分别增加14和10。例子中这个方法的需求会变得更多,因为我们从起点方格以外获取了不止一个方格。
H值可以用不同的方法估算。我们这里使用的方法被称为曼哈顿方法,它计算从当前格到目的格之间水平和垂直的方格的数量总和,忽略对角线方向。然后把结果乘 以10。这被成为曼哈顿方法是因为它看起来像计算城市中从一个地方到另外一个地方的街区数,在那里你不能沿对角线方向穿过街区。很重要的一点,我们忽略了 一切障碍物。这是对剩余距离的一个估算,而非实际值,这也是这一方法被称为启发式的原因。想知道更多?你可以在这里找到方程和额外的注解。
F的值是G和H的和。第一步搜索的结果可以在下面的图表中看到。F,G和H的评分被写在每个方格里。正如在紧挨起始格右侧的方格所表示的,F被打印在左上角,G在左下角,H则在右下角。 
 

[图3] 
 
现在我们来看看这些方格。写字母的方格里,G = 10。这是因为它只在水平方向偏离起始格一个格距。紧邻起始格的上方,下方和左边的方格的G值都等于10。对角线方向的G值是14。 H值通过求解到红色目标格的曼哈顿距离得到,其中只在水平和垂直方向移动,并且忽略中间的墙。用这种方法,起点右侧紧邻的方格离红色方格有3格距离,H值 就是30。这块方格上方的方格有4格距离(记住,只能在水平和垂直方向移动),H值是40。你大致应该知道如何计算其他方格的H值了~。 每个格子的F值,还是简单的由G和H相加得到

    继续搜索 
为了继续搜索,我们简单的从开启列表中选择F值最低的方格。然后,对选中的方格做如下处理:    
 
4,把它从开启列表中删除,然后添加到关闭列表中。    
5,检查所有相邻格子。跳过那些已经在关闭列表中的或者不可通过的(有墙,水的地形,或者其他无法通过的地形),把他们添加进开启列表,如果他们还不在里面的话。把选中的方格作为新的方格的父节点。    
6,如果某个相邻格已经在开启列表里了,检查现在的这条路径是否更好。换句话说,检查如果我们用新的路径到达它的话,G值是否会更低一些。如果不是,那就什么都不做。       
另一方面,如果新的G值更低,那就把相邻方格的父节点改为目前选中的方格(在上面的图表中,把箭头的方向改为指向这个方格)。最后,重新计算F和G的值。如果这看起来不够清晰,你可以在下篇中通过图示加深理解。
 
  • 大小: 16.8 KB
  • 大小: 8.3 KB
  • 大小: 25.5 KB
分享到:
评论

相关推荐

    易语言模仿A星算法

    本篇文章将深入探讨如何使用易语言来实现A星算法。 一、A星算法的基本原理 A*算法的核心在于使用启发式函数评估每个节点的潜在最优路径。它通过一个叫做F(n)的分数来决定下一个要扩展的节点,这个分数由两部分组成...

    VB A星寻路算法 a* AStar

    A星(A*)寻路算法是计算机图形学和游戏开发中的一个重要概念,特别是在路径规划和导航系统中广泛应用。VB(Visual Basic)是一种流行的...通过理解A星算法的工作原理和VB的编程实践,你可以构建出属于自己的游戏世界。

    A* A星算法 MATLAB代码可以直接运行,自己选择障碍物起点终点 新手必备

    总之,A*算法是解决机器人路径规划问题的强大工具,MATLAB中的实现简化了学习过程,让初学者能够快速上手并理解其工作原理。通过自定义起点和终点,用户可以更好地理解启发式搜索和实际代价如何共同作用于寻找最优...

    三种主流寻路方式(A星,广度,深度)

    本篇文章将详细探讨三种主流的寻路方法:A*(A星)算法、广度优先搜索(Breadth-First Search, BFS)以及深度优先搜索(Depth-First Search, DFS),并结合提供的压缩包文件中的代码资源进行分析。 首先,A*算法是...

    极度优化的A*寻路算法

    本篇将详细讲解极度优化的A*算法及其关键知识点。 首先,优化A*算法的核心在于提高其效率。这通常涉及到以下几个方面: 1. **数据结构优化**:为了快速访问和更新节点状态,可以使用优先队列(如二叉堆或斐波那契...

    新的A星路径规划matlab文件合集.zip

    标题中的“新的A星路径规划matlab文件合集.zip”表明这是一个包含MATLAB代码的压缩包,用于实现A*(A-Star)算法的路径规划。A*算法是一种广泛应用的图搜索算法,尤其在游戏开发、机器人导航和地图路径规划等领域。...

    cocoscreator A星寻路

    总之,A*寻路算法在CocosCreator中的应用需要理解算法原理,构建合适的网格结构,定义有效的启发式函数,并将其与CocosCreator的游戏对象和事件系统相结合。通过学习和实践,开发者可以创建出具有复杂路径规划的游戏...

    精华游戏算法整理(经典)

    会者不难,A*(念作A星)算法对初学者来说的确有些难度。 这篇文章并不试图对这个话题作权威的陈述。取而代之的是,它只是描述算法的原理,使你可以在进一步的阅读中理解其他相关的资料。 最后,这篇文章没有程序...

    详解三相直流无刷电机驱动器硬件原理图.rar

    本篇文章将深入探讨三相直流无刷电机驱动器的硬件原理,帮助读者理解其工作方式和设计要点。 一、电机结构与工作原理 无刷直流电机由定子绕组和转子永磁体组成,区别于传统有刷电机,它没有电刷和换向器,而是通过...

    BLDC无刷直流电机控制

    本篇将深入探讨BLDC电机的控制原理,并基于提供的源码进行分析。 BLDC电机的工作原理基于电磁感应,它通过改变输入电流的相序来实现电机的旋转。与有刷直流电机不同,BLDC电机没有物理换向器,而是通过电子控制器...

    Rete: A Fast Algorithm for the Many Pattern/Many Object Pattern Match Problem*中文

    在《Rete: A Fast Algorithm for the Many Pattern/Many Object Pattern Match Problem》这篇论文中,作者提出了一种名为Rete的高效算法,旨在解决在产生式规则系统中的模式匹配问题。这种算法尤其适用于处理大规模...

    正则表达式和DFA

    这篇描述的是一个学校课程设计项目,它涵盖了从正则表达式的理解到构建非确定有限状态自动机(Non-deterministic Finite Automaton,NFA)再到转换为DFA,最终优化为最小DFA的全过程。下面将深入探讨这些知识点。 ...

    2011 text 2 英语一&二1

    这篇资料主要涵盖了一些英语词汇和短语,它们在IT行业中也常常出现,特别是在技术文档、邮件沟通、项目管理和团队协作中。以下是对这些词汇和短语的详细解释和相关知识点: 1. **depart** - 在IT领域,"depart"不仅...

    基于MTCNN深度级联神经网络的人脸实时检测.zip

    本篇将深入探讨MTCNN的工作原理及其在TensorFlow中的实现。 MTCNN的主要特点在于其三级级联结构,由三个相互关联的网络部分组成:P-Net(Proposal Network)、R-Net(Refinement Network)和O-Net(Output Network...

    路径规划 matlab

    在压缩包中的"A星_1630945817"文件中,可能包含了MATLAB代码示例,包括地图数据结构、启发式函数定义、A*算法实现以及结果可视化等功能。通过分析和理解这些代码,可以更好地掌握在MATLAB中应用A*算法进行路径规划的...

    file Match

    本篇将详细探讨`fileMatch`相关的知识点,包括文件匹配的原理、常见工具及编程实现,以及如何在实际场景中应用。 一、文件匹配原理 文件匹配主要涉及两个核心概念:文件名和文件路径。在大多数操作系统中,文件...

    惯性信息辅助高动态GPS接收机快速捕获方法研究.pdf

    参考文献中提到了赵晴和吴玉斌关于INS辅助GPS快速捕获的研究,A Brown和M May讨论了软件GPS接收机在信号处理上的优势,以及赵昀和张其善对软件GPS接收机架构和捕获算法实现的探讨,这些都为本研究提供了理论支持和...

Global site tag (gtag.js) - Google Analytics