Python实战开发及案例分析(20)—— 宽度优先

        宽度优先搜索(Breadth-First Search, BFS)是一种遍历图或树的算法。它从根节点开始,探索所有邻近节点,然后再按顺序访问每个邻近节点的邻居,直到所有节点都被访问为止。在图中,为了避免访问同一个节点多次,通常使用一个队列来记录已经访问过但其邻居节点还未完全探索的节点。

BFS的基本步骤:

  1. 初始化:将起始节点放入队列中。
  2. 循环执行以下操作,直到队列为空
    • 从队列中取出一个节点。
    • 访问该节点的所有未访问的邻近节点,将它们加入队列中,并标记为已访问。

Python实现

        下面是使用Python实现BFS的一个示例,我们将使用一个简单的无向图来演示。

图的定义

        我们将使用字典来表示图,其中键是节点,值是与键节点直接相连的节点列表。

graph = {'A' : ['B','C'],'B' : ['D', 'E'],'C' : ['F'],'D' : [],'E' : ['F'],'F' : []
}
BFS 实现

        我们将定义一个函数来执行BFS,并打印出访问的节点顺序。

from collections import dequedef bfs(graph, start):visited = set()  # 创建一个集合,用于存储已访问的节点queue = deque([start])  # 创建一个队列,初始化为包含起始节点的队列while queue:vertex = queue.popleft()  # 从队列中取出一个节点if vertex not in visited:visited.add(vertex)  # 标记为已访问print(vertex, end=" ")  # 打印节点# 将所有未访问的邻接节点添加到队列中queue.extend([node for node in graph[vertex] if node not in visited])# 调用函数
bfs(graph, 'A')

        输出应该是:A B C D E F,这表示了访问的顺序。

案例分析:社交网络

        假设我们有一个社交网络,我们需要找出从一个人到另一个人通过朋友的最短路径。在这个场景中,BFS非常适合用来解决这个问题,因为它总是优先扩展距离根节点最近的节点。

社交网络图
social_graph = {'Alice' : ['Bob', 'Cindy', 'Joe'],'Bob' : ['Alice', 'Eve'],'Cindy' : ['Alice', 'Eve'],'Joe' : ['Alice'],'Eve' : ['Bob', 'Cindy']
}
找出最短路径

        我们可以修改bfs函数来跟踪节点的父节点,以便可以重建最短路径。

def bfs_shortest_path(graph, start, goal):visited = set()queue = deque([(start, [start])])  # 队列中存储节点及路径while queue:(vertex, path) = queue.popleft()for next in set(graph[vertex]) - visited:if next == goal:return path + [next]else:visited.add(next)queue.append((next, path + [next]))# 调用函数查找最短路径
path = bfs_shortest_path(social_graph, 'Alice', 'Eve')
print("Shortest path:", path)

        输出将是:Shortest path: ['Alice', 'Eve'],展示了从Alice到Eve的最短路径。

        通过这种方式,宽度优先搜索不仅可以帮助我们遍历图或树,还能解决诸如最短路径问题等更复杂的问题,这在各种网络分析和图算法中非常有用。

        继续探索宽度优先搜索(BFS)的应用,我们可以将其扩展到更多复杂和实用的场景中,如组件连接性、解决迷宫问题、以及在多层网络结构中的应用。这些进阶使用案例进一步展示了BFS的多样性和功能强大的侧面。

应用场景扩展

1. 组件连接性检查

        在图论中,BFS可用于检查图中是否存在从一个节点到另一个节点的路径,以及图是否连通(在无向图中)。这在网络设计和分析中尤为重要。

实例:检查图中的连通性        
def is_connected(graph, start_node):visited = set()queue = deque([start_node])while queue:node = queue.popleft()if node not in visited:visited.add(node)queue.extend([neighbor for neighbor in graph[node] if neighbor not in visited])# 如果访问的节点数等于图中的节点数,则图是连通的return len(visited) == len(graph)# 测试连通性
print("Is the graph connected?", is_connected(graph, 'A'))

        这段代码能够判断从给定起点出发的图是否完全连通。

2. 解决迷宫问题

        BFS是解决迷宫问题的经典方法,尤其适合找到从起点到终点的最短路径。

