小书匠Graph图论
重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图论中常用算法弄个明白在写这部分.
图论常用算法看我的博客:
下面我将使用NetworkX实现上面的算法,建议不清楚的部分打开两篇博客对照理解.
我将图论的经典问题及常用算法的总结写在下面两篇博客中:
图论---问题篇
图论---算法篇
目录:
注意:如果代码出现找不库,请返回第一个教程,把库文件导入.
11.Graph相关算法
11.1最短路径
11.1.1无向图和有向图
#定义并画出该图
G = nx.path_graph(5)
nx.add_path(G,[0,5,2])
nx.add_path(G,[0,6,4])
nx.draw(G,with_labels=True)
plt.title('无向图',fontproperties=myfont)
plt.axis('on')
plt.xticks([])
plt.yticks([])
plt.show()
#计算最短路径
print('0节点到4节点最短路径: ',nx.shortest_path(G, source=0, target=4))
p1 = nx.shortest_path(G, source=0)
print('0节点到所有节点最短路径: ',p1)
#计算图中所有的最短路径
print('计算图中节点0到节点2的所有最短路径: ',[p for p in nx.all_shortest_paths(G, source=0, target=2)])
#计算最短路径长度
p2=nx.shortest_path_length(G, source=0, target=2) #最短路径长度
p3=nx.average_shortest_path_length(G) #计算平均最短路径长度
print('节点0到节点2的最短路径长度:',p2,' 平均最短路径长度: ',p3)
#检测是否有路径
print('检测节点0到节点2是否有路径',nx.has_path(G,0,2))
无向图和有向图最短路径示例
输出:
0节点到4节点最短路径: [0, 6, 4]
0节点到所有节点最短路径: {0: [0], 1: [0, 1], 2: [0, 1, 2], 3: [0, 1, 2, 3], 4: [0, 6, 4], 5: [0, 5], 6: [0, 6]}
计算图中节点0到节点2的所有最短路径: [[0, 1, 2], [0, 5, 2]]
节点0到节点2的最短路径长度: 2 平均最短路径长度: 1.8095238095238095
检测节点0到节点2是否有路径 True
11.1.2无权图
G = nx.path_graph(3)
nx.draw(G,with_labels=True)
plt.title('无权图',fontproperties=myfont)
plt.axis('on')
plt.xticks([])
plt.yticks([])
plt.show()
path1 = nx.single_source_shortest_path(G, 0) #计算当前源与所有可达节点的最短路径
length1 = nx.single_source_shortest_path_length(G, 0) #计算当前源与所有可达节点的最短路径的长度
path2 = dict(nx.all_pairs_shortest_path(G)) #计算graph两两节点之间的最短路径
length2 = dict(nx.all_pairs_shortest_path_length(G)) #计算graph两两节点之间的最短路径的长度
prede1=nx.predecessor(G, 0) #返回G中从源到所有节点最短路径的前驱
print('当前源与所有可达节点的最短路径: ',path