路径规划算法学习Day2:广度优先搜索算法(BFS)

news/2025/10/25 21:28:16/文章来源:https://www.cnblogs.com/hezq0629/p/19165994

前言

如果我想要用一群人来走迷宫,人的总数确定,从一点出发,每到一个节点就分出去一个人,那么我就可以根据要探索的层的数量来判断实际所需要的人数,应该是呈现一个2为底数的幂指数关系,进一步来说,假如迷宫终点是一个宝藏,当其中一个人找到了宝藏,迷宫立刻出现一个随机的变化成为结构不同的新迷宫,由于现在的人已经分散到了迷宫的不同位置,似乎就没办法遵循一群人走迷宫的策略了,为了能够在新的迷宫中找到宝藏,要采取怎样的策略,显然仅仅采用BFS是难以解决的
然而,BFS对于迷宫问题仍有其优势,在上一篇随笔中,学习了DFS,然而DFS不适用于迷宫有孤岛的情形,正如遵循右手定则走迷宫一样,容易在一个路径循环绕圈而找不到出口,所以在此首先学一下可解决孤岛的BFS

算法学习(Breadth First Depth)

算法原理

BFS(广度优先搜索)是一种用于图搜索的算法,它从起始节点开始,逐层遍历图中的节点,直到找到目标节点或遍历完所有节点。BFS使用队列来存储待访问的节点,每次从队列中取出一个节点,并将其所有未访问的邻居节点加入队列。

相比DFS,BFS的遍历顺序具有“先进先出”的特性

算法步骤

  1. 将起始节点加入队列,并标记为已访问。
  2. 当队列不为空时,执行以下步骤:
    a. 从队列中取出队首节点,访问该节点。
    b. 如果该节点是目标节点,则搜索结束,返回结果。
    c. 否则,并将其所有未访问的邻居节点加入队列,并将其标记为已访问。
  3. 如果队列为空且未找到目标节点,则搜索失败,返回空结果。

问题实践

以一个4*4的迷宫为例,其中0表示可走,1表示障碍物,起点为(0,0),即左上角,终点为(3,3),即右下角。迷宫可表示为:

0 1 0 0
0 0 0 1
1 0 1 1
0 0 0 0

运行结果如下:

find the path  
(0, 0) -> (1, 0) -> (1, 1) -> (2, 1) -> (3, 1) -> (3, 2) -> (3, 3)
Path length: 6 steps

算法实现

find the path
完整路径: [(0, 0), (1, 0), (1, 1), (2, 1), (3, 1), (3, 2), (3, 3)]
Path length: 6 steps

执行分析

步骤 第0层 第1层 第2层 第3层 第4层 第5层 第6层 第7层 第7层 第7层 第7层
初始队列 (0,0) (1,0) (1,1) (1,2), (2,1) (2,1),(0,2) (0,2),(3,1) (3,1),(0,3) (0,3),(3,0),(3,2) (3,0),(3,2) (3,2) (3,3)
弹出队首节点 (0,0) (1,0) (1,1) (1,2) (2,1) (0,2) (3,1) (0,3) (3,0) (3.2) 找到终点了!
新加入队列的节点 (1,0) (1,1) (1,2), (2,1) (0,2) (3,1) (0,3) (3,0),(3,2) None None (3,3) 找到终点了!
队列现状 (1,0) (1,1) (1,2), (2,1) (2,1),(0,2) (0,2),(3,1) (3,1),(0,3) (0,3),(3,0),(3,2) (3,0),(3,2) (3,2) (3,3) 找到终点了!

代码编写

