Python数模笔记-NetworkX(4)最小生成树


1、生成树和最小生成树

1.1 生成树

连通的无圈图称为树,就是不包含循环的回路的连通图。

对于无向连通图,生成树(Spanning tree)是原图的极小连通子图,它包含原图中的所有 n 个顶点,并且有保持图连通的最少的边,即只有足以构成一棵树的 n-1 条边。

生成树满足:

  • (1)包含连通图中所有的顶点;
  • (2)任意两顶点之间有且仅有一条通路。

因此,生成树中边的数量 = 顶点数 - 1。

对于非连通无向图, 遍历每个连通分量中的顶点集合所经过的边是多颗生成树,这些连通分量的生成树构成非连通图的生成森林 。


欢迎关注 Youcans 原创系列,数模笔记每周更新

Python数模笔记-PuLP库
Python数模笔记-StatsModels统计回归
Python数模笔记-Sklearn
Python数模笔记-NetworkX
Python数模笔记-模拟退火算法


1.2 最小生成树和最大生成树

遍历连通图的方式有多种,也就是说对于一张连通图,可能有多种不同的生成树。

带权的连通图的生成树中各条边的权重之和最小的生成树,称为最小生成树(minimum spanning tree,MST),也称最小权重生成树。

对应地,各条边的权重之和最大的生成树,称为最大生成树。

生成树和最小生成树有许多重要的应用。例如在若干城市之间铺设通信线路,使任意两个城市之间都可以通信,要使铺设线路的总费用最低,就需要找到最小生成树。



2、最小生成树算法

构造最小生成树的算法很多,通常是基于MST性质,从空树开始,按照贪心法逐步选择并加入 n-1 条安全边(不产生回路),最终生成一棵最小生成树。

最小生成树的典型算法有普里姆算法(Prim算法)和克鲁斯卡算法(Kruskal算法)。


2.1 普里姆算法(Prim算法)

Prim 算法以顶点为基础构造最小生成树:从某一个顶点 s 开始,每次选择剩余的代价最小的边所对应的顶点,加入到最小生成树的顶点集合中,逐步扩充直到包含整个连通网的所有顶点,可以称为“加点法”。Prim算法中每个顶点只与连通图连接一次,因此不用考虑在加入顶点的过程中是否会形成回路。

Prim 算法中图的存贮结构采用邻接矩阵,使用一个顶点集合 u 构造最小生成树。由于不断向集合u中加点,还需要建立一个辅助数组来同步更新最小代价边的信息。

Prim 算法每次选择顶点时,都需要进行排序,但每次都只需要对一部分边进行排序。Prim 算法的时间复杂度为 O(n*n),与边的数量无关,适用于边很多的稠密图。采用堆实现优先队列来维护最小点,可以将Prim算法的时间复杂度降低到 O(mlogn),称为Prim_heap 算法,但该算法的空间消耗很大。


2.2 克鲁斯卡算法(Kruskal算法)

Kruskal 算法以边为基础构造最小生成树:初始边数为 0,每次选择一条满足条件的最小代价边,加入到边集合中,逐步扩充直到包含整个生成树,可以称为“加边法”。Kruskal 算法是利用避圈思想,每次找到不使图构成回路的代价最小的边。

Kruskal 算法中图的存贮结构采用边集数组,权值相等的边在数组中的排列次序是任意的。

Kruskal算法开始就要对所有的边进行排序,之后还需要对所有边应用 Union-Find算法,但不再需要排序。Kruskal 算法的时间复杂度为 O(mlogm),主要是对边排序的时间复杂度,适用于边较少的稀疏图。



3、NetworkX 的最小生成树算法

3.1 最小/最大生成树函数

函数功能
minimum_spanning_tree(G[, weight,…])计算无向图上的最小生成树
maximum_spanning_tree(G[, weight,…])计算无向图上的最大生成树
minimum_spanning_edges(G[, algorithm,…])计算无向加权图最小生成树的边
maximum_spanning_edges(G[, algorithm,…])计算无向加权图最大生成树的边

3.2 minimum_spanning_tree() 使用说明

minimum_spanning_tree(G, weight=‘weight’, algorithm=‘kruskal’, ignore_nan=False)

minimum_spanning_edges(G, algorithm=‘kruskal’, weight=‘weight’, keys=True, data=True, ignore_nan=False)

minimum_spanning_tree() 用于计算无向连通图的最小生成树(森林)。minimum_spanning_edges() 用于计算无向连通图的最小生成树(森林)的边。
对于连通无向图,计算最小生成树;对于非连通无向图,计算最小生成森林。

