移动机器人运动规划 --- 基于图搜索的A*算法

news2024/12/23 23:02:44

移动机器人运动规划 --- 基于图搜索的A*算法

  • A*算法
    • A*算法伪代码
    • A* 算法步骤示例
    • A*算法分析
        • 启发函数设计
      • A*应用的更好方式

A*算法

A算法与Dijkstra算法的框架是完全一样的,**A算法就是有启发性的Dijkstra算法**

代价函数:g(n) 表示的是从开始节点到当前n节点的代价累加

启发函数:h(n) 表示当前节点到目标节点估计所花的代价

优先级队列:维护的是 代价函数+启发函数的 节点从小到大排序 f(n)=g(n)+h(n)

每次弹出的节点就是最小的f(n)值的节点。

A*算法伪代码

维护一个优先级队列,存储所有被扩展的节点,且节点按f()值的大小自动按从小到大排列。

-所以节点的启发值h(n)是为被定义的,是不知道的,到具体的节点再计算

-优先级队列首先为空,以起始节点Xs进行初始化

-起始节点g(Xs)=0,并且初始化其它节点的代价为无穷大

-循环:
	1、如果队列是空的,返回false,跳出循环
	2**弹出优先级队列中f(n)最小的节点n** [唯一与djikstra不同的地方]
	3、标记节点n为被扩展节点
	4、如果节点n为目标节点,返回true,跳出循环
	5、找到n节点周围可以扩展的所以节点(没被扩展过)m
		6、进行判断 如果g(m)为无穷大(说明其它节点也没发现过m),
			7、则计算 真正的g(m)=g(n)+Cnm,然后将m节点加入到优先级队列中
		8、进行判断 如果g(m)不为无穷大,有值了(说明其它节点发现过m,m已经在优先级队列中)
			9、再次进行判断 如果之前发现m时计算的g(m)g(n)+Cnm大的话
				10、更新g(m)=g(n)+Cnm。
	11、重复循环至步骤1

-结束循环

A* 算法步骤示例

下面是一个A算法的演示图,每个边有个预先设置的代价g,每个节点有提前估计好的启发f
在这里插入图片描述
以这个图将A
算法运行的步骤进行一个示例:

1、首先初始化队列,将起始节点放入优先级队列中
在这里插入图片描述
2、弹出起始节点
可扩展的节点仅有a节点,计算f(a)=g(a)+h(a)=1+5=6
在这里插入图片描述
3、将扩展的节点放入优先级队列
在这里插入图片描述
4、弹出f最小节点,扩展周围节点
弹出a节点,a节点周围可以扩展的节点为 b\d\e 。并且根据g与h值计算f值
在这里插入图片描述
5、根据f值大小,压入队列中
d节点的f(d)=6最小,它在最下方。
在这里插入图片描述
6、弹出f值最小节点 ,扩展周围节点
弹出d节点,可扩展节点为G节点,计算f(G)=6
在这里插入图片描述
7、将最新扩展的节点加入优先级队列中,并进行排序
G最小,排到最底下
在这里插入图片描述
8、弹出f值最小节点
弹出的节点是目标节点G,算法结束
在这里插入图片描述

A*算法分析

A算法的结果是不是最优的?
在这里插入图片描述
例如这个图,安装A
算法的逻辑找到的路径是 S直接到G ,这样的代价是5。但是经过A节点的代价是4,所以经过A节点的路径是最优的。

问题就是某个节点估计的启发值是不合理的。

如果A*算法想保有最优性,需要估计的启发值要小于等于实际的启发值。

启发函数设计

设计的启发函数为可接受的要满足:需要估计的启发值要小于等于实际的启发值
如果满足上述条件,A算法的最终结果就是最优的
A
算法使用的时候重点就是如何设计可接受的启发函数

例如用欧式距离作为启发函数,则就是可接受的
用manhattan距离,则就不一定是可接受的

A*应用的更好方式

如果我们想用更高的启发估计,相当于A*算法在向贪心算法演变。

相当于虽然不是最优的结果,但是可以带来速度上的提升。

这样的操作就是 权重A*(Weighted A*)
f = g + ah ;a>1 , 越大找到目标的速度越快。

牺牲最优性获取搜索速度

在这里插入图片描述
Weighted A* 也有一些升级
例如:

  • AntTime A*
  • ARA*
  • D*

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

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

相关文章

python tempfile模块:生成临时文件和临时目录

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 tempfile 模块专门用于创建临时文件和临时目录,它既可以在 UNIX 平台上运行良好,也可以在 Windows 平台上运行良好。 tempfile 模块中常用…

蓝牙技术|蓝牙在物联网产品上的功能,特别是苹果Find My中的应用

蓝牙技术经历了不同的迭代,引入了新功能和改进。最初的蓝牙版本于1999年推出。低功耗蓝牙(BLE),也称为蓝牙4.0或蓝牙智能,于2010年发明,旨在最大限度地降低功耗。这使得它非常适合使用电池供电的物联网设备,从而延长电…

私有继承和虚函数私有化能用么?

源起 以前就知道private私有化声明关键字,和virtual虚函数关键字两者并不冲突,可以同时使用。 但是,它所表示的场景没有那么明晰,也觉得难以理解,直到近段时间遇到一个具体场景。 场景 借助ACE遇到的问题进行展示 …