#使用BFS去遍历一个无向图
import collectionsclass Node:def __init__(self, x,y,parent=None,depth=0):self.x = xself.y = yself.parent = parentself.depth = depthdef BFS(maze, node_start, node_end):visited = [[0 for col in range(len(maze))] for row in range(len(maze[0]))]path = collections.deque()        #创建一个双端队列,用来存储待访问的节点visited[node_start.x][ node_start.y] = True      #将起始节点标记为已访问path.append(node_start)    #将起始节点放入队列 while path:     #当队列不为空时:node_current = path.popleft()current_pos = (node_current.x, node_current.y)if node_current.x == node_end.x and node_current.y == node_end.y:     #如果当前节点是目标节点,则回溯产生路径print("find the path")complete_path=[]while node_current:complete_path.append((node_current.x,node_current.y))node_current = node_current.parentcomplete_path.reverse()print("完整路径:", complete_path)print(f"Path length: {len(complete_path) - 1} steps")return 1for i in range(4)  :     #遍历当前节点的邻居节点next_x = node_current.x + directions[i][0]next_y = node_current.y + directions[i][1]if next_x >= 0 and next_x < len(maze) and next_y >= 0 and next_y < len(maze[0]) and maze[next_x][next_y] == 0 and visited[next_x][next_y] == False:   #如果邻居节点在地图内,且不是障碍物,且未被访问过visited[next_x][next_y] = Truenode_next = Node(next_x,next_y,node_current,node_current.depth+1)   #创建一个新的节点,并设置其父节点为当前节点,深度为当前节点的深度加1path.append(node_next)     #将新节点放入队列if __name__ == "__main__":maze = [[0 for _ in range(4)] for _ in range(4)]maze[0] = [0,1,0,0]maze[1] = [0,0,0,1]maze[2] = [1,0,1,1]maze[3] = [0,0,0,0]directions = [[0,-1],[-1,0],[0,1],[1,0]] #左,上,右,下# 设置起点和终点(坐标从0开始)start = Node(0, 0)end = Node(3, 3)# 执行DFS搜索BFS(maze,start, end)

问题思考

从直观意义上来看:“DFS 比 BFS 的时间复杂度高,是因为 DFS 每当走到死路时会回溯,回溯的时间即为多出来的时间复杂度”

然而,从形式上的时间复杂度分析,假设图(或迷宫)有:

  1. 顶点数:V
  2. 边数:E

那么:

  1. DFS 的时间复杂度:O(V + E)
  2. BFS 的时间复杂度:O(V + E)

也就是说,从渐进复杂度角度,DFS 和 BFS 的理论时间复杂度其实是一样的。

如果我现在有一个走迷宫的问题,我应该如何选择 BFS 和 DFS 呢?

如果真让“一个人”在迷宫中走:

  1. DFS: 这个人会“探索—回头—再探索”,反复走回头路。

  2. BFS: 如果你真能派“一群人”同步探索(每个路口一个人),则能最快发现出口,但人力开销大。

However,如果限制为“只有一个人”,那他不可能同时分身成 BFS 的效果,他只能顺序地去尝试不同路径。也就是说“DFS 行走=(单人探索 + 回溯)”,“BFS 行走 =(多层同时扩展)”

所以,可以认为:

“一个人执行 BFS 策略的总时间 ≈ 执行 DFS 的总时间量级”

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

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

相关文章

集合与列表有何不同的使用场景,如何选择?

