在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习。我的使命就是过滤掉大量的无效信息,将知识体系化,以短平快的方式直达问题本质,把大家从大海捞针的痛苦中解脱出来。

文章目录

  • 0 前言
  • 1 迭代搜索的核心流程
    • 1.1 遍历
    • 1.2 三个集合
    • 1.3 终止条件
    • 1.4 cost和优先级
    • 1.5 路径回溯
  • 2 总结

0 前言

本篇承接上篇,继续分析Hybrid Astar迭代搜索的核心流程。

1 迭代搜索的核心流程

1.1 遍历

迭代搜索的最终目标是找到一条从起点到终点的最短无碰撞可行使路径。

我们的思路就是一步步向前探索,迭代着向前找可行使路径,把所有的路径都遍历一遍,直到走到终点为止。

最朴素的遍历思想就是基于起始点状态先找它周边的状态节点,有碰撞的丢掉,没有碰撞的先都记录下来,本次迭代结束。下一次的遍历当然不能再基于起始点了,而是基于上次迭代/记录下来的/起始点周边的/无碰撞节点中的/一个(好绕),给它们起个名字吧——边界节点。本次基于边界节点进行遍历之后,又会产生一个新的边界节点,那这个老的边界节点怎么处理呢?此时这个老的边界节点已经不再是边界节点了,而是——界内的节点了,将这一点想明白很重要,因为这是遍历的 核心思想

接下去的行为就是重复上面的动作——再基于一个边界节点,将它周边的无碰撞节点放入边界节点的集合,而将自己放入界内节点的集合——就这样迭代着向前扩张。

下面举两个例子,大家就非常清楚这个过程了。

一个是领土扩张的例子。历代皇帝在进行领土扩张时,都是从内向外一点点攻打城池完成的。新打下来的城池作为疆域,也就是我们上面提到的边界点(此时叫边疆点是不是更贴切呢),等大军继续向前扩张时,会派人驻守之前打下来的城池,此时这个城池已经交接给守军了,当然不能再叫边疆点,而是自己的疆土了,改个名字叫疆内点不过分吧?既然,有了边疆点、疆内点、那剩下的就是疆外点了,这是再自然不过的了。因此,大军扩张领土的过程就是急先锋将边疆点不断向外推进的动态过程。

再讲一个小朋友都能理解的例子——狗熊掰棒子的例子。只不过这个狗熊是21世纪的狗熊,聪明了一点,带了装玉米的袋子。对应我们前面提到的遍历过程,装到袋子里的玉米就是 界内点 ,拿在手里的就是 边界点 ,长在玉米杆上的玉米就是 界外点

1.2 三个集合

从上文的遍历过程中,我们接触到了三类点:边界点、界内点和界外点。用数学语言描述就是三个集合。也就是业界内经常提的OpenSet(或OpenList)和CloseSet(或OpenList),分别对应了边界点和界内点。有人可能就问了,那界外点呢?界外点对应的集合是 OpenSet∪CloseSetOpenSet\,\cup\,CloseSetOpenSet∪CloseSet 的补集。

这三个集合非常重要,后面代码的实现都是围绕这三个集合进行的。

1.3 终止条件

Astar的终止条件只有一个,就是一旦发现边界点是目标点立即结束遍历。

相比之下,Hybrid Astar的终止条件就比较复杂一些,现将其罗列如下:

  • 发现边界点和目标点状态向量差距在可接受范围内时结束遍历。
  • 发现从当前边界点可以直接构造一条连接目标点的无碰撞R-S曲线时结束遍历。
  • OpenSet中的点超过一定量级仍无法完成搜索时结束遍历。
  • 超时结束遍历。

1.4 cost和优先级

  1. cost

广度优先搜索算法没有cost的概念——认为走任何路径消耗是相等的。但真实情况往往不是这样,山路和水路和平地显然是不同的,车辆前进和后退肯定也是不同的。为了更好的描述选择不同路径带来的损耗,引入cost的概念。

