首页 > 编程语言 >二十个基于 Python 的 NetworkX 图论算法库入门应用实例

二十个基于 Python 的 NetworkX 图论算法库入门应用实例

时间:2024-07-14 09:30:42浏览次数:13  
标签:图论 Python graph queue start 算法 NetworkX visited 节点

关注博主 - 领取粉丝专享资源

前言

大家好,最近我在美丽的重庆度过了一段美好的学习时光。重庆以其独特的山城地貌和美食闻名,而在火锅和享受美食之余,这里的项目学习激发了我对图论的兴趣。图论是一门既古老又新兴的学科,它在计算机科学、网络分析、社会网络、物流优化等领域有着广泛的应用。而 Python 的 NetworkX 库,则是进行图论算法研究和应用的利器。今天,我将带大家一起探讨如何利用 NetworkX 库进行图论算法的入门学习,并通过丰富的实际应用实例,帮助大家更好地理解和掌握这门技术。

如果你对图论感兴趣,或者在工作中需要处理网络数据,那么这篇文章绝对不容错过。记得收藏本文,并关注我的博客,让我们一起探索图论的奇妙世界!

图论简介

图论是一门研究图(Graph)的数学分支,图是由顶点(Vertex)和边(Edge)组成的结构。顶点可以表示各种实体,如人、城市、计算机等,边则表示这些实体之间的关系或连接。

图论的研究内容包括但不限于:

  • 路径问题:寻找从一个顶点到另一个顶点的路径。
  • 最短路径问题:寻找从一个顶点到另一个顶点的最短路径。
  • 最大流问题:寻找从源点到汇点的最大流量。
  • 图的连通性:判断图是否连通,即是否存在从任一顶点到任一其他顶点的路径。
  • 图的遍历:如深度优先搜索(DFS)和广度优先搜索(BFS)。

NetworkX 库简介

NetworkX 是一个用于创建、操作和研究图和网络的 Python 库。它提供了丰富的图论算法,可以帮助我们轻松地进行图的操作和分析。NetworkX 支持多种类型的图,如无向图、有向图、多重图等,并提供了方便的图可视化功能。

安装和配置

首先,我们需要安装 NetworkX 库,可以通过以下命令安装:

pip install networkx

安装完成后,我们可以通过以下代码导入 NetworkX 库并创建一个简单的图:

import networkx as nx
import matplotlib.pyplot as plt

# 创建一个空的无向图
G = nx.Graph()

# 添加节点
G.add_node(1)
G.add_node(2)
G.add_node(3)

# 添加边
G.add_edge(1, 2)
G.add_edge(2, 3)

# 绘制图
nx.draw(G, with_labels=True)
plt.show()

以上代码创建了一个简单的无向图,并绘制了该图。

常见的算法应用举例

接下来,我们将介绍 20 个常见的图论算法应用,并提供相应的完整代码示例。每个示例都将包含详细的代码注释和算法介绍,帮助大家更好地理解和应用这些算法。

1. 图的遍历 - 深度优先搜索(DFS)

深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历节点,并在到达叶子节点后回溯。

算法介绍

DFS 算法的基本思想是尽可能深入图的分支。以下是 DFS 算法的伪代码:

DFS(G, v):
    标记 v 为已访问
    对于每个相邻节点 w:
        如果 w 未被访问:
            DFS(G, w)
代码示例
import networkx as nx

def dfs(graph, start):
    visited, stack = set(), [start]
    while stack:
        vertex = stack.pop()
        if vertex not in visited:
            visited.add(vertex)
            stack.extend(set(graph[vertex]) - visited)
    return visited

# 创建一个示例图
G = nx.Graph()
edges = [(1, 2), (1, 3), (2, 4), (3, 4), (4, 5)]
G.add_edges_from(edges)

# 执行深度优先搜索
visited_nodes = dfs(G, 1)
print("深度优先搜索访问的节点:", visited_nodes)
代码详解
  • dfs(graph, start):定义一个深度优先搜索函数,接受图和起始节点作为参数。
  • visited, stack = set(), [start]:初始化一个已访问节点集合和一个堆栈,将起始节点加入堆栈。
  • while stack:循环遍历堆栈,直到堆栈为空。
  • vertex = stack.pop():弹出堆栈顶端的节点。
  • if vertex not in visited:如果节点未被访问,则进行以下操作:
    • visited.add(vertex):将节点标记为已访问。
    • stack.extend(set(graph[vertex]) - visited):将未访问的相邻节点加入堆栈。

2. 图的遍历 - 广度优先搜索(BFS)

广度优先搜索(BFS)是一种用于遍历或搜索树或图的算法。从起始节点开始,先访问其所有邻节点,然后再依次访问这些邻节点的邻节点,以此类推。