主要参数:

  • G(undirected graph):无向图。
  • weight(str):指定用作计算权重的边属性。
  • algorithm(string):计算最小生成树的算法,可选项为 ‘kruskal’、‘prim’ 或 ‘boruvka’。默认算法为 ‘kruskal’。
  • data(bool):指定返回值是否包括边的权值。
  • ignore_nan(bool) :在边的权重为 Nan 时产生异常。

返回值:

  • minimum_spanning_tree() 的返回值是最小生成树,类型为<class ‘networkx.classes.graph.Graph’> 。
  • minimum_spanning_edges() 的返回值是最小生成树的构成边,类型为<class ‘generator’>。

3.3 minimum_spanning_tree() 算法使用例程

本案例问题来自:司守奎、孙兆亮,数学建模算法与应用(第2版),P48,例4.5,国防工业出版社。

例:最小生成树问题。已知如图的有权无向图,求最小生成树。

# networkX_E4.py
# Demo of minimum spanning tree(MST) with NetworkX
# Copyright 2021 YouCans, XUPT
# Crated:2021-05-21import matplotlib.pyplot as plt # 导入 Matplotlib 工具包
import networkx as nx  # 导入 NetworkX 工具包G = nx.Graph()  # 创建:空的 无向图
G.add_weighted_edges_from([(1,2,50),(1,3,60),(2,4,65),(2,5,40),(3,4,52),(3,7,45),(4,5,50),(4,6,30),(4,7,42),(5,6,70)])  # 向图中添加多条赋权边: (node1,node2,weight)T = nx.minimum_spanning_tree(G)  # 返回包括最小生成树的图
print(T.nodes)  # [1, 2, 3, 4, 5, 7, 6]
print(T.edges)  # [(1,2), (2,5), (3,7), (4,6), (4,7), (4,5)]
print(sorted(T.edges)) # [(1,2), (2,5), (3,7), (4,5), (4,6), (4,7)]
print(sorted(T.edges(data=True)))  # data=True 表示返回值包括边的权重
# [(1,2,{'weight':50}), (2,5,{'weight':40}), (3,7,{'weight':45}), (4,5,{'weight':50}), (4,6,{'weight':30}), (4,7,{'weight':42})]mst1 = nx.tree.minimum_spanning_edges(G, algorithm="kruskal") # 返回值 带权的边
print(list(mst1))
# [(4,6,{'weight':30}), (2,5,{'weight':40}), (4,7,{'weight':42}), (3,7,{'weight':45}), (1,2,{'weight':50}), (4,5,{'weight':50})]
mst2 = nx.tree.minimum_spanning_edges(G, algorithm="prim",data=False)  # data=False 表示返回值不带权
print(list(mst2))
# [(1,2), (2,5), (5,4), (4,6), (4,7), (7,3)]pos={1:(2.5,10),2:(0,5),3:(7.5,10),4:(5,5),5:(2.5,0),6:(7.5,0),7:(10,5)}  # 指定顶点位置
nx.draw(G, pos, with_labels=True, alpha=0.8)  # 绘制无向图
labels = nx.get_edge_attributes(G,'weight')  # YouCans, XUPT
nx.draw_networkx_edge_labels(G,pos,edge_labels=labels, font_color='c') # 显示边的权值
nx.draw_networkx_edges(G,pos,edgelist=T.edges,edge_color='r',width=4)  # 设置指定边的颜色
plt.show()

3.4 程序运行结果

[1, 2, 3, 4, 5, 7, 6]
[(1, 2), (2, 5), (3, 7), (4, 6), (4, 7), (4, 5)]
[(1, 2), (2, 5), (3, 7), (4, 5), (4, 6), (4, 7)]
[(1, 2, {'weight': 50}), (2, 5, {'weight': 40}), (3, 7, {'weight': 45}), (4, 5, {'weight': 50}), (4, 6, {'weight': 30}), (4, 7, {'weight': 42})]
[(4, 6, {'weight': 30}), (2, 5, {'weight': 40}), (4, 7, {'weight': 42}), (3, 7, {'weight': 45}), (1, 2, {'weight': 50}), (4, 5, {'weight': 50})]
[(1, 2), (2, 5), (5, 4), (4, 6), (4, 7), (7, 3)]

3.5 程序说明

  1. 图的输入。本例为稀疏的有权无向图,使用 G.add_weighted_edges_from() 函数可以使用列表向图中添加多条赋权边,每个赋权边以元组 (node1,node2,weight) 表示。
  2. nx.minimum_spanning_tree() 和 nx.tree.minimum_spanning_edges() 都可以计算最小生成树,参数设置和属性也基本一致。区别主要在于返回值:nx.minimum_spanning_tree() 返回值是最小生成树构成的图(‘Graph’),需要用 T.edges() 调用对应的最小生成树的边。nx.tree.minimum_spanning_edges() 返回值是最小生成树的构成边(‘generator’),需要用 list() 转换为列表数据。


