路径规划之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 数学式方法

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

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

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. 将起点a放入到“开放列表”(open list)中,

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

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

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

2.5 案例查看

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

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

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

相关文章

leetcode 1670

leetcode 1670 解题思路 使用2个deque作为类的成员变量 code class FrontMiddleBackQueue { public:deque<int> left;deque<int> right;FrontMiddleBackQueue() {}void pushFront(int val) {left.push_front(val);if(left.size() right.size()2){right.push_fr…

如何使用ArcGIS Pro制作一张北极俯视地图

地图的表现形式有很多种&#xff0c;经常我们看到的地图是以大西洋为中心的地图&#xff0c;还有以太平洋为中心的地图&#xff0c;今天要给大家介绍的地图是从北极上方俯视看的地图&#xff0c;这里给大家讲解一下制作方法&#xff0c;希望能对你有所帮助。 修改坐标系 制作…

带着GPT-4V(ision)上路,自动驾驶新探索

On the Road with GPT-4V(ision): Early Explorations of Visual-Language Model on Autonomous Driving GitHub | https://github.com/PJLab-ADG/GPT4V-AD-Exploration arXiv | https://arxiv.org/abs/2311.05332 自动驾驶技术的追求取决于对感知、决策和控制系统的复杂集成。…

vue项目中使用jsonp跨域请求百度联想接口

一. 内容简介 vue项目中使用jsonp跨域请求百度联想接口 二. 软件环境 2.1 Visual Studio Code 1.75.0 2.2 chrome浏览器 2.3 node v18.14.0 三.主要流程 3.1 代码 核心代码 // 这个是请求函数doLeno() {// 挂载回调函数&#xff0c;不挂载&#xff0c;会报不存在window…

Webshell混淆免杀的一些思路

简介 为了避免被杀软检测到&#xff0c;黑客们会对Webshell进行混淆免杀。本文将介绍一些Webshell混淆免杀的思路&#xff0c;帮助安全人员更好地防范Webshell攻击。静态免杀是指通过对恶意软件进行混淆、加密或其他技术手段&#xff0c;使其在静态分析阶段难以被杀毒软件或安全…

基于U2-Net如何训练一个一键抠图模型

1. 前言 抠图是图像编辑的基础功能之一&#xff0c;在抠图的基础上可以发展出很多有意思的玩法和特效。比如一键更换背景、一键任务卡通化、一键人物素描化等。正是因为这些有意思的玩法。 最近也是对此模型背后的网络很感兴趣&#xff0c;收集数据训练了人脸素描化模型&…

Spark---资源、任务调度

一、Spark资源调度源码 1、Spark资源调度源码过程 Spark资源调度源码是在Driver启动之后注册Application完成后开始的。Spark资源调度主要就是Spark集群如何给当前提交的Spark application在Worker资源节点上划分资源。Spark资源调度源码在Master.scala类中的schedule()中进行…

界面控件DevExpress WPF流程图组件,完美复制Visio UI!(二)

DevExpress WPF Diagram&#xff08;流程图&#xff09;控件帮助用户完美复制Microsoft Visio UI&#xff0c;并将信息丰富且组织良好的图表、流程图和组织图轻松合并到您的下一个WPF项目中。 在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们为大家介绍…

Java后端开发——MVC商品管理程序

Java后端开发——MVC商品管理程序 本篇文章内容主要有下面几个部分&#xff1a; MVC架构介绍项目环境搭建商品管理模块Servlet代码重构BaseServlet文件上传 MVC 是模型-视图-控制器&#xff08;Model-View-Controller&#xff09;&#xff0c;它是一种设计模式&#xff0c;也…

java设计模式学习之【原型模式】

文章目录 引言原型模式简介定义与用途实现方式UML 使用场景优势与劣势原型模式在spring中的应用员工记录示例代码地址 引言 原型模式是一种创建型设计模式&#xff0c;它允许对象能够复制自身&#xff0c;以此来创建一个新的对象。这种模式在需要重复地创建相似对象时非常有用…

【代码】基于卷积神经网络(CNN)-支持向量机(SVM)的分类预测算法

程序名称&#xff1a;基于卷积神经网络&#xff08;CNN&#xff09;-支持向量机&#xff08;SVM&#xff09;的分类预测算法 实现平台&#xff1a;matlab 代码简介&#xff1a;CNN-SVM是一种常用的图像分类方法&#xff0c;结合了卷积神经网络&#xff08;CNN&#xff09;和支…

移动应用开发介绍及iOS方向学习路线(HUT移动组版)

移动应用开发介绍及iOS方向学习路线&#xff08;HUT移动组版&#xff09; 前言 ​ 作为一个HUT移动组待了一坤年&#xff08;两年半&#xff09;多的老人&#xff0c;在这里为还在考虑进哪个组的萌新们以及将来进组的新朋友提供一份关于移动应用开发介绍以及学习路线的白话文…

DC电源模块有哪些常见故障?怎么解决这些问题?

DC-DC电源模块的作用是将输入电压转换为所需的输出电压&#xff0c;广泛应用于电子产品、汽车电子、医疗设备、通信系统等领域。但是在使用过程中DC电源模块会出现一些故障和问题&#xff0c;影响电源模块和其它电路器件的性能。因此&#xff0c;纳米软件将为大家介绍常见的DC-…

大坝安全监测的内容及作用

大坝安全监测是指对大坝水雨情沉降、倾斜、渗压以及大坝形状特征有效地进行监测&#xff0c;及时发现潜在的安全隐患和异常情况&#xff0c;以便大坝管理人员能够做出科学决策&#xff0c;以确保大坝安全稳定运行。 大坝安全监测的主要内容 1.表面位移监测&#xff1a;监测大坝…

分子骨架跃迁工具-DiffHopp 评测

一、文章背景介绍 DiffHopp模型发表在ICML 2023 Workshop on Computational Biology&#xff08;简称&#xff1a;2023 ICML-WCB&#xff09;上的文章。第一作者是剑桥计算机系的Jos Torge。 DiffHopp是一个专门针对骨架跃迁任务而训练的E3等变条件扩散模型。此外&#xff0c;…

LeetCode Hot100 84.柱状图中最大的矩形

题目&#xff1a; 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 方法&#xff1a; 代码&#xff1a; class Solution {public int largestRectang…

MySOL常见四种连接查询

1、内联接 &#xff08;典型的联接运算&#xff0c;使用像 或 <> 之类的比较运算符&#xff09;。包括相等联接和自然联接。 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如&#xff0c;检索 students和courses表中学生标识号相同的所有行。 2、…

机器学习之危险品车辆目标检测

危险品的运输涉及从离开仓库到由车辆运输到目的地的风险。监控事故、车辆运动动态以及车辆通过特定区域的频率对于监督车辆运输危险品的过程至关重要。 在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数…

使用STM32微控制器实现光电传感器的接口和数据处理

光电传感器在许多领域中被广泛应用&#xff0c;例如工业自动化、智能家居等。本文将介绍如何使用STM32微控制器实现光电传感器的接口和数据处理的方案&#xff0c;包括硬件设计、引脚配置、数据采集、滤波和阈值判断等关键步骤&#xff0c;并给出相应的代码示例。 一、引言 光…

MySQL使用函数和存储过程实现:向数据表快速插入大量测试数据

实现过程 1.创建表 CREATE TABLE user_info (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) DEFAULT NULL,age INT(3) DEFAULT NULL,pwd VARCHAR(20) DEFAULT NULL,phone_number VARCHAR(11) DEFAULT NULL,email VARCHAR(255) DEFAULT NULL,address VARCHAR(255) DEF…