路径规划之A*算法

系列文章目录

路径规划之Dijkstra算法
路径规划之Best-First Search算法
路径规划之A*算法


路径规划之A*算法

  • 系列文章目录
  • 前言
  • 一、前期准备
    • 1.1 算法对比
    • 1.2 数学式方法
    • 1.3 启发式方法
  • 二、A*算法
    • 2.1 起源
    • 2.2 思想
    • 2.3 启发式函数
    • 2.4 过程
    • 2.5 案例查看


前言

之前提过Dijkstra算法的核心是每次遍历寻找离起点代价最小的点作为新的节点,Best-First Search算法的核心是每次遍历寻找离终点代价最小的点作为节点;二者各有优缺,所以就有大佬将二者结合起来提出了A*算法。

一、前期准备

1.1 算法对比

算法思想优点缺点
Dijkstra寻找离起点代价最小的点确保能找到最短路径运行时间长
Best-First Search寻找离终点代价最小的点运行时间短地图存在障碍物时难以找到最短路径

1.2 数学式方法

在寻找路径的问题中,数学式方法通常通过处理抽象图的属性,以及规定和分析有序检查图的节点以建立
最小成本路径的算法。 

代表算法就是Dijsktra算法。然而,数学式方法通常更关注解决方案的最终实现,却很少考虑算法的时间复杂度。

1.3 启发式方法

启发式方法指人在解决问题时所采取的一种根据经验规则进行发现的方法。其特点是在解决问题时,利用
过去的经验,选择已经行之有效的方法,而不是系统地、以确定的步骤去寻求答案。

博主刚看这个概念的时候脑子一闪而过动态规划的定义,而在寻找路径的问题中,使用关于由图表示的问题的领域的特殊知识,启发式方法通常可以提高特定图搜索问题的解决方案的计算效率。 然而,启发式方法通常无法保证始终找到最低权值(cost)的解决方案路径,Best-First Search就属于启发式方法。

二、A*算法

2.1 起源

A*算法于1968年由计算机科学家Peter Hart、Nils Nilsson和Bertram Raphael提出,它将Dijkstra和Best-First Search二者的优点结合起来,兼顾了 Dijkstra 的准确度和 Best-First Search的效率,可以快速有效地寻找到图中的最短路径,是应用最广的寻路算法。

2.2 思想

类似于Dijkstra和Best-First Search,它们的算法核心在1.1中已经提到了,而建立在二者之上的A算法的核心如下
在这里插入图片描述
f(n)代表A
的代价函数,g(n)代表当前点距离起点的代价,h(n)代表当前点距离终点的代价

2.3 启发式函数

在上述的代价函数中,我们知道f(n)是g(n)和h(n)两部分组成,g(n)是一个已知代价函数,而h(n)作为一个启发式函数,它的选择至关重要。

开始的时候博主不知道为什么h(n)是一个启发式函数,不是只要直接计算终点到当前点的距离就行了吗?
在这里插入图片描述
但是在实际应用中,不是单纯地计算距离就行的,当前点距离终点的路径上会存在很多路障,只要存在一个路障,单纯地计算距离这种方法直接gg;因此,选择一个好的启发式函数是重要的,它可以有效评估最小代价。以下是不同启发式函数的效果。

取值过程结果
h(n)=0演变成Dijkstra算法保证找到最短路径
h(n)>>g(n)演变成BFS算法不保证找到最短路径,但运算快
h(n)<实际代价h(n)越小,A*扩展结点越多,运行越慢保证找到最短路径,运算相对Dijkstra快一些
h(n)=实际代价仅仅寻找最佳路径而不扩展别的任何结点保证找到最短路径,运算非常快
h(n)>实际代价寻找最佳路径且扩展别的任何结点不保证找到最短路径,但运算快

2.4 过程

  1. 将起点放入到“开放列表”(open list)中,

  2. 重复如下过程:
    ① 遍历开放列表,计算列表中每一个节点的评价函数。查找 值最小的节点,把它作为当前要处理的节点。
    ② 对当前节点中,与之相邻的其他所有节点,做如下操作:
    若节点是不可抵达的(unreachable),或者在关闭列表(closed list)中,忽略它。否则,做如下操作。
    若节点不在开放列表中,则将其加入开放列表,并将当前节点设置为其父亲节点,计算节点的和。
    若节点已经在开放列表中,则需要检查这条路径(节点到节点的路径)是否更好。参考指标为值,若更小,则说明该路径更好。若这条路径更好,则将它的父亲节点(设为节点)设置为当前节点,并重新计算和。
    ③ 将n移动到“关闭列表”(closed list)中。关闭列表中的所有元素已经不需要被关注。

  3. 当满足如下条件中的一个时,程序终止。
    将终点加入到了开放列表中(此时路径已经找到了)。
    无法查找到终点,并且此时开放列表是空列表(此时没有路径)。

  4. 若终点已经找到,查找最短路径:从终点开始,每个节点都沿着父亲节点移动,直到起点。

2.5 案例查看

