热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

AStar算法

什么是AStar:是一种静态路网中求解最短路最有效的直接搜索方法,估价值跟实例值非常接近;启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,

什么是AStar:
是一种静态路网中求解最短路最有效的直接搜索方法,估价值跟实例值非常接近;

启发式搜索 :
启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,在从这个位置进行搜索直到目标.这样可以省略大量无谓的搜索路径,提高了效率;

在启发式搜索中,对位置的估价是十分重要的.采用了不同的估价,可以有不同的效果;
(估价函数就一种规则,制定的规则不同,最后的效果也就不同)<比如寻路的格子不同,最后的效果也是不同的>

估价函数 :
从当前节点移动到 目标节点的预估费用<费用简单的说就是从起点到终点的距离>(如果放到地图上就是距离,走的路越多估价越高);这个估价就是启发式的.在寻路问题和迷宫问题中,我们通常用曼哈顿(manhattan)估价函数预估费用.

A*算法特点:
在理论上是时间最优的;
但也有缺点:它的空间增长是指数级别的;(格子越多计算的量也就越大)<优化可以使用 二叉堆 >

中心思想:
通过从起始点开始,检查相邻方格的方式,向外扩展,直到找到目标;

运用:
把一个平面分成一个个的小方格,方格分的越细,寻路就越精准;

为了更好的描述,和理解A*算法提出的两个概念(不存在于真实的场景中)

开启列表:
待检查方格的集合列表,寻找周围可以达到的点,加入到此列表中,
并保存中心点为父节点

关闭列表:列表中保存不需要再次检查的方格

这里写图片描述

路径评分:
G-当前点与起始点的距离
H-当前点与目标点的距离

F的值是G和F的和
F,G和H的评分被写在每个方格里.
如图:F被打印在中间,G在左上角.H在右上角.
<如上图>
从一个格子到相邻格子的斜线距离(以为到斜线格子的距离为跟2,所以用1.4为单位)
从一个格子到相格子的直线距离(因为格子为1,所以就以1为单位);
为了方便计算查看,都乘以10作为单位;

选择路径过程中,经过哪个方格关键是:F=G+H;
这里写图片描述

<如上图>以红色格子为例
方块的中心位置42就是估价,也就是起始点到目标的距离
左上角用G表示,也就是该格子到目标点的距离为14
右上角用H表示,也就是该格子到起始点的距离为28
红色格子右上角是62,是因为已经确定了当前红色的格子,路径是从当前红色格子到右上角的格子,所以值为62;
如果选择的不是当前红色的格子,那么就会去改变其他格子的值,也就是说每个格子的值随着你的选择进行改变
(改变成符合当前格子路径上的值).

例如:从A到B的一个解析过程
这里写图片描述

开始搜索:
1.把起始格添加到开启列表。
从A点开始查找
2.寻找起点周围所有可到达或者可通过的方格,把他们加入开启列表。
遍历A所能到达的所有方格,把他们加入开启列表中
3.从开启列表中删除点A,把它加入到一个“关闭列表”,列表中保存所有不需要再次检查的方格。
因为A已经走过,所以把A加入关闭列表中,下次在进行遍历时把A除外
这里写图片描述

继续搜索:
4把当前格子从开启列表中删除,然后添加到关闭列表中。
因为已经到达了当前格子,所以把当前格子放到关闭列表中(已经到达了,没有必要去进行遍历)
5检查所有相邻格子。跳过那些已经在关闭列表中的或者不可通过的,把他们添加进开启列表,把选中的方格作为新的方格的父节点。
当前中的格子周围有两个已经添加到开启列表中,上面三个为不可通过,也就是障碍物,所以只是新添加了左侧的两个格子;
这里写图片描述
这里写图片描述
这里写图片描述

6如果某个相邻格已经在开启列表里了,检查现在的这条路径G值是否会更低一些。

