Python类库Networkx实现图最短路径

  最近在做一个有关图谱的任务,其中涉及到在图类型数据中寻找两个结点之间的最短路径,一般实现最短路径的算法可以有经典的Dijkstra和Floyd算法,不过通常自己实现起来非常麻烦,经过半小时的调研,发现了一个非常方便的工具,今天分享一个快捷高效的python类库Networkx及相关参考博客。


前记

【1】安装Networkx:
  通常如果安装的是anaconda,一般都会将networkx类库给安装上,如果没有,则可以自行使用pip安装:

pip install networkx

【2】使用过程中的问题
  因为networkx类库在部分函数调用上依赖于matplotlib包,而这个包有时候由于版本问题而不能与其兼容,会出现一些错误,例如

AttributeError: module ‘matplotlib.cbook’ has no attribute ‘iterable’

上面这种情况说明的是版本问题,可以指定安装2.2.3版本的matplotlib。

_tkinter.TclError: no display name and no $DISPLAY environment variable

上面这种情况一种可行的办法是添加如下四行(参考:​​Linux命令行使用matplotlib,报错_tkinter.TclError: no display name and no $DISPLAY environment variable问题解决​​):

import networkx as nx
import matplotlib
matplotlib.use('AGG')
import matplotlib.pyplot as plt

实现

  实现最短路径可以选择如下代码,可以快速测试最短路径的效果,其中图结点默认为0-5的整型数,通过add_path添加新的边,源程序来自于​​NetworkX系列教程(10)-算法之一:最短路径问题​​

#定义并画出该图
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)
#计算最短路径
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))

  如果自定义的图结构,博主进行了一点修改,可使用如下代码:

import networkx as nx
#定义并画出该图
dic1 = [('1',2),('444',4),(1,3),(3,4),(1,4)] // 默认为无向图,且边权为1,结点可为任意一种数据类型
dic1 = [('1',2,2),('444',4,1),(1,3,6),(3,4,3),(1,4,3)] // 默认为无向图,且边权分别为2、1、6、3、3
G = nx.Graph()
G.add_edges_from(dic1)
nx.draw(G,with_labels=True)

  更多的最短路径实现细节可参考博客:​​NetworkX系列教程(10)-算法之一:最短路径问题​​和​​Networkx常用算法和求最短路径介绍​​,可以简单修改代码实现自己的项目中。