下图是A*算法在一个简单地图中的应用
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/219347.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring面向切面编程(AOP);Spring控制反转(IOC);解释一下Spring AOP里面的几个名词;Spring 的 IoC支持哪些功能

文章目录 Spring面向切面编程(AOP)什么是AOPSpring AOP and AspectJ AOP 的区别&#xff1f;Spring AOP中的动态代理如何理解 Spring 中的代理&#xff1f;解释一下Spring AOP里面的几个名词Spring在运行时通知对象Spring切面可以应用5种类型的通知&#xff1a;什么是切面 Aspe…

pyhon数据分析A股股票策略实际买卖总结(每月末更新数据)

简介 本篇文章主要记录python数据分析a股股票选股后实际买卖的记录。 选股策略 低位寻股&#xff0c;筛选出低位股价股票已经做过调整的股票&#xff0c;做短线交易&#xff08;不超过7天&#xff09;&#xff0c;不贪&#xff0c;小赚即走。分三个时段&#xff0c;开盘三十…

使用VC++设计程序:实现常见的三种图像插值算法:最近邻插值,双线性插值,立方卷积插值

图像放大的三种插值算法 获取源工程可访问gitee可在此工程的基础上进行学习。 该工程的其他文章&#xff1a; 01- 一元熵值、二维熵值 02- 图像平移变换&#xff0c;图像缩放、图像裁剪、图像对角线镜像以及图像的旋转 03-邻域平均平滑算法、中值滤波算法、K近邻均值滤波器 04-…

定长子网划分和变长子网划分问题_二叉树解法_通俗易懂_配考研真题

引入:定长子网划分和变长子网划分的基本概念 定长子网划分和变长子网划分的基本概念 目前常用的子网划分&#xff0c;是基于CIDR的子网划分&#xff0c;也就是将给定的CIDR地址块划分为若干个较小的CIDR地址块。 定长子网划分: 使用同一个子网掩码来划分子网&#xff0c;因…

Qt4用子类化ProxyModel和子类化MainWindow实现全表筛选,中文排序和复制粘贴

目录 1 需求 2 子类化ProxyModel实现全表筛选 3 字符串列表实现中文排序 3.1 Qt5中文排序 3.2 Qt4排序 4 表格的复制粘贴 5 应用 1 需求 模型视图编程是Qt开发的基本功&#xff0c;其中有几个关键问题需要解决&#xff1a; 全表筛选&#xff0c;或者说多列搜索中文排序…

文件元数据批量修改:mp3音频和mp4视频的元数据如何批量修改

在数字媒体处理和管理的日常工作中&#xff0c;文件元数据的批量修改是一个常见的需求。元数据&#xff0c;或者称为文件信息&#xff0c;可以包括文件的创建日期、修改日期、文件名、文件大小、标签等。在音乐和视频处理领域&#xff0c;例如对mp3音频和mp4视频文件&#xff0…

R语言期末复习一

创建一个长度为7的字符向量&#xff0c;元素为"A", "B", "C", "D", "E", "F", "G"&#xff0c;并命名为vec1。 创建一个因子&#xff0c;包含6个水果&#xff1a;"apple", "banana"…

梯度详解与优化实战

什么是梯度 对所有自变量求偏微分构成的向量&#xff0c;它是一个向量&#xff08;有大小和函数值增长方向&#xff09; 导数是一个标量 找最小值点坐标的案例 import torchimport numpy as np import matplotlib.pyplot as plt def himmelblau(x):return (x[0]**2x[1]-11)…

android系统新特性——用户界面以及系统界面改进

用户界面改进 Android用户界面改进最明显的就是MD了。MD是Google于2014年推出的设计语言&#xff0c;它是一套完整的设计系统&#xff0c;包含了动画、样式、布局、组件等一系列与设计有关的元素。通过对这些行为的描述&#xff0c;让开发者设计出更符合目标的软件&#xff0c…

电子学会C/C++编程等级考试2023年03月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字字符求和 请编写一个程序实现以下功能:从一个字符串中,提取出所有的数字字符即0-9,并作为数求和。 时间限制:1000 内存限制:65536输入 一行字符串,长度不超过100,字符串中不含空格。输出 字符串中所有数字字符作为数…

泛型你掌握多少?包装类你深入了解过吗?快进来看看吧~

目录 1、泛型是什么——引出泛型 2、泛型的使用 2.1、语法 2.2泛型类的使用 2.3、裸类型 3、泛型如何编译 3.1、擦除机制 3.2、为什么不能实例化泛型类型数组 4、泛型的上界 5、泛型方法 5.1、语法 5.2、举例 6、通配符 6.1、什么是通配符 6.2、统配符解决了什么…

【深入剖析K8s】容器技术基础(一):从进程开始说起

容器其实是一种特殊的进程而已。 可执行镜像 为了能够让这些代码正常运行’我们往往还要给它提供数据’比如我们这个加法程序所需要的输人文件这些数据加上代码本身的二进制文件放在磁盘上’就是我们平常所说的一个程序,也叫代码的可执行镜像&#xff08;executablejmage&…