基于c++的A-star算法

2023-05-16

资料:https://www.cnblogs.com/guxuanqing/p/9610780.html
一、基础原理
1、从起点开始,向周围八个方向扩展。测试新扩展的点的路径代价,路径代价由已走的路径和距离终点的期望加和而成。这个路径代价是选择路径的标准。
2、有两个表open、close。
close:生成并且考察过的点,存在两种点。一种是当前选择的路径,是最终想要的结果。另一种是考察但没有用到的点,是考察过但是比最终路径代价大的路线,可能父指针可以指回起点,也可能无法指回起点(曾经进入死胡同的路线)。
open:生成但是没有考察的点
·若形象的想的话,open中的点,close中的最终路线,close中的没用的路线用不同的图形画出。open在最外侧一层,close在中间,有一条线根据父指针逐层引出。
3、具体步骤
(1)最开始的时候只有起点在open中.
(2)从open中找到最小的点n。
(3)n向八个方向扩展,就获得了八个新点x1~x8,接下来判断八个点的存入的地方。
(4)如果x存在于close中,则比较close中和当前点的代价大小。若新的点小,则用新的点代替旧的。若旧的点小,则放弃新的点。
如果x存在于open中,则比较close中和当前点的代价大小。若新的点小,则用新的点代替旧的。若旧的点小,则放弃新的点。
如果都不存在,就放入open。
根据这个方法,进行八个点的判定。
(5)将n放入close。
(6)返回(2),直到open中没有点或者到达目的地。
·close和open中都是没有重复的点的。整套算法,就是生成新的点,然后每一步做局部最优解,有错的情况下纠正,积累以后获得整体的最优解。
·局部最优解+多次尝试然后纠错=全局最优解

二、代码具体细节
·上面那个原理看起来很简单,但是实施起来尤其是需要关注效率的时候就有些困难了
1、每一个点包含的信息
·用一个结构体进行封装
(1)自身坐标
(2)父指针,实际上就是当前点存储着自己是由哪一个点扩展而来的。这个方法可以减轻很多代码负担,要改变路径的时候,只要在关键位置将代价更小的点放入close,将之前路径在这一个关键点后面的close中的点放回open就可以了。
(3)代价,代价由当前路径的代价和期望组成。路径期望的算法是路径规划效果好坏的关键。每一个点都存储着独一无二的当前路径的代价,这个代价是从父指针指着的点、父指针的父指针点、父指针的父指针的父指针点······一层层累加而得的。当前路径代价和父指针共同组成了,到达目前这个点的第一无二的路径信息和代价。
2、数据类型的选用
close、open都是长度不定的数据类型,我这里的想法是用一个结构体封装
要使用vector