算法介绍

BFS 算法的基本思想是按层次遍历节点。以下是 BFS 算法的伪代码:

BFS(G, v):
    创建一个队列 Q
    标记 v 为已访问并将 v 入队 Q
    while Q 非空:
        u = Q 出队
        对于每个相邻节点 w:
            如果 w 未被访问:
                标记 w 为已访问并将 w 入队 Q
代码示例
import networkx as nx
from collections import deque

def bfs(graph, start):
    visited, queue = set(), deque([start])
    visited.add(start)
    while queue:
        vertex = queue.popleft()
        for neighbor in graph[vertex]:
            if neighbor not in visited:
                visited.add(neighbor)
                queue.append(neighbor)
    return visited

# 创建一个示例图
G = nx.Graph()
edges = [(1, 2), (1, 3), (2, 4), (3, 4), (4, 5)]
G.add_edges_from(edges)

# 执行广度优先搜索
visited_nodes = bfs(G, 1)
print("广度优先搜索访问的节点:", visited_nodes)
代码详解
  • bfs(graph, start):定义一个广度优先搜索函数,接受图和起始节点作为参数。
  • visited, queue = set(), deque([start]):初始化一个已访问节点集合和一个队列,将起始节点加入队列。
  • while queue:循环遍历队列,直到队列为空。
  • vertex = queue.popleft():从队列头部弹出节点。
  • for neighbor in graph[vertex]:遍历当前节点的所有相邻节点。
  • if neighbor not in visited:如果相邻节点未被访问,则进行以下操作:
    • visited.add(neighbor):将相邻节点标记为已访问。
    • queue.append(neighbor):将相邻节点加入队列。

3. 最短路径算法 - Dijkstra 算法

Dijkstra 算法用于找到图中从一个节点到其他节点的最短路径。它假设图中的边权重为非负值。

算法介绍

Dijkstra 算法的基本思想是逐步扩展已知最短路径的节点集合。以下是 Dijkstra 算法的伪代码:

Dijkstra(G, s):
    初始化
    dist[s] = 0
    对于每个顶点 v:
        如果 v ≠ s:
            dist[v] = ∞
    while 未处理的顶点集合非空:
        u = 未处理顶点中具有最小 dist[u] 值的顶点
        标记 u 为已处理
        对于每个相邻节点 v:
            如果 v 未被处理:
                通过 u 的路径比 dist[v] 短:
                    dist[v] = dist[u] + weight(u, v)
                    前驱[v] = u
代码示例
import networkx as nx
import heapq

def dijkstra(graph, start):
    # 初始化距离字典和优先队列
    distances = {
   node: float('inf') for node in graph.nodes}
    distances[start] = 0
    priority_queue = [(0, start)]
    
    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)
        
        if current_distance > distances[current_node]:
            continue
        
        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight['weight']
            
            if distance < distances[neighbor]:
                distances[neighbor]

 = distance
                heapq.heappush(priority_queue, (distance, neighbor))
    
    return distances

# 创建一个示例图
G = nx.Graph()
edges = [(1, 2, 1), (1, 3, 4), (2, 3, 2), (2, 4, 7), (3, 4, 3)]
G.add_weighted_edges_from(edges)

# 执行 Dijkstra 算法
shortest_paths = dijkstra(G, 1)
print("Dijkstra 算法求得的最短路径:", shortest_paths)
代码详解
  • dijkstra(graph, start):定义一个 Dijkstra 算法函数,接受图和起始节点作为参数。
  • distances = {node: float('inf') for node in graph.nodes}:初始化每个节点到起始节点的距离为无穷大。
  • distances[start] = 0:设置起始节点到自身的距离为 0。
  • priority_queue = [(0, start)]:初始化优先队列,将起始节点加入队列。
  • while priority_queue:循环遍历优先队列,直到队列为空。
  • current_distance, current_node = heapq.heappop(priority_queue):从优先队列中弹出距离最小的节点。
  • for neighbor, weight in graph[current_node].items():遍历当前节点的所有相邻节点。
  • distance = current_distance + weight['weight']:计算从当前节点到相邻节点的距离。
  • if distance < distances[neighbor]:如果通过当前节点的路径比已知最短路径更短,则更新最短路径。

4. 最短路径算法 - Bellman-Ford 算法

Bellman-Ford 算法用于找到图中从一个节点到其他节点的最短路径。它允许图中存在负权重边,但不允许负权重回路。

算法介绍

Bellman-Ford 算法的基本思想是逐步松弛图中的边。以下是 Bellman-Ford 算法的伪代码:

Bellman-Ford(G, s):
    初始化
    dist[s] = 0
    对于每个顶点 v:
        如果 v ≠ s:
            dist[v] = ∞
    对于每个顶点 v:
        对于每条边 (u, v) ∈ G:
            如果 dist[u] + weight(u, v) < dist[v]:
                dist[v] = dist[u] + weight(u, v)
    检测负权重回路
    对于每条边 (u, v) ∈ G:
        如果 dist[u] + weight(u, v) < dist[v]:
            报告负权重回路
代码示例
import networkx as nx

def bellman_ford(graph, start):
    # 初始化距离字典
    distances = {
   node: float('inf') for node in graph.nodes}
    distances[start] = 0
    
    # 松弛边
    for _ in range(len(graph.nodes) - 1):
        

标签:图论,Python,graph,queue,start,算法,NetworkX,visited,节点
From: https://blog.csdn.net/oLawrencedon/article/details/140264770

相关文章

  • python中的os模块和shutil模块
    目录os1.获取当前脚本绝对路径2.获得工作路径;3.该路径文件和目录4.walk,查看目录下所有的文件(含子孙文件)5.创建文件夹6.os.makedirs(path)7.路径拼接8.获取当前文件的上级目录9.判断路径是否存在10.是否是文件夹11.进程管理12.删除空文件夹13.删除文件14.查看......
  • 改进的多目标差分进化算法在电力系统环境经济调度中的应用(Python代码实现)【电气期刊论
     目录 1电力系统环境经济调度数学模型电力系统环境经济调度问题概述多目标差分进化算法的应用应用研究的意义2  改进的多目标差分进化算法3Python代码实现3.1结果3.2Python代码 4完整Python代码、数据下载   改进的多目标差分进化算法不仅可以应用......
  • 深度优先搜索+算法设计+python
    一、问题描述小明想知道哪个岛是最大的岛屿,请你用深度优先遍历算法来帮助他。如图所示,为了方便计算,我们使用一个二维数组来表示一片海域,用0表示水面,用1表示陆地,我们的任务是找出其中最大的岛屿。注意,岛屿是指上下左右四个方向相连接的陆地区域。二、问题求解deflargest_is......
  • 模型部署 - TensorRT - C++版本与Python版本应如何选择
    从性能角度来看,TensorRTC++版本和Python版本之间确实存在一些差异:C++版本性能更优:TensorRTC++版本使用了更底层的API,可以更好地利用硬件特性,进行更深层的优化。C++版本在内存管理、CPU-GPU数据传输等方面更加高效,这些都可以带来更好的推理性能。Python版本更易......
  • python的列表生成式
    文章目录python的列表生成式1.创建列表2.筛选偶数3.生成99乘法表4.列表推导式中的嵌套循环python的列表生成式Python列表生成式(ListComprehensions)是一种简洁且易于阅读的语法,用于从其他可迭代对象创建列表。它们提供了一种非常Pythonic的方式来创建列表,尤其是......
  • Python学习笔记36:进阶篇(二十五)pygame的使用之事件监听控制切歌和暂停,继续播放
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • 对红酒品质进行数据分析(python)
    http://t.csdnimg.cn/UWg2S数据来源于这篇博客,直接下载好csv文件。这篇内容均在VScode的jupyternotebook上完成,操作可以看我的另一篇博客:http://t.csdnimg.cn/69sDJ一、准备工作1.导入数据库#功能是可以内嵌绘图,并且可以省略掉plt.show()这一步,具体作用是当你调用matplo......
  • 0基础学python-10:函数的定义,调用以及参数
    目录前言1.函数的定义2.函数的调用3.函数的参数<1>必选参数<2 >默认参数<3> 可变参数<4>关键字参数 <5> 命名关键字参数 4.注意事项前言        函数是一段完成特定任务的代码块,可以通过定义、调用和传递参数来实现代码的模块化和......
  • 基于python的学生成绩管理系统(GUI)
     利用python语言实现成绩管理系统的实现,以某班学生为例,实现以下功能:(1)   添加学生信息以及其九科成绩信息;(2)   将学生信息保存在文件中;(3)   修改和删除学生信息;(4)   查询学生信息;(5)   显示已经添加的所有学生信息。设计要求:1.具有主菜单界面显示。2.有......
  • abaqus基于python二次开发——钢结构穹顶建模
    模型示意本工作旨在建立一个上表面近乎球面的钢结构穹顶。如下图所示,该穹顶由环向梁和径向梁组成。环向梁径向梁上下截面都为工字钢。环向梁截面如下图所示,环向梁截面有一个倾斜角度,为了使其上表面尽可能与球面贴合。径向梁横截面为不经过旋转的工字形代码讲解 2......