如果新的G值更低,那就把相邻方格的父节点改为目前选中的方格,重新计算F和G的值。
一旦重新选择了一个点那么就需要重新计算一下当前的费用,上面写着只计算G和F的 值,为什么呢!
原因:
每个点到目标点的距离是固定的,所以H点(又上角的点)是不需要改变的,会变化的G值仅仅是因为路经改变的原因跟起始点的距离会发生改变,
所以只需要计算G的值和F的值,其他的点也会相应的更新;
<图一>
因为选择的42,但是出现了3个相同的估价,那么我们该怎么选择呢?
<图二>
这里还有另外一个原则:那就是选择一个距离目标点最近的一个值,也就是H值最低的一个.
也就是左侧的48这个方块 ,那么就把48这个点从开启列表中删除,送进关闭列表中.
因为选择了48,新增了左侧两个点,那么跟新一下在开启列表中的当前48下面的两个点(在这里下面那两个点是没有变化的,因为42下面的也是48,所以路径的值是没有改变的);
那么继续走
当我们继续走的时候,发现遍历48所能达到的值,发现这条路径不是最优的.
为什么不是最优的呢:(因为在它的开启列表中还有一个48)
那么在他的开启列表中还有一个48的值,那么就把当前的这个48从开起列表中删除,送进关闭列表中。
我们就回到上一步,选择42下方的48;
同理,这个48也不是最优的,因为他的开启列表中还有一个48,那么我们继续选择42,右侧的这个48;
结束
这里写图片描述

起始格下方格子的父节点已 经和前面不同的。 之前它的G值是,并且指向 右上方的格子。现在它的G 值是,指向它上方的格子。 这在寻路过程中的某处发生, 当应用新路径时,G值经过 检查变得低了-于是父节点 被重新指定,G和F值被重
新计算。

根据上述的原理得到如上图所示的路径,也就是最佳路径;

总结

1把起始格添加到开启列表。
2重复如下的工作:
寻找开启列表中F值最低的格子。我们称它为当前格。
把它切换到关闭列表。
/1/对相邻的格中的每一个–> 如果它不可通过或者已经在关闭列表中,略过它。反之如下。如果它不在开启列表中,把它添加进去。把当前格作为这一格的父节点。记录这一格的F,G,和H值。
/2/如果它已经在开启列表中,用G值为参考检查新的路径是否更好。更低的G值意味着更好的路径。如果是这样,就把这一格的父节点改成当前格,并且重新计算这一格的 G和F值。
停止,当你 把目标格添加进了关闭列表,这时候路径被找到–>没有找到目标格,开启列表已经空了。这时候,路径不存在。
3.保存路径。从目标格开始,沿着每一格的父节点移动直到回到起始格。

算法:步骤架构
<1>开启集合
<2>关闭集合
<3>添加起始点到开始集合中
<4>循环如下步骤: 当前点=开启集合中最小F_Cost的点 将当前点移出开启集合中 将当前点添加到关闭集合中
<5>如果当前点是目标点,结束查询
<6>遍历当前点的每个相邻点 如果相邻点不能访问或者相邻点在关闭集合中,跳过此相邻点 如果新路径到相邻点的距离更短,或者相邻点不在开启集合中 重新设置F_Cost 重新设置其父节点为当前点
<7>如果相邻点不在开启集合中
<8>添加相邻点到开启集合什么是AStar: 是一种静态路网中求解最短路最有效的直接搜索方法,估价值跟实例值非常接近;
启发式搜索 : 启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,在从这个位置进行搜索直到目标.这样可以省略大量无谓的搜索路径,提高了效率;

在启发式搜索中,对位置的估价是十分重要的.采用了不同的估价,可以有不同的效果;
(估价函数就一种规则,制定的规则不同,最后的效果也就不同)<比如寻路的格子不同,最后的效果也是不同的>

估价函数 :从当前节点移动到 目标节点的预估费用<费用简单的说就是从起点到终点的距离>(如果放到地图上就是距离,走的路越多估价越高);这个估价就是启发式的.在寻路问题和迷宫问题中,我们通常用曼哈顿(manhattan)估价函数预估费用.