实例:迷宫的最短路径
def solve_maze(maze, start, end):rows, cols = len(maze), len(maze[0])directions = [(1, 0), (0, 1), (-1, 0), (0, -1)]  # 下,右,上,左queue = deque([(start, [start])])while queue:(x, y), path = queue.popleft()for dx, dy in directions:nx, ny = x + dx, y + dyif 0 <= nx < rows and 0 <= ny < cols and maze[nx][ny] == 0:if (nx, ny) == end:return path + [(nx, ny)]maze[nx][ny] = 2  # 标记为已访问queue.append(((nx, ny), path + [(nx, ny)]))return None# 假设迷宫是一个二维列表,0表示通路,1表示墙
maze = [[0, 1, 0, 0, 0],[0, 1, 0, 1, 0],[0, 0, 0, 0, 0],[0, 1, 1, 0, 0],[0, 0, 0, 0, 0]]
start_pos = (0, 0)
end_pos = (4, 4)# 解决迷宫
path = solve_maze(maze, start_pos, end_pos)
print("Path to solve the maze:", path)
3. 在多层网络结构中的应用

        BFS可以应用于多层网络结构,如社交网络分析,其中层与层之间可能存在不同类型的关系。

实例:多层社交网络的影响力分析
def analyze_influence(graph, start_layer, target_layer):layers = {start_layer}queue = deque([start_layer])while queue:current_layer = queue.popleft()# 分析当前层对目标层的影响# 这可能涉及计算从当前层到目标层的信息流动等# 添加代码逻辑来处理层间的关系和影响力计算# ...for neighbor in graph[current_layer]:if neighbor not in layers:layers.add(neighbor)queue.append(neighbor)# 返回分析结果,如影响力得分等return calculate_influence_score(layers, target_layer)# 调用函数进行分析
print("Influence score:", analyze_influence(social_graph, 'Layer1', 'Layer3'))

结论

        BFS不仅适用于简单的图遍历问题,它的应用范围广泛,可以解决复杂的实际问题,如网络分析、路径规划、迷宫解决等。通过这些示例,我们可以看到,将BFS应用于不同的场景需要对问题和数据结构有深入的理解,并根据具体需求调整和优化算法。通过实际应用中的创新使用,BFS仍然是解决许多类型问题的强大工具。

        继续探讨宽度优先搜索(BFS)在各种高级和特定应用中的实用性,我们可以考虑如何将BFS应用于更多复杂和多样化的问题解决方案。这包括网络可靠性分析、游戏开发中的AI策略,以及其他领域的实时决策支持。

网络可靠性分析

        在网络科学和通信领域,BFS可以用来分析网络的结构稳健性和可靠性,比如确定网络中的关键节点和关键连接路径。

示例:识别网络中的关键路径和节点
def find_critical_paths(graph, start_node):# 访问所有节点并记录路径visited = set()queue = deque([(start_node, [start_node])])critical_paths = []while queue:current, path = queue.popleft()if current not in visited:visited.add(current)extensions = graph[current]for node in extensions:if node not in visited:new_path = path + [node]queue.append((node, new_path))if len(extensions) == 1:  # 单一连接节点可能是关键路径的一部分critical_paths.append(new_path)return critical_paths# 假设有图数据
print("Critical Paths:", find_critical_paths(graph, 'StartNode'))

        此函数通过BFS寻找所有从起点出发的路径,并特别标记那些可能是关键通路的路径(例如,单一连接的节点路径),这在网络设计和故障分析中非常有用。

游戏开发中的AI策略

        在游戏开发中,BFS可用于实现游戏中的非玩家角色(NPC)的智能行为,如寻路、追踪玩家或策略决策等。

示例:游戏中的NPC寻路
def npc_pathfinding(game_map, start, target):queue = deque([start])visited = set([start])parent = {start: None}while queue:current = queue.popleft()if current == target:breakfor neighbor in get_neighbors(game_map, current):if neighbor not in visited:visited.add(neighbor)parent[neighbor] = currentqueue.append(neighbor)# 回溯路径path = []step = targetwhile step:path.append(step)step = parent.get(step)return path[::-1]  # 反转路径以从起点开始# 使用示例
print("NPC Path:", npc_pathfinding(game_map, 'NPC_Start', 'Player_Position'))

        这个示例演示了如何使用BFS为游戏中的NPC计算从起点到玩家位置的最短路径。