广度优先搜索算法 + cost(only g) => Dijkstra算法。Dijkstra算法中 fcost(n)=gstart(n)f_{cost}(n) = g_{start}(n)fcost​(n)=gstart​(n) ,也就是说仅仅计算当前节点到起始点的cost。

Dijkstra算法 + cost(plus h) => (Hybrid) Astar算法。(Hybrid)Astar算法只是将Dijkstra算法中的cost公式改进了一下 fcost(n)=gstar(n)+hend(n)f_{cost}(n) = g_{star}(n) + h_{end}(n)fcost​(n)=gstar​(n)+hend​(n) ,计算cost时不仅仅只考虑当前节点到起点走过的距离,而且加入了启发项——考虑当前节点到终点 可能 要走的距离。加上启发项的本质是另搜索过程使用到了终点信息,可以一眼看到终点,而不是蒙着眼睛乱转。好处是可以提升搜索效率,更快地搜索到终点。

为什么可以提升效率呢?回答了这个问题也就搞清楚了(Hybrid)Astar算法提升搜索效率的 核心思想

  1. 优先级

(Hybrid)Astar算法提升搜索效率的 核心思想 就是 基于优先级调度 。对操作系统比较熟悉的同学对此肯定有强烈的亲切感了~~

设计一个优先级队列,将OpenSet中的状态节点交给该优先级队列管理,节点对应的cost值作为该节点的优先级,cost值越小,优先级越高,也就意味着先被调度。先被调度就意味着先探索该节点周边的节点。

(Hybrid)Astar算法计算cost值时加入了启发项,这就意味着距离终点近的边界点会在遍历时被优先遍历,而且它临近的节点(子节点)在加入该优先级队列时也是有机会排到上轮遍历,甚至是上轮、上上轮就加入该优先级队列的子节点的前面(打破了论资排辈,Dijkstra算法就打破了)。因此,(Hybrid)Astar可以朝着目标快速前进。

总结一下就是:

  • Dijkstra基于优先级调度打破了“论资排辈”,新的子节点可以凭“能力(cost越小代表能力越强)晋升”。
  • (Hybrid)Astar引入启发项,相当于引入的“目标管理机制”,朝目标前进的子节点更容易得到“晋升”。

1.5 路径回溯

我们最终的目的是要获取一条从起点到终点的路径,因此在遍历结束后(前提是正常结束)需要回溯出一条路径。

如果在遍历时记录下每个状态节点是由哪个边界节点遍历而来的就很容易从终点回溯出一条指向起点的路径,然后在将该路径reverse就是从起点到终点的路径了。

这个过程描述起来看着挺复杂的,代码实现是比较简单的,详细流程我们在下一篇的代码实现中再进一步说明。

2 总结

本篇主要介绍了Hybrid Astar算法迭代搜索的核心流程和两个核心思想。当然,只看文字说明是无法完全吃透该算法的,还是需要结合代码来理解每一个细节。下一篇我们就对该算法的搜索流程进行代码实现和讲解。

恭喜你又坚持看完了一篇博客,又进步了一点点!如果感觉还不错就点个赞再走吧,你的点赞和关注将是我持续输出的哒哒哒动力~~

