路径规划之A*算法

news2024/11/28 6:54:31

系列文章目录

路径规划之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.coloradmin.cn/o/1254411.html

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

相关文章

2018年2月16日 Go生态洞察:Go 1.10版本发布分析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

2017年11月16日 Go生态洞察:Go用户调查深度解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

BeanUtil的正确使用方式

shigen日更文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 在实际的开发中&#xff0c;我们常常会用到工具类去拷贝对象的属性&#xff0c;将一个对象的属性转换成另外一个…

机器人开发的选择

喷涂机器人 码垛机器人 纸箱码垛机器人 焊接机器人 跳舞机器人 管道清理机器人 工地巡检机器人 点餐机器人 化工巡检机器人 装箱机器人 安防巡检机器人 迎宾机器人好像有点像软银那个 污水管道检测机器人 大酒店用扫地机器人 家用扫地机器人 工厂用&#xff08;…

100元预算,轻松涨粉1000!腾讯运营面试秘籍大揭秘!

大家好啊&#xff01;小米在这里&#xff5e; 很高兴又有机会和大家见面啦&#xff01;最近小米参加了一场腾讯的运营面试&#xff0c;遇到了一个超有趣的问题&#xff1a;如果让你运营一个公众号&#xff0c;近期需要增加1000个关注&#xff0c;预算100元&#xff0c;怎么完成…

如何判断一个题目用“贪心/动态规划“还是用“BFS/DFS”方法解决

1 总结 1.1 贪心、动态规划和BFS/DFS题解的关系 一般能使用贪心、动态规划解决一个问题时&#xff0c;使用BFS&#xff0c;DFS也能解决这个题&#xff0c;但是反之不能成立。 1.2 2 贪心 -> BFS/DFS 2.1 跳跃游戏1和3的异同 这两道题&#xff0c;“跳跃游戏”&#xf…

【DevOps】基于 KubeSphere 的 Kubernetes 生产实践之旅(万字长文)

基于 KubeSphere 的 Kubernetes 生产实践 1.KubeSphere 简介1.1 全栈的 Kubernetes 容器云 PaaS 解决方案1.2 选型理由&#xff08;从运维的角度考虑&#xff09; 2.部署架构图3.节点规划3.1 软件版本3.2 规划说明3.2.1 K8s 集群规划3.2.2 存储集群3.2.3 中间件集群3.2.4 网络规…

详解Java中的异常体系结构(throw,throws,try-catch,finally,自定义异常)

目录 一.异常的概念 二.异常的体系结构 三.异常的处理 异常处理思路 LBYL&#xff1a;Look Before You Leap EAFP: Its Easier to Ask Forgiveness than Permission 异常抛出throw 异常的捕获 提醒声明throws try-catch捕获处理 finally的作用 四.自定义异常类 一.异…

人力资源管理后台 === 登陆+主页灵鉴权

目录 1. 分析登录流程 2. Vuex中用户模块的实现 3.Vue-cli代理解决跨域 4.axios封装 5.环境区分 6. 登录联调 7.主页权限验证-鉴权 1. 分析登录流程 传统思路都是登录校验通过之后&#xff0c;直接调用接口&#xff0c;获取token之后&#xff0c;跳转到主页。 vue-elemen…

一、深入简出串口(USRT)通信——基本概念。

一、前言 串口到底是什么&#xff1f;简单来说一句话就可以解释&#xff0c;串口就是一种通信协议。 看到这里可能大家会觉得你这不是放屁么&#xff0c;说了跟没说一样。所以这里做前言来描述&#xff0c;大家要先对通信协议有一个下意识地认识才能在学习串口的时候不至于迷茫…

使用Pytorch从零开始构建Normalizing Flow

归一化流 (Normalizing Flow) &#xff08;Rezende & Mohamed&#xff0c;2015&#xff09;学习可逆映射 f : X → Z f: X \rightarrow Z f:X→Z, 在这里X是我们的数据分布&#xff0c;Z是选定的潜在分布。 归一化流是生成模型家族的一部分&#xff0c;其中包括变分自动编…

PostgreSQL+patroni+etcd+haproxy+keepalived高可用

PostgreSQLpatronietcdhaproxykeepalived 高可用架构 部署环境 部署postgresql-15 一主二从&#xff1a; role主机组件主库 node203 192.168.56.203 pg15.5 Patroni、Etcd&#xff0c;haproxy、keepalived 从库 node204 192.168.56.204 pg15.5 Patroni、Etcd&#xff0c;ha…

Java(七)(Lambda表达式,正则表达式,集合(Collection,Collection的遍历方式))

目录 Lambda表达式 省略写法(要看懂) 正则表达式 语法 案例 正则表达式的搜索替换和分割内容 集合进阶 集合体系结构 Collection Collection的遍历方式 迭代器 增强for循环 Lambda表达式遍历Collection List集合 ArrayList LinkedList 哈希值 HashSet底层原理 …

ArcGIS中基于人口数据计算人口密度的方法

文章目录 一、密度分析原理二、点密度分析三、线密度分析四、核密度分析一、密度分析原理 密度分析是指根据输入的要素数据集计算整个区域的数据聚集状况,从而产生一个联系的密度表面。通过密度计算,将每个采样点的值散步到整个研究区域,并获得输出栅格中每个像元的密度值。…

R语言实现Lasso回归

一、Lasso回归 Lasso 回归&#xff08;Least Absolute Shrinkage and Selection Operator Regression&#xff09;是一种用于线性回归和特征选择的统计方法。它在回归问题中加入了L1正则化项&#xff0c;有助于解决多重共线性&#xff08;多个特征高度相关&#xff09;和特征选…

Java中有几种基本数据类型以及转换方式【Java面经(1)】

问&#xff1a;Java中有几种基本数据类型呢&#xff1f;以及它们之间的转换方式。详细介绍下 总共有8种基本数据类型 byte 、short 、long 、float 、double 、boolean 、char 详细类型以及字节数&#xff1a; 基本数据类型的转换方式 自动类型转换&#xff1a;小–>大 byt…

Vue快速实践总结 · 上篇

文章目录 模板语法数据绑定事件处理计算属性监视属性&#xff08;监听器&#xff09;条件渲染列表渲染数据监视原理内置指令总结生命周期组件化编程组件使用步骤组件的嵌套this指向单文件组件ref、props 脚手架(Vue CLI)render函数 参考自己的Vue专栏以及Vue官方文档 模板语法 …

stm32 42步进电机 上位机示例

脉冲到底是个啥东西&#xff1f;步进电机一直说发脉冲 步进电机通过接收脉冲信号来实现精确的位置控制。脉冲是一种短暂的电信号&#xff0c;它的变化可以触发步进电机转动一定的角度或步进。步进电机控制系统会根据输入的脉冲信号来精确定位和控制步进电机的转动&#xff0c;每…

Android平台GB28181设备接入模块开发填坑指南

技术背景 为什么要开发Android平台GB28181设备接入模块&#xff1f;这个问题不再赘述&#xff0c;在做Android平台GB28181客户端的时候&#xff0c;媒体数据这块&#xff0c;我们已经有了很好的积累&#xff0c;因为在此之前&#xff0c;我们就开发了非常成熟的RTMP推送、轻量…

rsyslog出现Unit rsyslog.service is masked不可用问题解决

博主在测试将日志发送到日志服务器的功能时遇到了rsyslog服务不可用的问题&#xff0c;具体来说&#xff0c;就是执行systemctl restart rsyslog或者 service rsyslog restart命令时&#xff0c;出现了标题中所述的Unit rsyslog.service is masked问题。网上查找了很多资料&…