赞
踩
import numpy as np import pandas as pd from scipy.sparse import coo_matrix import networkx as nx import matplotlib.pyplot as plt # 避免图片无法显示中文 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False # 显示完整数据 # pd.set_option('display.max_columns',None) # pd.set_option('display.max_rows',None) data=pd.read_excel('附件.xlsx',sheet_name='各地点之间距离',index_col=0) data=data.fillna(0) print('矩阵的空值以0填充:\n',data) data=np.tril(data,-1) print('\n截取矩阵的下三角部分(上三角部分全部以0填充):\n',data) coo=coo_matrix(np.array(data)) # 矩阵行列的索引默认从0开始改成从1开始 coo.row+=1 coo.col+=1 data=[int(i) for i in coo.data] print('\n矩阵转换为稀疏矩阵:') print(coo) coo_list=list(zip(coo.row,coo.col,data)) # 设置各顶点坐标(自定义) pos={1:(1,8),2:(4,10),3:(11,11),4:(14,8),5:(5,7),6:(10,6),7:(3,5),8:(6,4),9:(8,4),10:(14,5),11:(2,3),12:(5,1),13:(8,1),14:(13,3)} # 创建空的无向图 G=nx.Graph() # 给无向图的边赋予权值 G.add_weighted_edges_from(coo_list) # 最小生成树的求解:kruskal克鲁斯卡尔算法,prim普里姆算法,boruvka博鲁夫卡算法 T=nx.minimum_spanning_tree(G,algorithm='kruskal') # T=nx.minimum_spanning_tree(G,algorithm='prim') # T=nx.minimum_spanning_tree(G,algorithm='boruvka') # dfs深度优先 print('\n深度优先生成树:') # 从源头开始在深度优先搜索中生成边 print(list(nx.dfs_edges(G,source=9))) # 返回从源头开始的深度优先搜索构造的定向树 T_dfs=nx.dfs_tree(G,source=9) print(T_dfs.nodes) # bfs广度优先 print('\n广度优先生成树:') # 从源头开始在广度优先搜索中生成边 print(list(nx.bfs_edges(G,source=9))) # 返回从源头开始的广度优先搜索构造的定向树 T_bfs=nx.bfs_tree(G,source=9) print(T_bfs.nodes) # 单源最短路径dijkstra迪杰斯特拉算法求解顶点9到各顶点的最短路径和最短距离 print('\n顶点9到各点的最短路径和最短距离:') for i in range(1,15): min_path_v1=nx.dijkstra_path(G,source=9,target=i) min_path_length_v1=nx.dijkstra_path_length(G,source=9,target=i) print('顶点9到顶点%d的最短路径:%s,顶点9到顶点%d的最短距离:%d'%(i,min_path_v1,i,min_path_length_v1)) plt.figure() plt.subplot(221) # 绘制无向加权图 nx.draw(G,pos,with_labels=True) # 显示无向加权图的边的权值 labels=nx.get_edge_attributes(G,'weight') # 设置顶点颜色 nx.draw_networkx_nodes(G,pos,node_color='yellow') # 显示边的权值 nx.draw_networkx_edge_labels(G,pos,edge_labels=labels,font_color='purple',font_size=10) plt.title('原图') plt.subplot(222) # 绘制无向加权图 nx.draw(G,pos,with_labels=True) # 设置最小生成树的顶点颜色 nx.draw_networkx_nodes(G,pos,nodelist=T.nodes,node_color='yellow') # 设置最小生成树的边颜色和宽度 nx.draw_networkx_edges(G,pos,edgelist=T.edges,edge_color='green',width=3) # 显示无向加权图的边的权值 labels2=nx.get_edge_attributes(G,'weight') # 显示边的权值 nx.draw_networkx_edge_labels(G,pos,edge_labels=labels2,font_color='purple',font_size=10) plt.title('最小生成树') plt.subplot(223) # 绘制无向加权图 nx.draw(G,pos,with_labels=True) # 设置深度优先生成树的顶点颜色 nx.draw_networkx_nodes(G,pos,nodelist=T_dfs.nodes,node_color='yellow') # 设置深度优先生成树的边颜色和宽度 nx.draw_networkx_edges(G,pos,edgelist=T_dfs.edges,edge_color='red',width=3) # 显示无向加权图的边的权值 labels2=nx.get_edge_attributes(G,'weight') # 显示边的权值 nx.draw_networkx_edge_labels(G,pos,edge_labels=labels2,font_color='purple',font_size=10) plt.title('深度优先生成树') plt.subplot(224) # 绘制无向加权图 nx.draw(G,pos,with_labels=True) # 设置广度优先生成树的顶点颜色 nx.draw_networkx_nodes(G,pos,nodelist=T_bfs.nodes,node_color='yellow') # 设置广度优先生成树的边颜色和宽度 nx.draw_networkx_edges(G,pos,edgelist=T_bfs.edges,edge_color='blue',width=3) # 显示无向加权图的边的权值 labels2=nx.get_edge_attributes(G,'weight') # 显示边的权值 nx.draw_networkx_edge_labels(G,pos,edge_labels=labels2,font_color='purple',font_size=10) plt.title('广度优先生成树') plt.show()
矩阵的空值以0填充: 1 2 3 4 5 6 ... 9 10 11 12 13 14 1 0.0 0.0 0.0 0.0 54.0 0.0 ... 0.0 0.0 26.0 0.0 0.0 0.0 2 0.0 0.0 56.0 0.0 18.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 3 0.0 56.0 0.0 0.0 44.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 4 0.0 0.0 0.0 0.0 0.0 28.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 5 54.0 18.0 44.0 0.0 0.0 51.0 ... 48.0 0.0 0.0 0.0 0.0 0.0 6 0.0 0.0 0.0 28.0 51.0 0.0 ... 27.0 42.0 0.0 0.0 0.0 0.0 7 55.0 0.0 0.0 0.0 34.0 0.0 ... 0.0 0.0 0.0 38.0 0.0 0.0 8 0.0 0.0 0.0 0.0 56.0 0.0 ... 29.0 0.0 0.0 33.0 0.0 0.0 9 0.0 0.0 0.0 0.0 48.0 27.0 ... 0.0 61.0 0.0 29.0 42.0 36.0 10 0.0 0.0 0.0 0.0 0.0 42.0 ... 61.0 0.0 0.0 0.0 0.0 25.0 11 26.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 24.0 0.0 0.0 12 0.0 0.0 0.0 0.0 0.0 0.0 ... 29.0 0.0 24.0 0.0 0.0 0.0 13 0.0 0.0 0.0 0.0 0.0 0.0 ... 42.0 0.0 0.0 0.0 0.0 47.0 14 0.0 0.0 0.0 0.0 0.0 0.0 ... 36.0 25.0 0.0 0.0 47.0 0.0 [14 rows x 14 columns] 截取矩阵的下三角部分(上三角部分全部以0填充): [[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 56. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [54. 18. 44. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 28. 51. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [55. 0. 0. 0. 34. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 56. 0. 36. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 48. 27. 0. 29. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 42. 0. 0. 61. 0. 0. 0. 0. 0.] [26. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 0. 38. 33. 29. 0. 24. 0. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 42. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 36. 25. 0. 0. 47. 0.]] 矩阵转换为稀疏矩阵: (3, 2) 56.0 (5, 1) 54.0 (5, 2) 18.0 (5, 3) 44.0 (6, 4) 28.0 (6, 5) 51.0 (7, 1) 55.0 (7, 5) 34.0 (8, 5) 56.0 (8, 7) 36.0 (9, 5) 48.0 (9, 6) 27.0 (9, 8) 29.0 (10, 6) 42.0 (10, 9) 61.0 (11, 1) 26.0 (12, 7) 38.0 (12, 8) 33.0 (12, 9) 29.0 (12, 11) 24.0 (13, 9) 42.0 (14, 9) 36.0 (14, 10) 25.0 (14, 13) 47.0 深度优先生成树: [(9, 5), (5, 1), (1, 7), (7, 8), (8, 12), (12, 11), (5, 2), (2, 3), (5, 6), (6, 4), (6, 10), (10, 14), (14, 13)] [9, 5, 1, 7, 8, 12, 11, 2, 3, 6, 4, 10, 14, 13] 广度优先生成树: [(9, 5), (9, 6), (9, 8), (9, 10), (9, 12), (9, 13), (9, 14), (5, 1), (5, 2), (5, 3), (5, 7), (6, 4), (12, 11)] [9, 5, 6, 8, 10, 12, 13, 14, 1, 2, 3, 7, 4, 11] 顶点9到各点的最短路径和最短距离: 顶点9到顶点1的最短路径:[9, 12, 11, 1],顶点9到顶点1的最短距离:79 顶点9到顶点2的最短路径:[9, 5, 2],顶点9到顶点2的最短距离:66 顶点9到顶点3的最短路径:[9, 5, 3],顶点9到顶点3的最短距离:92 顶点9到顶点4的最短路径:[9, 6, 4],顶点9到顶点4的最短距离:55 顶点9到顶点5的最短路径:[9, 5],顶点9到顶点5的最短距离:48 顶点9到顶点6的最短路径:[9, 6],顶点9到顶点6的最短距离:27 顶点9到顶点7的最短路径:[9, 8, 7],顶点9到顶点7的最短距离:65 顶点9到顶点8的最短路径:[9, 8],顶点9到顶点8的最短距离:29 顶点9到顶点9的最短路径:[9],顶点9到顶点9的最短距离:0 顶点9到顶点10的最短路径:[9, 10],顶点9到顶点10的最短距离:61 顶点9到顶点11的最短路径:[9, 12, 11],顶点9到顶点11的最短距离:53 顶点9到顶点12的最短路径:[9, 12],顶点9到顶点12的最短距离:29 顶点9到顶点13的最短路径:[9, 13],顶点9到顶点13的最短距离:42 顶点9到顶点14的最短路径:[9, 14],顶点9到顶点14的最短距离:36
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。