A*与Dijkstra

C++

内存分区
程序运行前,分为全局区和代码区。
程序运行后,分为栈区和堆区
栈区:由编译器自动分配释放,存放局部变量,栈区的数据在函数执行后自动释放,所以不要返回局部变量的地址。
堆区:由程序员分配释放。利用new可以将数据开辟到堆区。用new可以将堆区的地址返回
new操作符: 创建 int* p = new int(10) ; int* arr = new int[10] ;删除:delete p; delete []arr;
在这里插入图片描述

运动规划

今天看了Dijkstra和A算法,主要是对A的了解更多了,A就是Dijkstra with a Heuristic。就有点像是说A是Dijkstra加上贪心算法的优点。因为D算法特征有点像广度优先算法,它是一层一层的遍历出去的,(如图一),我们想优化它。贪心算法给了我们启发,贪心算法会估计起点与目标点的距离以此来决定搜索的方向,它具有很强的目的性。我们将这种目的性加入到D算法中得到了A算法。原本D算法是g(n), A算法加上了一个h(n),使其成为f(n) = g(n) + h(n),我们需要这个h(n) 是最优的,也就是它是要小于最短路径的,它要满足h(n) <= h*(n)。A虽然相较于D算法搜索范围减少了许多,但是我们还是不太满意,我们还是觉得它的搜索范围太宽泛了,h(n)比最小的cost h(n)还是小很多,有许多的冗余。所以此时我们引入了一个Tie Breaker来放大h(n),虽然可能会使它不在满足h(n) <= h*(n),但是在实际工程中,这个 差距几乎不能被测量,而引入它的缩小效果却比较显著,所以这是一个不错的选择。
在这里插入图片描述
A*与Dijkstra的直观对比。
在这里插入图片描述
网上的一些总结。

  1. Dijkstra算法计算源点到其他所有点的最短路径长度,A*关注点到点的最短路径(包括具体路径)。
  2. Dijkstra算法建立在较为抽象的图论层面,A*算法可以更轻松地用在诸如游戏地图寻路中。
  3. Dijkstra算法的实质是广度优先搜索,是一种发散式的搜索,所以空间复杂度和时间复杂度都比较高。对路径上的当前点,A算法不但记录其到源点的代价,还计算当前点到目标点的期望代价,是一种启发式算法,也可以认为是一种深度优先的算法。
    由第一点,当目标点很多时,A
    算法会带入大量重复数据和复杂的估价函数,所以如果不要求获得具体路径而只比较路径长度时,Dijkstra算法会成为更好的选择。
    在这里插入图片描述

视觉SLAM

今天学习了CMake。C++程序主要分为可执行文件和库文件,CMake将他们连接起来。先使用cmake命令进行编译,再使用make命令进行编译,编译过程中会产生一些中间文件,这样看起来很杂乱,分不清用户代码,所以我们可以新建一个文件夹build来盛放这些中间文件。常用命令有:1.add_executable()添加可执行文件。2.add_library()添加库文件。库分为静态库和共享库两种,静态库每次被调用都会产生一个副本,共享库只有一个副本 。共享库命令:add_library(xx SHARED XX.cpp),库文件分为.c和.h。.h文件说明库里面有啥。3.可执行文件要想使用一个库,需要将可执行程序链接到库文件上。命令:target_link_library()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值