深眸科技入局AI视觉行业,以深度学习赋能视觉应用推进智造升级

随着科技的飞速发展,人工智能技术已经成为改变我们生活的重要力量,而深度学习作为人工智能的一个重要分支,近年来随着卷积神经网络的突破和推广,取得了显著进展,并呈现爆发式增长势头。 目前AI技术已经被迅速引入到机…

数据集笔记:上海摩拜共享单车

2017年8月上海地区摩拜单车的数据,已脱敏处理 订单id、自行车id、用户id、起始时间、起始经纬度、终止时间、终止经纬度、路径 数据地址: 链接:https://pan.baidu.com/s/1LqL_VtCfgm3vv-NrVCoTkw 提取码:3d3y

各种不同情景的现场急救方法,正确急救的动作要领与操作步骤

一、教程描述 生活中的现场急救,应该是每个人必备的生活技能,可以成功挽救很多人的生命。本套教程为你讲解在各种不同情景下,针对宝宝、儿童与成人等不同群体,现场急救的操作步骤,正确急救的动作要领,以及…

docker安装MySQL 5.7

1.安装 Mysql 5.7 docker镜像 拉取官方镜像 docker pull mysql:5.7查看镜像库 docker images2.创建mysql容器 在本地创建mysql的映射目录 mkdir -p /root/mysql/data /root/mysql/logs /root/mysql/conf在/root/mysql/conf中创建 *.cnf 文件(叫什么都行) touch my.cnf创建…

【51单片机】10-蜂鸣器

1.蜂鸣器的原理 这里的“源”不是指电源。而是指震荡源。 也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。 而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。 有源蜂鸣器往往比无源的贵&#xff…

mysql双主互从

在主从配置的基础上,反向配置

zblog插件大全-zblog免费插件

在当今数字化时代,拥有一个精彩的博客或网站已经成为许多人追求的目标。通过博客,我们可以分享知识、表达观点,甚至创造收入。然而,维持一个充满新鲜内容的博客却不是一件容易的事情。 ZBlog自动采集插件 什么是ZBlog自动采集插件…

八、3d场景的区域光墙

在遇到区域展示的时候我们就能看到炫酷的区域选中效果,那么代码是怎么编辑的呢,今天咱们就好好说说,下面看实现效果。 思路: 首先,光墙肯定有多个,那么必须要创建一个新的js文件来作为他的原型对象。这个光…

IDEA的Maven换源

前言 IDEA是个好东西,但是使用maven项目时可能会让人很难受,要么是非常慢,要么直接下载不了。所以我们需要给IDEA自带maven换源,保证我们的下载速度。 具体操作 打开IDEA安装路径,然后打开下面的文件夹 plugins\m…

基于TOTP算法的Github两步验证2FA(双因子)机制Python3.10实现

从今年(2023)三月份开始,Github开始强制用户开启两步验证2FA(双因子)登录验证,毫无疑问,是出于安全层面的考虑,毕竟Github账号一旦被盗,所有代码仓库都会毁于一旦,关于双因子登录的必要性请参见&#xff1a…

利用Qt实现可视化科学计算器

📞个人信息 学号:102101433 姓名:林堂钦 💡 作业基本信息 【课程】福州大学2021级软件工程Ahttps://bbs.csdn.net/forums/ssynkqtd-05作业要求链接https://bbs.csdn.net/topics/617294583作业目标 实现一个简易计算器&…

Ubuntu系统Linux内核安装和使用

安装: 检查树莓派Linux版本,我的是6.1 uname -r 内核下载链接: Raspberry Pi GitHub 找对应版本下载 导入之后,解压安装即可 unzip linux-rpi-6.1.y.zip 其他内容 treee 指令安装 sudo apt-get install tree 使用这…

一探Redis究竟:超火爆入门指南,你竟然还没看?

Redis入门教程目录:【Redis入门教程目录】 简介 Redis是由C语言编写的开源、基于内存、支持多种数据结构、高性能的Key-Value数据库。 特性 速度快 首先Redis是将数据储存在内存中的,通常情况下每秒读写次数达到千万级别。其次Redis使用ANSI C编写&…

No145.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

LeetCode 377.组合总和IV 可解决一步爬m个台阶到n阶楼顶问题( 完全背包 + 排列数)

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围 示例 1: 输入:nums [1,2,3], target 4 输出:7 解释&#x…

Spring源码篇(十)@Bean怎么注册一个bean

文章目录 前言配置类里的Bean解析sourceClass是什么解析Bean方法添加Bean注解的方法信息注册总结Bean注册的过程注意点 前言 配置类的解析之前有聊过,这篇也会涉及到一部分,因为Bean本身也是配置类里的一个东西,本篇会着重解析Bean注册bean的…

区块链(6):p2p去中心化介绍

1 互联网中中心化的服务和去中心化服务的概念介绍 目前的互联网公司大都是中心化的 区块链网络大多是去中心化的 去中心化 2 p2p的简单介绍 java 网络编程:socket编程,netty编程,websoket简单介绍 2.1 节点是如何提供服务的(web编程实现)