ROB 第一篇 DFS & BFS

  • DFS & BFS
    • 简单介绍
    • 原理
      • DFS
      • BFS
    • 总结

DFS & BFS

简单介绍

DFS (depth first search) 和 BFS (breadth first search) 是两种比较基础的寻迹算法。何谓寻迹算法呢?限本人语言功底有限(高考语文不及格),不岔开来讲,请自行百度或谷歌。反正字面意思,就是找到路径的算法。

这是DFS跑的图,感觉走位很蛇皮。有点淡紫色的是寻迹走过的点,蓝色开始点,绿色是结束点。


这是BFS跑的,走位不这么蛇皮了, 算是直直的找到了目标点。

原理

DFS

首先申明一下,这里我假设寻迹只能从四个方向走,上下左右。
直接先PO一下DFS的伪代码

all nodes = {distance=infinity, parent=none, visited=False}
start_node = {distance=0, parent=none, visited=True}
visit_stack.append(start_node)
while iterate == True:current_node = pop (visit_stack)for each nodes_near_by:if (test_collision(nodes_near_by)==false) && nodes_near_by.visited = False :visit_stack.append(nodes_near_by)if  nodes_near_by.distance>current_node.distance + cal_distance(nodes_near_by, current_node):nodes_near_by.parent = current_nodenodes_near_by.distance = current_node.distance + cal_distance(nodes_near_by, current_node)if  nodes_near_by == goal_node:nodes_near_by.parent = current_nodeiterate = Falsebreaknodes_near_by. visited = True

大致是这么个意思,来解释一下。
node 在这里中文意思是节点的意思。
这里visit_stack可以看作一个列表或者数组,里面存放着已经访问过的点。在循环的时候,会pop出current_node(pop在此解释一下是删掉数组里最后一个元素,并返回删除元素的值)。 test_collision 在这里表示检测是否与障碍物相碰撞,具体怎么检测按具体情况而定,在这里不岔开来讲。
nodes_near_by代表current_node周围的点,我做的是周围四个点,8个点讲道理也是可以的。
cal_distance 这个是计算两个点之间的距离,一般来说相邻点之间的距离就是定值。

整个程序的意思就是:先把所有点初始化,每个点有三个量(struct结构体搞一下哈),每个点初始的distance都为无限大。然后会有一个数据集,叫做visit_stack(列表或数组)。在寻迹前已知起始点(start_node),和目标点(goal_node)。第一步会把起始点放到visit_stack里, 然后进入循环。
每次循环先pop出来一个点当作current_node,然后再current_node 周围找点进行判断。如果nodes_near_by的distance量大于current_node的distance的量与cal_distance(nodes_near_by, current_node)之和,说明是一条路子,就把nodes_near_by的parent指为 current_node,nodes_near_by的distance也更新一下。当周围点就是目标点时,终止循环。

然后就可以从goal_node开始溯源,goal_node的爸爸是谁,goal_node的爸爸是谁,goal_node的爸爸的爸爸是谁,直到goal_node的爸爸的爸爸的爸爸。。。爸爸是start_node为止。然后这样路径就出来了(伪代码种没有包含)。

BFS

BFS的代码和DFS代码非常相像。

all nodes = {distance=infinity, parent=none, visited=False}
start_node = {distance=0, parent=none, visited=True}
visit_stack.append(start_node)
while iterate == True:current_node = shift(visit_stack)for each nodes_near_by:if (test_collision(nodes_near_by)==false) && nodes_near_by.visited = False :visit_stack.append(nodes_near_by)if  nodes_near_by.distance>current_node.distance + cal_distance(nodes_near_by, current_node):nodes_near_by.parent = current_nodenodes_near_by.distance = current_node.distance + cal_distance(nodes_near_by, current_node)if  nodes_near_by == goal_node:nodes_near_by.parent = current_nodeiterate = Falsebreaknodes_near_by. visited = True

来来来,大家来找下不同。
大家的眼睛还是雪亮的。BFS 和 DFS唯一的区别就是就是在while循环里,一开始的pop变成了shift。
shift 和 pop 比,恰恰相反,是删掉数组里第一个元素,并返回删除元素的值。


看一下,这里 BFS 是像菱形一样向外扩张的。

总结

这两个算法算是比较简单的寻迹算法,BFS相对于DFS是可以找到比较优的路径的。后面我还会写A*寻迹算法,和这个比起来,BFS和DFS就是个弟弟,但其实三者框架大致一样。