未完待续······

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于c++的A-star算法 的相关文章

  • 【日志工具】g3log_5_自定义log格式

    自定义日志格式 重载默认文件接收器的文件头 默认文件头可以在默认文件接收器中自定义 FileSink overrideLogHeader std string 重载默认文件接收器的日志格式 默认的日志格式是在LogMessage hpp s
  • 【日志工具】g3log_6_ROS1中g3log的安装&使用

    ROS1中g3log的安装 amp 使用 基于ros1 melodic版本进行封装使用 g3log库安装 git clone https span class token operator span span class token com
  • nginx负载均衡 upstream ip_hash的用法

    文章目录 场景参考文档用法 场景 负载均衡解决session共享的问题 参考文档 nginx org upstream 用法 语法 Syntax ip hash Default Context upstream 说明 Specifies t
  • ros 播放激光雷达数据包,rviz可视化

    通过bag文件记录话题消息 当发布话题的节点运行后 xff0c 可以通过rostopic list 列出当前 运行的话题 xff0c 然后记录 xff1a mkdir bagfile cd bagfile rosbag record a 记
  • TIM2_CH1_ETR可以当做TIM2_CH1来用

    TIM2 CH1 ETR可以当做TIM2 CH1来用 在stm32中文参考手册8 3 7定时器复用功能重映射小节可以看到这样的描述
  • hal库LTDC的层数判断应为<而不是<=

    LTDC的层数判断为 IS LTDC LAYER LAYER LAYER lt 61 MAX LAYER 假设MAX LAYER 61 2 xff0c 则LAYER等于2时也满足条件判断 但在配置寄存器时 xff0c 寄存器的地址依靠 la
  • 【无标题】

    hal库 SD卡总线宽度设置8不支持 xff0c 但还是保留了设置总线宽度为8的宏定义 HAL SD ErrorTypedef span class token function HAL SD WideBusOperation Config
  • 【无标题】

    发现一个问题 使用HAL库中的这个类型定义变量 xff0c 但不使用的话居然不会报警告 就是它 xff1a DMA HandleTypeDef
  • 【无标题】

    勘误 xff1a stm32F4xx参考手册中 34 11小节FIFO框架图中 最上面的DIEPTXF2 31 16 应为DIEPTXFn 31 16
  • HttpURLConnection高阶使用之kerberos认证解决方案

    1 HttpURLConnection 简介 sun net www protocol http HttpURLConnection是jdk中默认执行请求时使用 此HttpURLConnection 支持多种权限认证方案 xff0c Neg
  • 下篇 | 开发板AMR接收虚拟机Ubuntu传来的文件

    上篇笔记 xff1a 虚拟机Ubuntu向开发板AMR传送文件 已经做好了虚拟机向开发板传送文件的笔记啦 xff0c 然后有发送肯定有接收的 xff0c 不然就发空气啦 xff01 接下来 xff0c 写开发板如何接受虚拟机发送过来的文件的