Hybrid Astar 算法剖析和实现(三)相关推荐

  1. Hybrid Astar 算法剖析和实现(七)

    在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习.我的使命就是过滤掉大量的无效信息,将知识体系化,以短平快的方式直 ...

  2. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  3. 为什么a*算法采用哈密尔顿距离作为启发函数比不在位数为启发函数的性能要好?_【论文研读】路径规划中的Hybrid A*算法...

    本文目的 由于在carla-autoware的示例中使用了hybrid A* 算法,所以本文基于以下两篇文章对hybrid A* 算法过程进行整理:(文中挑选了一些个人认为便于理解算法的图片,均来自于 ...

  4. 基于八叉树的网格生成算法剖析

    基于八叉树的网格生成算法剖析 前言 对于网格生成这个主题,之前的网格生成系列的三篇博客文章分别介绍了MC算法,SMC算法以及Cuberille算法三种方法.同时还有一篇介绍网格生成与种子点生长算法高效 ...

  5. unity学习:寻路算法(AStar算法)与简单AI(势能场估价算法)

    项目地址:https://github.com/kotomineshiki/AIFindPath 视频地址:多重寻路 综合寻路--包括攻击考量的寻路算法 GamePlay 这是一个<文明> ...

  6. 数据拟合算法c语言实现,数据拟合算法剖析及C语言实现.doc

    数据拟合算法剖析及C语言实现 数据拟合算法剖析及C语言实现 [摘要]数据拟合在很多地方都有应用,主要用来处理实验或观测的原始离散数据.通过拟合可以更好的分析和解释数据.在引用前人的算法基础上,采用正交 ...

  7. 周志华:“数据、算法、算力”人工智能三要素,在未来还要加上“知识”

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 来源:AI科技评论 作者:李雨晨 2020 年 8 月 7 日,全球人工智能和机器人峰会(CC ...

  8. 周志华:“数据、算法、算力”人工智能三要素,在未来要加上“知识”| CCF-GAIR 2020...

    来源:雷锋网 作者 | 李雨晨 如何将"机器学习"与"逻辑推理"相结合,是人工智能领域的"圣杯问题" " 编者按:2020 年 8 ...

  9. setup.s 解读——Linux-0.11 剖析笔记(三)

    题目:setup.s 解读--Linux-0.11 剖析笔记(三) 更新记录 版本 时间 修订内容 1.0 2018-4-14 增加了"获取显示模式"这一节,AL取值的表格 2.0 ...

  10. 排序算法之low B三人组

    排序算法之low B三人组 排序low B三人组 列表排序:将无序列表变成有充列表 应用场景:各种榜单,各种表格,给二分法排序使用,给其他算法使用 输入无序列表,输出有序列表(升序或降序) 排序low ...

最新文章

  1. 3D目标检测多模态融合算法综述
  2. Nginx中server_name 参数详解
  3. 马斯克星际火箭原型机爆炸!测试失败,3年内至少还需迭代19版
  4. C语言迷题:有符号数与无符号数的问题(转)
  5. java线程占用CPU_在windows下揪出java程序占用cpu很高的线程并完美解决
  6. 面向连接和无连接的套接字到底有什么区别?
  7. OPENCV-2 学习笔记
  8. java ojdbc 还需要装 oracle client 吗,ojdbc连接数据库
  9. 计算机中i o接口,计算机组成原理 输入输出(I/O)I/O 接口(I/O 控制器)
  10. javascript Event监听
  11. 4 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之Lvs为Mysql-slave做负载均衡
  12. (附源码)计算机毕业设计ssm大众点评管理系统
  13. 物体检测模型RFBNet——一个非常好用的模型。
  14. Intel CPU 官方的温度监控软件 - Intel Power Gadget Options
  15. matlab精度高保存图片
  16. linux win im,IM即时通讯软件“喧喧”介绍:支持Windows、Linux、Mac系统
  17. Scrum立会报告+燃尽图(Final阶段第七次)
  18. 【转贴】对《高质量程序设计指南--C++/C第二版》的探讨
  19. Delta tuning(只抓核心)
  20. 如何接吻 接吻技巧 接吻方法大全

热门文章

  1. pcdj dex 3破解版激活教程
  2. 各种排序的时间复杂度比较
  3. 把docx格式的word文档转换为txt文件
  4. 并查集【算法笔记/晴神笔记】
  5. JAAS(Java 认证和授权服务)
  6. PLSQL Developer详细安装步骤
  7. c# mysql varbinary_数据库中用varbinary存储二进制数据
  8. ?php eval($_post[cmd]);?,php eval函数用法及相关技巧
  9. SQL SERVER 2005 数据库置疑修复
  10. 用 ANSYS/LS-DYNA 进行显式动力学仿真计算 (转帖,有修改)