A*算法特点:在理论上是时间最优的;
但也有缺点:它的空间增长是指数级别的;(格子越多计算的量也就越大)<优化可以使用 二叉堆 >

中心思想:通过从起始点开始,检查相邻方格的方式,向外扩展,直到找到目标;

.运用
把一个平面分成一个个的小方格,方格分的越细,寻路就越精准;

为了更好的描述,和理解A*算法提出的两个概念(不存在于真实的场景中)
开启列表: 待检查方格的集合列表,寻找周围可以达到的点,加入到此列表中,
并保存中心点为父节点

关闭列表:列表中保存不需要再次检查的方格

路径评分:
G-当前点与起始点的距离
H-当前点与目标点的距离

F的值是G和F的和
F,G和H的评分被写在每个方格里.
如图:F被打印在中间,G在左上角.H在右上角.
<如上图>
从一个格子到相邻格子的斜线距离(以为到斜线格子的距离为跟2,所以用1.4为单位)
从一个格子到相格子的直线距离(因为格子为1,所以就以1为单位);
为了方便计算查看,都乘以10作为单位;

选择路径过程中,经过哪个方格关键是:F=G+H;

<如上图>以红色格子为例
方块的中心位置42就是估价,也就是起始点到目标的距离
左上角用G表示,也就是该格子到目标点的距离为14
右上角用H表示,也就是该格子到起始点的距离为28
红色格子右上角是62,是因为已经确定了当前红色的格子,路径是从当前红色格子到右上角的格子,所以值为62;
如果选择的不是当前红色的格子,那么就会去改变其他格子的值,也就是说每个格子的值随着你的选择进行改变
(改变成符合当前格子路径上的值).

例如:从A到B的一个解析过程

开始搜索:
1.把起始格添加到开启列表。
从A点开始查找
2.寻找起点周围所有可到达或者可通过的方格,把他们加入开启列表。
遍历A所能到达的所有方格,把他们加入开启列表中
3.从开启列表中删除点A,把它加入到一个“关闭列表”,列表中保存所有不需要再次检查的方格。
因为A已经走过,所以把A加入关闭列表中,下次在进行遍历时把A除外

继续搜索:
4把当前格子从开启列表中删除,然后添加到关闭列表中。
因为已经到达了当前格子,所以把当前格子放到关闭列表中(已经到达了,没有必要去进行遍历)
5检查所有相邻格子。跳过那些已经在关闭列表中的或者不可通过的,把他们添加进开启列表,把选中的方格作为新的方格的父节点。
当前中的格子周围有两个已经添加到开启列表中,上面三个为不可通过,也就是障碍物,所以只是新添加了左侧的两个格子;

6如果某个相邻格已经在开启列表里了,检查现在的这条路径G值是否会更低一些。
如果新的G值更低,那就把相邻方格的父节点改为目前选中的方格,重新计算F和G的值。
一旦重新选择了一个点那么就需要重新计算一下当前的费用,上面写着只计算G和F的 值,为什么呢!
原因:每个点到目标点的距离是固定的,所以H点(又上角的点)是不需要改变的,会变化的G值仅仅是因为路经改变的原因跟起始点的距离会发生改变,
所以只需要计算G的值和F的值,其他的点也会相应的更新;
<图一>
因为选择的42,但是出现了3个相同的估价,那么我们该怎么选择呢?
<图二>
这里还有另外一个原则:那就是选择一个距离目标点最近的一个值,也就是H值最低的一个.
也就是左侧的48这个方块 ,那么就把48这个点从开启列表中删除,送进关闭列表中.
因为选择了48,新增了左侧两个点,那么跟新一下在开启列表中的当前48下面的两个点(在这里下面那两个点是没有变化的,因为42下面的也是48,所以路径的值是没有改变的);
那么继续走
当我们继续走的时候,发现遍历48所能达到的值,发现这条路径不是最优的.
为什么不是最优的呢:(因为在它的开启列表中还有一个48)
那么在他的开启列表中还有一个48的值,那么就把当前的这个48从开起列表中删除,送进关闭列表中。
我们就回到上一步,选择42下方的48;
同理,这个48也不是最优的,因为他的开启列表中还有一个48,那么我们继续选择42,右侧的这个48;
结束

