新乡网站建设找哪家,做网站的排名,网站优化 套站,网站后台程序下载1、生成树和最小生成树
1.1 生成树
连通的无圈图称为树#xff0c;就是不包含循环的回路的连通图。
对于无向连通图#xff0c;生成树#xff08;Spanning tree#xff09;是原图的极小连通子图#xff0c;它包含原图中的所有 n 个顶点#xff0c;并且有保持图连通的最…
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 treeMST也称最小权重生成树。
对应地各条边的权重之和最大的生成树称为最大生成树。
生成树和最小生成树有许多重要的应用。例如在若干城市之间铺设通信线路使任意两个城市之间都可以通信要使铺设线路的总费用最低就需要找到最小生成树。 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_nanFalse)
minimum_spanning_edges(G, algorithm‘kruskal’, weight‘weight’, keysTrue, dataTrue, ignore_nanFalse)
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
# Crated2021-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(dataTrue))) # dataTrue 表示返回值包括边的权重
# [(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, algorithmkruskal) # 返回值 带权的边
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, algorithmprim,dataFalse) # dataFalse 表示返回值不带权
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_labelsTrue, alpha0.8) # 绘制无向图
labels nx.get_edge_attributes(G,weight) # YouCans, XUPT
nx.draw_networkx_edge_labels(G,pos,edge_labelslabels, font_colorc) # 显示边的权值
nx.draw_networkx_edges(G,pos,edgelistT.edges,edge_colorr,width4) # 设置指定边的颜色
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 程序说明
图的输入。本例为稀疏的有权无向图使用 G.add_weighted_edges_from() 函数可以使用列表向图中添加多条赋权边每个赋权边以元组 (node1,node2,weight) 表示。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 Crated2021-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数模笔记-NetworkX1图的操作 Python数模笔记-NetworkX2最短路径 Python数模笔记-NetworkX3条件最短路径