版权说明:
YouCans 原创作品:Python 数模笔记

本文内容及例程为作者原创,并非转载书籍或网络内容。
本文中案例问题来自:司守奎、孙兆亮,数学建模算法与应用(第2版),国防工业出版社

YouCans 原创作品,转载需标注原始链接。
Copyright 2021 YouCans, XUPT
Crated:2021-05-21


欢迎关注 Youcans 原创系列,每周更新数模笔记

Python数模笔记-PuLP库(1)线性规划入门
Python数模笔记-PuLP库(2)线性规划进阶
Python数模笔记-PuLP库(3)线性规划实例
Python数模笔记-Scipy库(1)线性规划问题
Python数模笔记-StatsModels 统计回归(1)简介
Python数模笔记-StatsModels 统计回归(2)线性回归
Python数模笔记-StatsModels 统计回归(3)模型数据的准备
Python数模笔记-StatsModels 统计回归(4)可视化
Python数模笔记-Sklearn (1)介绍
Python数模笔记-Sklearn (2)聚类分析
Python数模笔记-Sklearn (3)主成分分析
Python数模笔记-Sklearn (4)线性回归
Python数模笔记-Sklearn (5)支持向量机
Python数模笔记-模拟退火算法(1)多变量函数优化
Python数模笔记-模拟退火算法(2)约束条件的处理
Python数模笔记-模拟退火算法(3)整数规划问题
Python数模笔记-模拟退火算法(4)旅行商问题
Python数模笔记-NetworkX(1)图的操作
Python数模笔记-NetworkX(2)最短路径
Python数模笔记-NetworkX(3)条件最短路径

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

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

相关文章

Python数模笔记-NetworkX(5)关键路径法

关键路径法&#xff08;Critical path method&#xff0c;CPM&#xff09;是一种计划管理方法&#xff0c;通过分析项目过程中工序进度安排寻找关键路径&#xff0c;确定最短工期&#xff0c;广泛应用于系统分析和项目管理。 1、拓扑序列与关键路径 1.1 拓扑序列 一个大型工程…

Python小白的数学建模课-01.新手必读

Python 完全可以满足数学建模的需要。 Python 是数学建模的最佳选择之一&#xff0c;而且在其它工作中也无所不能。 『Python小白的数学建模课 Youcans』 带你从数模小白成为国赛达人。 欢迎关注『Python小白的数学建模课 Youcans』系列&#xff0c;每周持续更新 Python小白…

Python的数学建模课-02.数据导入

数据导入是所有数模编程的第一步&#xff0c;比你想象的更重要。 先要学会一种未必最佳&#xff0c;但是通用、安全、简单、好学的方法。 『Python小白的数学建模课 Youcans』 带你从数模小白成为国赛达人。 1. 数据导入是所有数模编程的第一步 编程求解一个数模问题&#…

UFIDL稀疏自编码代码实现及解释

UFIDL稀疏自编码代码实现及解释 1.今天我们来讲一下UFIDL的第一个练习。 1.我们来看看最难的一个.m文件 %% ---------- YOUR CODE HERE -------------------------------------- % Instructions: Compute the cost/optimization objective J_sparse(W,b) for the Sparse Aut…

Python小白的数学建模课-A2.2021年数维杯C题(运动会优化比赛模式探索)探讨

关注收藏&#xff0c;国赛再会。 运动会优化比赛模式问题&#xff0c;是公平分配问题。 『Python小白的数学建模课 Youcans』带你从数模小白成为国赛达人。 2021第六届数维杯大学生数学建模 赛题已于5月27日公布&#xff0c;C题是"运动会优化比赛模式探索"。本文对…

Python小白的数学建模课-03.线性规划

线性规划是很多数模培训讲的第一个算法&#xff0c;算法很简单&#xff0c;思想很深刻。 要通过线性规划问题&#xff0c;理解如何学习数学建模、如何选择编程算法。 『Python小白的数学建模课 Youcans』带你从数模小白成为国赛达人。 1. 求解方法、算法和编程方案 线性规…

Python小白的数学建模课-A1.国赛赛题类型分析

分析赛题类型&#xff0c;才能有的放矢。 评论区留下邮箱地址&#xff0c;送你国奖论文分析 『Python小白的数学建模课 Youcans』 带你从数模小白成为国赛达人。 1. 数模竞赛国赛 A题类型分析 年份题目要求方法2020A炉温曲线建立温度模型&#xff0c;计算炉温曲线&#xff…

白话(whitening)

