广度优先搜索Breadth-First-Search

news2025/1/11 10:21:25

 

目录

 1.问题

2.算法

3.代码

4.参考文献


 1.问题

        广度优先搜索,稍微学过算法的人都知道,网上也一大堆资料,这里就不做过多介绍了。直接看问题,还是从下图招到一条从城市Arad到Bucharest的路径。

 该图是连通图,所以必然存在一条路径,只是如何找到最短路径。

2.算法

还是贴一个算法的伪代码吧:

 1  procedure BFS(G, root) is
 2      let Q be a queue
 3      label root as explored
 4      Q.enqueue(root)
 5      while Q is not empty do
 6          v := Q.dequeue()
 7          if v is the goal then
 8              return v
 9          for all edges from v to w in G.adjacentEdges(v) do
10              if w is not labeled as explored then
11                  label w as explored
12                  w.parent := v
13                  Q.enqueue(w)

 算法实现也可以用递归版本,不过用递归在树的深度比较大时不如使用队列高效。

广度优先搜索总是能找到一个动作最少的解,因为当他生成深度为d的节点时,说明已经生成了升读为d-1的所有节点,如果其中一个节点是解,它应该已经被找到了,这对于所有动作都具有相同代价的问题,它是代价最优的,但对于不具有该特性的问题,则不一定是最优的。这两种情况都是完备的。想象我们在搜索一棵均衡树,每个节点均有b个子节点,则当遍历了d层之后,生成的节点总数为:

1+b+b^2+b^3+...+b^d=O(b^d))

所有节点都存储在内存中,所以时间和空间复杂度都是 O(b^d)  ,这样的指数级上界是可怕的,举个例子:假设 b=10,d=10  ,假设计算机可以每秒处理100w个节点,每个节点需要1Kb存储空间,那么该算法可以再3小时完成计算,但是需要10TB的内存。因此,对于广度优先搜索,内存是一个比执行时间更严重的问题。    

3.代码

        广度优先搜索和最佳优先搜索很像,我在最佳优先搜索中也提到过,这里不在贴重复的代码了,直接贴广度优先搜索:

# -*- coding: utf-8 -*-
"""
Created on Thu Sep  5 18:14:14 2024

@author: Paul
"""

from collections import deque
from citydata import dist_mat,Nodes

def BFS(mat,start,end):
    q=deque()   #使用标准库中的优先队列
    visited=[start]
    q.append(start)
    while q:
        curr=q.popleft()
        print(curr)
        for city,_ in mat[Nodes.index(curr)]:    # _代表这里不使用距离信息
            child=Nodes[city]
            if child==end:
                return True
            if child not in visited:
                q.append(child)
                visited.append(child)
    return False

从上面的代码可以看出,我这里没有使用深度信息,而是直接安层次顺序访问,也就是前面提到的,每个城市到另一个城市的代价一样,最后可以得到代价最低的访问层次路径:

Node('Arad')
Node('Zerind')
Node('Sibiu')
Node('Timisoara')
Node('Oradea')
Node('Fagaras')

也就是:

其中Siubiu在第一层就访问过,所以第三层就不会再访问一次(因此打了一个×)

我们在第三层就访问到了目的地,也就是至少需要三条路径才能访问到。

问题来了,我们这次还是没确定从起点到目标点的最短路径,因为没有用到距离信息,别急,下一节DijkStra算法来帮我们彻底解决这个问题。

4.参考文献

 1.       《人工智能:一种现代的方法(第4版)》第三章:无信息搜索策略

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

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

相关文章

顺序表的定义

一.概述: 二.顺序表: 1.概念: 2.顺序表的实现: 1)静态分配: 比如数组,数组大小一旦确定,就不可以再被改变。 ElemType代表数据类型,比如整型,浮点型等。 例如&#x…

工厂数字化转型利器:.NET Core 与 ARMxy 嵌入式边缘计算网关

在当今数字化时代,工厂数字化转型已成为提高生产效率、降低成本、提升竞争力的关键。.NET Core与 ARMxy 嵌入式边缘计算网关的结合为工厂数字化转型提供了强大的技术支持。 一、.NET Core 的优势 跨平台性:.NET Core 可以在 Windows、Linux 和 macOS 等…

Python 从入门到实战10(流程控制-选择语句)

我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了python 中集合的定义及相关操作。今天…

初识string(一)and内存管理

对类和对象的补充:缺省参数在函数定义中从右向左依次赋值,如果从右向左有一个参数没有赋值缺省参数,则左边的变量就不能在赋缺省参数,类中的变量可以赋缺省参数并且没有限制。 在类定义中我们总是看到函数后加const。这其实是调用…

算法备案究竟难在哪里?

算法备案究竟难在哪里? 在当今数字化社会中,算法备案已成为人工智能技术应用中的一个关键环节。然而,对于初学者和企业来说,这一过程充满了挑战和复杂性。本文将深入探讨算法备案的难度和应对策略。 算法备案的挑战 首先&#xff…