实时决策支持

        在动态环境中,如紧急响应或实时系统监控,BFS可以用来快速识别和响应变化。

示例:实时事件响应系统
def real_time_response(event_graph, start_event):queue = deque([start_event])responses = []while queue:event = queue.popleft()if is_critical_event(event):response = handle_event(event)responses.append(response)for next_event in get_next_events(event_graph, event):queue.append(next_event)return responses# 使用示例
print("Event Responses:", real_time_response(system_events, 'Initial_Event'))

        在这个示例中,BFS用于处理从初始事件开始的事件流,快速决定和执行响应措施。

结论

        宽度优先搜索是一种非常灵活和强大的工具,适用于多种场景,从网络分析到游戏开发,再到实时决策支持。通过结合其他技术和数据结构,BFS的实用性和效率可以得到进一步的提升,解决更广泛的问题。在实际应用中,理解其原理并根据具体需求进行适当的定制和优化是关键。

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

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

相关文章

建筑乙级资质延期中的政策变化与应对策略

在建筑乙级资质延期过程中&#xff0c;政策的变化可能会对企业的运营和策略产生重大影响。为了应对这些变化&#xff0c;企业需要密切关注政策动态&#xff0c;灵活调整自身的经营策略。以下是一些可能的政策变化及相应的应对策略&#xff1a; 一、政策变化 资质延期条件调整&a…

福派斯鲜肉狗粮大揭秘,狗狗吃了都说好!

狗粮哪个牌子好&#xff1f;我强烈推荐福派斯鲜肉狗粮&#xff01;在众多狗粮品牌中&#xff0c;福派斯以其高品质、营养均衡以及独特的产品特点&#xff0c;受到了广大宠物主人的一致好评。 (1) 福派斯鲜肉狗粮的配方表透露出其对于原料选择的严谨和用心。高达75%的鲜肉含量&a…

安卓手机APP开发__支持不同的像素深度

安卓手机APP开发__支持不同的像素深度 目录 概述 使用对深度独立的像素 把DP单位转换成像素单位 概述 安卓设备不仅有不同的大小,还有不同的像素深度.一个设备可能在每一英寸上有 160个像素,另一个设备在相同的尺度上有480个像素.如果你不考虑这些不同, 系统可能会缩放你的…

linux不小心将/etc/passwd用户文件清空或删除解决方法

大概思路&#xff1a;进入单用户模式将passwd-引子程序复制为删除的passwd用户文件&#xff0c;关闭selinux 此系统为&#xff1a;centos 7 1.在GRUB引导的时候按e进入编辑模式&#xff0c;linux16那一行的ro 修改为rw rd.break ‘ ’ 2.ctrlx执行 3.进入单用户模式后修改根…

springboot学习整理

视频&#xff1a;基础篇-01_springboot概述_哔哩哔哩_bilibili 介绍 spring boot 是spring提供的一个子项目&#xff0c;用于快速构建spring应用程序 spring构建&#xff1a; 1 导入依赖繁琐 &#xff1b; 2 项目配置繁琐 spring Framework: 核心 spring Boot :快速构建spring…

AI学习指南概率论篇-信息论

AI学习指南概率论篇-信息论 信息论是信息科学中的一个重要分支&#xff0c;主要研究信息的量、质和流通规律等问题。在人工智能领域中&#xff0c;信息论被广泛应用于数据压缩、数据传输和模型优化等方面。本文将从信息论的概述、AI中的使用场景、定义和意义以及相关公式讲解这…

win11右键菜单恢复win10风格

有很多朋友升级到win11系统之后不是特别喜欢右键菜单&#xff0c;因为经常需要多点击一次显示更多选项&#xff0c;很不舒服。大家就想知道如何修改回原来win10的右键菜单&#xff0c;今天给大家介绍Win11右键菜单怎么修改为以前的样子&#xff0c;仅需执行2条明路&#xff0c;…

秒杀系统之设计方向

1 秒杀存在的问题 对于一个日常平稳的业务系统&#xff0c;如果直接开通秒杀功能的话&#xff0c;往往会出现很多问题—— 2 设计方向的思考 秒杀本质是要求一个瞬时高发下的承压系统&#xff0c;这也是其区别于其他业务的核心场景。对日常系统秒杀产生的问题逐一进行拆解分…

PostgreSQL自带的命令行工具24- postgres

