Python类库Networkx实现图最短路径

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)] // 默认为无向图,且边权分别为21633
G = nx.Graph()
G.add_edges_from(dic1)
nx.draw(G,with_labels=True)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华师数据学院·王嘉宁

$感谢支持$

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值