ROB 第一篇 DFS BFS (寻迹算法)相关推荐

  1. 寻迹避障小车系统的组成

    寻迹避障小车系统通常由以下几个部分组成: 硬件部分:这包括小车本身.电机驱动.传感器.控制器等. 软件部分:这包括小车的控制程序.寻迹算法.避障算法等. 电源系统:这可能包括电池.充电器等. 外部通信 ...

  2. 寻迹避障小车的系统设计方案

    寻迹避障小车的系统设计方案通常包括以下几个部分: 硬件设载: 小车的机械结构.电机驱动.传感器(如激光雷达.摄像头等)和控制电路. 软件设计: 包括小车的控制程序.避障算法和寻迹算法. 数据处理: 将 ...

  3. ES聚合算法原理深入解读:深度优先算法(DFS)和广度优先算法(BFS)(一)

    本文为 ES聚合算法原理深入解读:深度优先算法(DFS)和广度优先算法(BFS)第一篇 深度优先算法(DFS)和广度优先算法(BFS):DFS 和 BFS 在 ES 中的应用(一) 深度优先算法(DF ...

  4. ES聚合算法原理深入解读:深度优先算法(DFS)和广度优先算法(BFS)(三)

    本文为:ES聚合算法原理深入解读:深度优先算法(DFS)和广度优先算法(BFS)第三篇 深度优先算法(DFS)和广度优先算法(BFS):DFS 和 BFS 在 ES 中的应用(一) 深度优先算法(DF ...

  5. matlab温度数据怎么滤波_卡尔曼滤波算法思想理解 Kalman filter 第一篇

    卡尔曼滤波算法思想理解 Kalman filter 第一篇 最近在初步的理解目标跟踪的领域, 其中一个非常经典的算法卡尔曼滤波Kalman filter是需要有很好的理解才行, 由于已经脱离了学校,懂 ...

  6. 第一篇 Frankle-Mccan去雾算法

    因为对图像处理感兴趣,就去本部蹭了丁老师的<数字图像处理>课程,感觉比自学效率高多了: 业余时间打算把课上部分代码实现,于是就有了这个博客:这里会不定期更新一些基础算法,大都是老师课上讲的 ...

  7. 基于STM32智能小车->红外寻迹篇

    嵌入式之路,贵在日常点滴 ---阿杰在线送代码 目录 前言 一.TCRT5000循迹模块介绍 二.红外寻迹小车原理 三.寻迹小车设计注意事项 四.寻迹小车程序 前言 系列文章之红外寻迹篇(库函数版本) ...

  8. 第一篇博客--记面陌陌科技计算机视觉算法工程师被刷经历(附面试过程中被问倒的一些算法题分析)...

    求职季,真的会让一个人变得有些不一样吧,比如我,对于一个菜鸟来说,最近一段时间焦虑不安外加有点自闭... 前段时间在校内网上看到了陌陌科技内推计算机视觉算法工程师和机器学习算法工程师的消息,抱着试试的 ...

  9. matlab实现鬼波信号压制算法(附鬼波算法压制工具包)  代码实践--第一篇 频率-空间域自适应鬼波压制

    matlab实现鬼波信号压制算法(附鬼波算法压制工具包)  代码实践 涵盖了频率-空间域.频率-波数域.拉东域鬼波压制算法     建议实践之前熟练掌握各个域鬼波压制方法的原理,才能对代码有更深入的了 ...

最新文章

  1. Category中实现了原始类实例变量的get方法导致的警告
  2. Python中的 @staticmethod@classmethod方法
  3. C++ 11 深度学习(七)位运算常见操作
  4. document.addeventlistener方法不执行_JUnit 5 测试方法的执行优先级
  5. 延边大学计算机金小峰,第九届中国信息安全博士论坛在我校开幕
  6. C++ UNICODE 文件读写相关
  7. Win10无法安装 文鼎CS行楷.TTF
  8. 2022-01-08:数组中只有0和1,每过1代,0旁边只有1个1,当前0会变成1。每过1代,0旁边有2个1,当前0还是0。 比如10001,经过1代,会变成11011,再过1代,还是11011 。
  9. SQL Server2008从入门到精通pdf
  10. 十年自学编程成才(编程小白必看)
  11. 亚特兰提斯之人鱼宝宝
  12. POJ1502 信息传递(单源最短路径)
  13. 【前端部署】vue项目打包并部署到Linux服务器
  14. 电脑显示器突然变了颜色
  15. Oracle中实现分页
  16. python中使用不同库读取图像并相互转换
  17. 通过命令行运行matlab代码
  18. STM32_基础入门_新建工程文件—基于固件库
  19. CRISP-DM(跨行业数据挖掘标准流程…
  20. 志愿者招募[网络流]

热门文章

  1. Dvwa之暴力破解全级别学习笔记
  2. 视频分析与多模态融合之一,为什么需要多模态融合
  3. 想自己搭建服务器,永久运行网站?一个 U 盘大小的树莓派就够了!
  4. LeetCode第 310 场周赛
  5. 嵌入式系统设计电子书
  6. 收集的SQL Server性能相关资料
  7. echart湖南地图
  8. python求阿姆斯特朗数
  9. latex插入参考文献小技巧
  10. 今日闲谈:为何国产动画能在抖音异军突起?