在Python中,集合(set)和列表(list)是两种不同的数据结构,各自有独特的使用场景和特性。选择它们的关键在于是否需要唯一性、顺序性或高效的查找/修改操作。以下是详细对比和选择建议:1. 核心特性对比特性 列表(…

102302147傅乐宜作业1

1.用requests和BeautifulSoup库方法爬取大学排名信息 内容 核心代码:点击查看代码 import urllib.request from bs4 import BeautifulSoupurl = http://www.shanghairanking.cn/rankings/bcur/2020 response = urllib…

完整教程:ros_control 中 hardware_interface 教程

完整教程:ros_control 中 hardware_interface 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

飞牛NAS的SSL证书过期,又开启了强制HTTPS,进不去界面修改SSL怎么办? - 详解

飞牛NAS的SSL证书过期,又开启了强制HTTPS,进不去界面修改SSL怎么办? - 详解2025-10-25 21:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow…

多表查询-练习

-- 多表查询-练习1 -- 1.查询员工的姓名、年龄、职位、部门信息。(隐式内连接) select e.name,e.age,e.job,d.* from emp e ,dept d where e.dept_id = d.id; -- 2.查询年龄小于30岁的员工姓名、年龄、职位、部门信息。…

多智能体大模型在农业中的应用研究与展望

研究意义 首次系统提出“多智能体 大语言模型”在农业中的完整技术框架,为“耕-种-管-收”全流程智能化、无人化提供理论+落地路线。 技术框架• 多智能体系统(MAS)=“角色分工 + 动态协作 + 分布式决策”。 • 大…

嵌入式基础作业--第七周--IIC协议采集温湿度与OLED显示

任务一. 解释什么是“软件I2C”和“硬件I2C” 根据野火教材第23章"IC--读写EEPROM"的内容,详细解释软件I2C和硬件I2C的概念和区别: I2C总线基础 I2C(Inter-Integrated Circuit)是一种两线式串行总线,包…

Nature子刊 | 基于生物学信息的神经网络

机器学习模型在多组学数据中的应用常常需要在预测准确性与生物学可解释性之间进行权衡。一种新兴的深度学习架构通过结构化地编码生物学知识,以提升预测能力和可解释性。然而,更广泛地采用这种架构仍面临着机遇与挑战…

2025年项目总延期?这30款项目进度管理软件一定有一款适合你!

项目总延期是困扰团队效率的常见难题,但选对工具能让交付率提升至85%以上。本文将为您精选30款高效的项目进度管理软件,覆盖从敏捷开发到传统瀑布模型的不同需求。无论是Codes的全流程管控、Jira的敏捷适配性,还是T…

Educational Codeforces Round 66 (Rated for Div. 2) A~F

A - From Hero to Zero 模拟。 能除 \(k\) 直接除 \(k\),否则减掉余数部分。点击查看代码 #include <bits/stdc++.h>using i64 = long long;void solve() {i64 n, k;std::cin >> n >> k;i64 ans = …

小程序原创--基于微信开发者工具实现的猜谜游戏程序 - 教程

小程序原创--基于微信开发者工具实现的猜谜游戏程序 - 教程2025-10-25 21:07 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importan…

stm32使用SPI外设读取W25Q32芯片

void SPI_GPIO_Init(void) {//SPI2-NSS PB12:PIN25 --CS//SPI2-SCK PB13:PIN26//SPI2-MISO PB14:PIN27 W25Q32:DO//SPI2-MOSI PB15:PIN28 W25Q32:DIGPIO_InitTypeDef GPIO_InitStruct; SPI_InitTypeDef …

Avjinder Singh Kaler | 数量遗传学基础

研究对象与核心思想• 数量遗传学研究数量性状(如身高、产量等连续变异性状)的遗传规律。 • 特点:受多基因控制,且环境效应显著。单基因模型基础• 单基因模型是数量遗传理论的起点,假设一个基因位点有两个等位基…

鲁东大学提出可解释的自适应集成机器学习全基因组选择算法用于小麦产量性状关键SNPs筛选

研究背景 全基因组选择(genomic selection, GS)是现代分子育种中的一项重要技术,作为一种强大的机器学习GS方法,堆叠集成学习(stacking ensemble learning, SEL)有效地融合了不同模型(基学习器)的优势,以精确…

台球厅收银台押金原路退回系统押金预授权—东方仙盟 - 详解

台球厅收银台押金原路退回系统押金预授权—东方仙盟 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

数论专题小记

我的数论以前一只因为对数字的恐惧而搁置,准备这几天补回来 /kk。 狄利克雷卷积&莫比乌斯反演我们定义 狄利克雷卷积 这种运算是把两个数轮函数 \(f,g\) 卷成另一个函数 \(t\),其中 \(t\) 满足: \(\ \ \ \ \ \ …

ReactUse 与ahook对比 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

机械臂和相机的9点标定原理

9点标定到底怎么工作的? 这个问题困惑了我很久,虽然想海康VisionMaster 和Halcon 这种软件都提供了很好用的工件,但是最好懂原理,这样才不仅能做项目,还能做好项目。 最近好好研究了一下,感觉是搞清楚了,就记录…

遗传改良中的核心技术:交配设计

分享一则报告,系统总结了植物育种中常用的交配设计(Mating Designs)方法。定义与目的定义:交配设计是指为产生后代而在植物群体间有计划的杂交方案。目的:理解性状或行为的遗传控制机制;为作物品种开发提供基础群…

语言是火,视觉是光:论两种智能信号的宿命与人机交互的未来 - 教程

语言是火,视觉是光:论两种智能信号的宿命与人机交互的未来 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…