PostgreSQL自带的命令行工具24- postgres postgres 命令主要是 PostgreSQL 数据库服务器的主要执行文件。当你启动 PostgreSQL 服务时&#xff0c;实际上就是在后台运行 postgres 程序。这个程序负责处理用户请求、执行 SQL 命令、管理数据库文件等核心数据库管理任务。通常&a…

深入理解tengine的sysguard模块

目录 1. 引言2. 开启sysguard模块2.1 编译2.2 配置3. 源码分析3.1 配置参数分析3.2 模块的初始化3.3 ngx_http_sysguard_handler函数3.4 各项负载指标的获取3.4.1 load系统负载的获取3.4.2 cpu使用率的获取3.4.3 内存使用情况的获取3.3.5 请求平均响应时间的获取1. 引言 Tengin…

深入浅出:ConcurrentLinkedQueue源码分析与实战

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

windows驱动开发-inf文件(三)

持续讲解剩下inf节&#xff0c;剩下的几乎都是INF DDInstall 相关的部分&#xff0c;这部分其实非常多&#xff0c;不过我们只讲解最主要的部分&#xff0c;在inf文件说明的最后一篇文档中我们会说明原因。 INF-DefaultInstall 如果要生成 通用驱动程序包&#xff0c;则仅当具…

CentOS使用Docker搭建Nacos结合内网穿透实现无公网IP远程登录本地管理平台

文章目录 1. Docker 运行Nacos2. 本地访问Nacos3. Linux安装Cpolar4. 配置Nacos UI界面公网地址5. 远程访问 Nacos UI界面6. 固定Nacos UI界面公网地址7. 固定地址访问Nacos Nacos是阿里开放的一款中间件,也是一款服务注册中心&#xff0c;它主要提供三种功能&#xff1a;持久化…

网站服务器备案及域名购买配置教程

一、阿里云服务备案准备工作 1.什么是备案? 备案是指向相关部门提交网站信息,以便监管和管理互联网信息服务,未经备案的网站可能面临罚款甚至被关闭的风险。备案主要看您的网站或App等互联网信息服务解析到的服务器是否在中国内地(大陆),如果服务器在中国内地(大陆),…

探索Python中的文件操作:如何列出一个目录下的所有文件?

在Python中&#xff0c;处理文件和目录是一项常见的任务。无论是在数据科学项目中读取数据集&#xff0c;还是在Web开发中管理用户上传的文件&#xff0c;我们都需要知道如何列出一个目录下的所有文件。本文将通过通俗易懂的语言&#xff0c;为初学者详细讲解如何在Python中实现…

Tkinter组件:Text-显示和处理多行文本

Tkinter组件&#xff1a;Text Text&#xff08;文本&#xff09;组件用于显示和处理多行文本。在 Tkinter 的所有组件中&#xff0c;Text 组件显得异常强大和灵活&#xff0c;适用于多种任务。虽然该组件的主要目的是显示多行文本&#xff0c;但它常常也被用于作为简单的文本编…

kali更新镜像源

1. 什么是镜像源 镜像源一种数据存储和分发技术&#xff0c;通常指的是一个服务器或网站&#xff0c;它存储了另一个服务器或网站上的某些或全部内容的副本。 2. kali更新镜像源 1. 编辑镜像源文件 vi /etc/apt/sources.list 2. 将原来的镜像源用#号注释掉 3. 选择镜像源地址…

LLM应用-文档解析 AI大模型总结分析文档

1&#xff09;https://notegpt.io/pdf-summary 支持总结&#xff0c;思维导图、对话 2&#xff09;chatdoc https://chatdoc.com/ 3&#xff09;chatpdf https://www.chatpdf.com/ https://www.chatpdfs.cn/ 4&#xff09;kimi https://kimi.moonshot.cn/

HTML静态网页成品作业(HTML+CSS+JS)——华为商城网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现首页图片切换轮播效果&#xff0c;共有1个页面…

Cweek1

C语言学习 一.初识C语言 1.如何写C代码 ①创建工程 ②添加源文件&#xff1a;c文件&#xff1a;源文件&#xff0c;h文件&#xff1a;头文件 代码实例&#xff1a; main函数是程序的入口&#xff0c;有且仅有一个 在C语言中&#xff0c;#include <stdio.h> 是一个预…