标准库标头 <filesystem> (C++17)学习

此头文件是文件系统支持库的一部分。本篇介绍filesystem命名空间的一些函数。 函数 在命名空间 std::filesystem 定义 absolute (C17) 组成一个绝对路径 (函数) canonicalweakly_canonical (C17) 组成一个规范路径 (函数) relativeproximate (C17) 组成一个相对路径 (函数) c…

提高开发效率的实用工具库VueUse

VueUse中文网:https://vueuse.nodejs.cn/ 使用方法 安装依赖包 npm i vueuse/core单页面使用(useThrottleFn举例) import { useThrottleFn } from "vueuse/core"; // 表单提交 const handleSubmit useThrottleFn(() > {// 具…

Android中Fragment的最佳实践—简易版的新闻应用

文章目录 Android中Fragment的最佳实践—简易版的新闻应用app/build.gradle当中添加依赖库新建新闻实体类News新建布局文件news_content_frag.xml新建NewsContentFragment类单页模式需新建NewsContentActivity新建news_title_frag.xml新建news_item.xml新建NewsTitleFragment修…

el-date-picker年份选择默认值为当前年,并且将获取时间转为年月日格式

<el-date-pickervalue-format"yyyy"v-model"leftQuery.year":disabled"timeArr && timeArr.length ! 0 ? true : false"type"year"placeholder"选择年"changechangeYear:picker-options"pickerOptions&quo…

Python GUI入门详解-学习篇

一、简介 GUI就是图形用户界面的意思&#xff0c;在Python中使用PyQt可以快速搭建自己的应用&#xff0c;自己的程序看上去就会更加高大上。 有时候使用 python 做自动化运维操作&#xff0c;开发一个简单的应用程序非常方便。程序写好&#xff0c;每次都要通过命令行运行 pyt…

第4章-03-用WebDriver获取页面Cookie

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…

IDEA提交git代码前执行checkstyle校验

为了统一团队人员代码风格&#xff0c;在代码协同时经常会引入对应的checkstyle校验功能&#xff0c;配置好代码style后一般在IDEA执行mvn validate功能即可&#xff0c;如下图所示&#xff1a; 但是有时忘记执行怎么办&#xff0c;IDEA在代码提交前也有对应的配置&#xff0c;…

【Java并发编程 | JUC】线程

Java 线程 项目配置 pom.xml <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></dependency><dependency><groupId>ch.qos.…

orcle 数据库 day0903

ok奥家人们&#xff0c;今天继续学习orcle数据库 一. 数据完整性 向某张表插入数据、更新、删除数据之前会对数据做校验&#xff0c;目 的就是为了确保数据的正确性、一致性、最大限度 减少重复 的数据、避免脏数据&#xff0c;这就是数据完整性。以下的数据就是脏 数据&a…

表情,符号,数字,字母,加密和解密源码

表情&#xff0c;符号&#xff0c;数字&#xff0c;字母&#xff0c;加密和解密源码 可以将表情&#xff0c;动物&#xff0c;水果&#xff0c;表情&#xff0c;手势&#xff0c;猫语&#xff0c;兽语&#xff0c;狗语&#xff0c;爱语&#xff0c;符号&#xff0c;数字&#x…

Mac M1安装Hive

一、下载解压Hive 1.官网地址 https://dlcdn.apache.org/hive/ 2.选择对应版本进行下载&#xff0c;这里我以3.1.3为例&#xff1b; 3.下载好后&#xff0c;进行解压&#xff0c;并重命名为hive-3.1.3&#xff0c;放到资源库目录下&#xff1b; 二、配置系统环境 1.打开~/…

WebGL系列教程一(开篇)

目录 1 前言2 推荐的书籍和网站3 WebGL简介4 本教程包含的主要内容预览4.1 顶点着色器4.2 片元着色器4.3 绘制点线面4.4 绘制三角形和四边形4.5 缓冲区4.6 旋转、平移、缩放4.7 动画4.8 颜色和纹理4.9 GLSL语法4.10 模型变换、视图变换、投影变换4.11 光照4.12 层次模型4.13 鼠…

【MySQL】MySQL常用的数据类型——表的操作

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解关于MySQL常用数据类型&#xff0c;表的简单使用&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;http://t.csdnimg.cn/wwaqe &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondl…

传统CV算法——特征匹配算法

Brute-Force蛮力匹配 Brute-Force蛮力匹配是一种简单直接的模式识别方法&#xff0c;经常用于计算机视觉和数字图像处理领域中的特征匹配。该方法通过逐一比较目标图像中的所有特征点与源图像中的特征点来寻找最佳匹配。这种方法的主要步骤包括&#xff1a; 特征提取&#xff…

JAVA开源项目 图书个性化推荐系统 计算机毕业设计

本文项目编号 T 015 &#xff0c;文末自助获取源码 \color{red}{T015&#xff0c;文末自助获取源码} T015&#xff0c;文末自助获取源码 目录 一、系统介绍1.1 业务分析1.2 用例设计1.3 时序设计 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究…