白化 Contents [hide]1 介绍2 2D 的例子3 ZCA白化4 正则化5 中英文对照6 中文译者 介绍 我们已经了解了如何使用PCA降低数据维度。在一些算法中还需要一个与之相关的预处理步骤&#xff0c;这个预处理过程称为白化&#xff08;一些文献中也叫sphering&#xff09;。举例来说&…

Python小白的数学建模课-04.整数规划

整数规划与线性规划的差别只是变量的整数约束。 问题区别一点点&#xff0c;难度相差千万里。 选择简单通用的编程方案&#xff0c;让求解器去处理吧。 『Python小白的数学建模课 Youcans』带你从数模小白成为国赛达人。 1. 从线性规划到整数规划 1.1 为什么会有整数规划&…

实现主成分分析和白化

实现主成分分析和白化 在这一节里&#xff0c;我们将总结PCA, PCA白化和ZCA白化算法&#xff0c;并描述如何使用高效的线性代数库来实现它们。 首先&#xff0c;我们需要确保数据的均值&#xff08;近似&#xff09;为零。对于自然图像&#xff0c;我们通过减去每个图像块(patc…

Python小白的数学建模课-05.0-1规划

0-1 规划不仅是数模竞赛中的常见题型&#xff0c;也具有重要的现实意义。 双十一促销中网购平台要求二选一&#xff0c;就是互斥的决策问题&#xff0c;可以用 0-1规划建模。 小白学习 0-1 规划&#xff0c;首先要学会识别 0-1规划&#xff0c;学习将问题转化为数学模型。 『…

mac下一些终端命令的使用

mac基础终端命令入门作为一名编程人员&#xff0c;&#xff08;叫程序猿显得屌丝&#xff0c;叫攻城狮感觉还达不到&#xff09;&#xff0c;我经常看到许多大神在终端里面进行一些神操作。鉴于此&#xff0c;我今天就百度了一下&#xff0c;别问我为什么不Google&#xff0c;穷…

Python小白的数学建模课-06.固定费用问题

Python 实例介绍固定费用问题的建模与求解。 学习 PuLP工具包中处理复杂问题的快捷使用方式。 『Python小白的数学建模课 Youcans』带你从数模小白成为国赛达人。 前文讲到几种典型的 0-1 规划问题&#xff0c;给出了 PuLP 求解的案例。由于 0-1 规划问题种类很多&#xff0…

Python小白的数学建模课-07.选址问题

选址问题是要选择设施位置使目标达到最优&#xff0c;是数模竞赛中的常见题型。 小白不一定要掌握所有的选址问题&#xff0c;但要能判断是哪一类问题&#xff0c;用哪个模型。 进一步学习 PuLP工具包中处理复杂问题的字典格式快捷建模方法。 欢迎关注『Python小白的数学建模…

Python小白的数学建模课-09.微分方程模型

小白往往听到微分方程就觉得害怕&#xff0c;其实数学建模中的微分方程模型不仅没那么复杂&#xff0c;而且很容易写出高水平的数模论文。 本文介绍微分方程模型的建模与求解&#xff0c;通过常微分方程、常微分方程组、高阶常微分方程 3个案例手把手教你搞定微分方程。 通过…

Python小白的数学建模课-B2. 新冠疫情 SI模型

传染病的数学模型是数学建模中的典型问题&#xff0c;常见的传染病模型有 SI、SIR、SIRS、SEIR 模型。 SI 模型是最简单的传染病模型&#xff0c;适用于只有易感者和患病者两类人群。 我们就从 SI 模型开始吧&#xff0c;从模型、例程、运行结果到模型分析&#xff0c;全都在…

Python小白的数学建模课-B3. 新冠疫情 SIS模型

传染病的数学模型是数学建模中的典型问题&#xff0c;常见的传染病模型有 SI、SIR、SIRS、SEIR 模型。 SIS 模型型将人群分为 S 类和 I 类&#xff0c;考虑患病者可以治愈而变成易感者&#xff0c;但不考虑免疫期。 本文详细给出了 SIS 模型的建模、例程、运行结果和模型分析…

html里面Meta标签的使用

HTML meta标签使用 先上思维导图&#xff0c;接下来在是文章内容。一、meta标签的组成 meta标签共有两个属性&#xff0c;它们分别是http-equiv属性和name属性&#xff0c;不同的属性又有不同的参数值&#xff0c;这些不同的参数值就实现了不同的网页功能。 1、name属性 name属…

Python小白的数学建模课-B4. 新冠疫情 SIR模型

传染病的数学模型是数学建模中的典型问题&#xff0c;常见的传染病模型有 SI、SIR、SIRS、SEIR 模型。 SIR 模型将人群分为易感者&#xff08;S类&#xff09;、患病者&#xff08;I类&#xff09;和康复者&#xff08;R 类&#xff09;&#xff0c;考虑了患病者治愈后的免疫能…