随机推荐

  • 解决QT->setText()中文出现乱码问题,使用QString或者tr()均出现乱码。

    微软VC编译器源代码使用GB2312编码进行保存 源码中的汉字字符串在生成可执行文件的过程中被转换成了本地编码 Qt内部是使用Unicode编码 xff0c 即QString保存的是Unicode编码的字符串 Qt内部需要使用Unicode
  • Qt 下载图片并显示图片

    源码下载 xff1a 图片下载器 include 34 mainwindow h 34 include 34 ui mainwindow h 34 include lt QHostAddress gt include lt QDebug g
  • 海康威视 web3.0开发 常见错误 404,403

    海康威视 web3 0开发 常见错误 404 xff0c 403 配置情况 IE 浏览器 43 nginx 43 thinkPHP5 0 43 海康威视200万星光级红外球机1080P变焦云台球机DS 2DC4223IW D 关于如何使用网
  • 虚拟USB设备总结

    开发环境 xff1a windows 首先来总结最近研究的虚拟USB设备 xff0c 进而虚拟USB键盘成功了 xff0c 开心 xff01 得出了一个C S框架 xff0c 首先说一下客户端 客户端有两个部分 xff0c 用户空间工具和底
  • C#Winform:《DataGridViewComboBoxCell值无效》解决方案

    值无效 xff0c 可能是你下拉框选项 xff0c 没有这样的值 xff0c 而你却设置这个值 dataGridView1 Rows i Cells 1 Value 61 Hello World 解决方法就是在窗体的构造函数里添加如下代码
  • FFmpeg笔记

    1 下载 xff0c 配置 FFmpeg官网 xff1a https ffmpeg org 用的系统是Ubuntu18 04 所以直接apt get就可以了 sudo apt get install ffmpeg 2 简介 xff0c 上手
  • 《WPF中TextBox绑定Double类型数据,文本框不能输入小数点》解决方案

    在App cs文件里面 xff0c 重写OnStatup xff0c 添加下面一条语句即可 span class token keyword public span span class token keyword partial span
  • stm32 HAL库串口收发-中断接收DMA发送不定长数据

    使用的时候发现 xff1a 接收完一个字节立即用DMA的方式发送出去 xff0c 会出现数据的丢失 xff0c 如用串口调试助手发送1234 xff0c 返回的只有13 目前只能用缓存buf 43 协议结束 xff08 如0x0d 0x0a
  • headers Authorization

    var auth 61 96 host user host pass 96 const buf 61 Buffer from auth 39 ascii 39 strauth 61 buf toString 39 base64 39 con
  • 平衡车入门---MPU6050陀螺仪的使用

    平衡车入门 MPU6050陀螺仪的使用 一 MPU6050简介二 学习MPU6050的步骤三 I2C协议简介四 MPU6050硬件介绍五 MPU6050的几个重要寄存器六 原始数据的单位换算七 角度换算 滤波算法 一 MPU6050简介 M
  • C++ 为什么基类的析构函数要声明为虚函数

    1 为什么声明基类析构函数为虚函数 xff1f xff08 1 xff09 基类指针 指向 基类对象 xff1a 不用考虑基类析构函数是否声明为虚函数 xff08 2 xff09 基类指针 指向 派生类对象 xff1a 若基类析构函数不为虚
  • std::map find和count效率测试

    1 简介 在使用标准模板库中的map容器且遇到键值对的值为自定义struct或class类型时 xff0c 考虑到特殊场景 xff08 即不能确保key自始至终唯一 xff09 xff0c 若插入新元素 xff08 new 对象 xff09
  • 随机生成8位长字符串(大小写字母及数字组合)

    1 简要说明 项目上开发要用到随机生成一个8位长的字符串 xff08 类似Java工具类中的UUID xff09 xff0c 作为id来对同一事物的不同个体进行唯一标识 xff0c 如同一个班级里学生名字几乎不同 xff0c 偶尔会有重复
  • C++引用和指针区别

    1 C 43 43 引用和指针区别 xff1a 指针是一个新的变量 xff0c 指向另一个变量的地址 xff0c 我们可以通过访问这个地址来修改另一个变量 xff1b 而引用是一个别名 xff0c 对引用的操作就是对变量的本身进行操作指针可
  • TCP/UDP端口号

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是TCP UDP端口号 在IP网络中 xff0c 一个IP地址可以唯一地标识一个主机 但一个主机上却可能同时有多个程序访问网络 要标识这
  • C/C++ 电脑微信dat文件解密及工具分享

    1 前言 最近想整理下照片 xff08 回忆 怀旧 xff09 xff0c 以前也知道在微信pc端聊天时 xff0c 图片 视频 文档等文件会缓存在一个目录下 xff08 电脑微信 左下角三条杠 设置 文件管理 xff09 xff0c 点击
  • ODBC::SQLExecDirect返回-1 错误信息ORA-00604 ORA-01000

    在通过使用微软提供的ODBC SDK读取数据库 xff08 SELECT xff09 时 xff0c 发现Oracle读着读着就读不到数据了 xff08 MySQL和SQL Server是正常的 xff09 xff0c 经调试发现SQLEx
  • std::vector与deque首尾增删及遍历(应用于CListCtrl虚拟列表)混合性能测试

    1 简介 在工作项目中应用MFC类库的CListCtrl刷新加载数据 xff0c 一开始是用InsertItem SetItemText 和DeleteItem 等成员函数来实现数据在列表视图控件中的新增和删除 xff08 最多显示500条
  • Matlab 实用代码集

    本博客将存放一些常用的Matlab代码片段 xff0c 整理成博客 xff0c 并持续更新 xff0c 以便写代码可以调用 1 函数多输入多输出 Matlab写函数的时候 xff0c 输入输出个数经常是不固定的 xff0c narginch
  • 基于c++的A-star算法

    资料 xff1a https www cnblogs com guxuanqing p 9610780 html 一 基础原理 1 从起点开始 xff0c 向周围八个方向扩展 测试新扩展的点的路径代价 xff0c 路径代价由已走的路径和距离