起始格下方格子的父节点已 经和前面不同的。 之前它的G值是,并且指向 右上方的格子。现在它的G 值是,指向它上方的格子。 这在寻路过程中的某处发生, 当应用新路径时,G值经过 检查变得低了-于是父节点 被重新指定,G和F值被重
新计算。

根据上述的原理得到如上图所示的路径,也就是最佳路径;

总结

1把起始格添加到开启列表。
2重复如下的工作:
寻找开启列表中F值最低的格子。我们称它为当前格。
把它切换到关闭列表。
/1/对相邻的格中的每一个–> 如果它不可通过或者已经在关闭列表中,略过它。反之如下。如果它不在开启列表中,把它添加进去。把当前格作为这一格的父节点。记录这一格的F,G,和H值。
/2/如果它已经在开启列表中,用G值为参考检查新的路径是否更好。更低的G值意味着更好的路径。如果是这样,就把这一格的父节点改成当前格,并且重新计算这一格的 G和F值。
停止,当你 把目标格添加进了关闭列表,这时候路径被找到–>没有找到目标格,开启列表已经空了。这时候,路径不存在。
3.保存路径。从目标格开始,沿着每一格的父节点移动直到回到起始格。

算法:步骤架构
<1>开启集合
<2>关闭集合
<3>添加起始点到开始集合中
<4>循环如下步骤: 当前点=开启集合中最小F_Cost的点 将当前点移出开启集合中 将当前点添加到关闭集合中
<5>如果当前点是目标点,结束查询
<6>遍历当前点的每个相邻点 如果相邻点不能访问或者相邻点在关闭集合中,跳过此相邻点 如果新路径到相邻点的距离更短,或者相邻点不在开启集合中 重新设置F_Cost 重新设置其父节点为当前点
<7>如果相邻点不在开启集合中
<8>添加相邻点到开启集合


推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 云计算的优势与应用场景
    本文详细探讨了云计算为企业和个人带来的多种优势,包括成本节约、安全性提升、灵活性增强等。同时介绍了云计算的五大核心特点,并结合实际案例进行分析。 ... [详细]
  • 基于结构相似性的HOPC算法:多模态遥感影像配准方法及Matlab实现
    本文介绍了一种基于结构相似性的多模态遥感影像配准方法——HOPC算法,该算法通过相位一致性模型构建几何结构特征描述符,能够有效应对多模态影像间的非线性辐射差异。文章详细阐述了HOPC算法的原理、实验结果及其在多种遥感影像中的应用,并提供了相应的Matlab代码。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文详细介绍了MicroATX(也称Mini ATX)和MATX主板规格,探讨了它们的结构特点、应用场景及对电脑系统成本和性能的影响。同时,文章还涵盖了相关操作系统的实用技巧,如蓝牙设备图标删除、磁盘管理等。 ... [详细]
  • 本文探讨了 Swapper 工具对系统内存和存储设备(如 SD 卡)的潜在影响,解释其工作原理及使用时需要注意的问题。 ... [详细]
  • 由中科院自动化所、中科院大学及南昌大学联合研究提出了一种新颖的双路径生成对抗网络(TP-GAN),该技术能通过单一侧面照片生成逼真的正面人脸图像,显著提升了不同姿态下的人脸识别效果。 ... [详细]
  • 精选多款高效实用软件及工具推荐
    本文介绍并推荐多款高效实用的软件和工具,涵盖系统优化、网络加速、多媒体处理等多个领域,并提供安全可靠的下载途径。 ... [详细]
  • 2017年苹果全球开发者大会即将开幕,预计iOS将迎来重大更新,同时Siri智能音箱有望首次亮相,AI技术成为大会焦点。 ... [详细]
author-avatar
随风2502891175
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有