适用于两个节点之间所有路径的非常快速的算法



我对python编码非常陌生,我正在寻找一种算法,可以快速找到一个非常大的图的开始节点和结束节点之间的所有路径,比如一个大约有1000个节点和10000条边的图。从开始节点到结束节点实际存在的路径数量很少——十条或更少。为了更好地理解这个问题,可以考虑一个社交网络——如果我有1000个朋友,我想知道我高中时最好的朋友和我大学时的室友有多少联系方式,我不在乎我高中时最要好的朋友和200个高中朋友都有联系,因为这些联系方式永远不会通向我的室友。我想用这个python代码快速地对我的两个朋友之间存在的路径进行子集设置,并从本质上消除这两个节点周围存在的所有"噪音"。

我已经尝试实现了许多代码示例,所有这些示例都能在小而简单的图上很好地工作。然而,当我试图将它们纳入我的大型图分析时,它们都需要很长时间才能发挥作用。

你们是否都有任何方法建议要研究(即,已经在networkx中创建的东西,甚至关于使用堆栈与递归的信息,等等…),要实现的代码示例,甚至要追求python之外的其他路由?请记住,我是一个蟒蛇新手。

也许您想要两个节点之间的所有简单路径(没有重复节点)?NetworkX具有基于深度优先搜索的功能。看见http://networkx.github.com/documentation/development/reference/generated/networkx.algorithms.simple_paths.all_simple_paths.html

这里的例子表明,简单路径的数量可能很大:

>>> import networkx as nx
>>> G = nx.complete_graph(4)
>>> for path in nx.all_simple_paths(G, source=0, target=3):
...     print(path)
...
[0, 1, 2, 3]
[0, 1, 3]
[0, 2, 1, 3]
[0, 2, 3]
[0, 3]

就我个人而言,我建议为此使用图形数据库。脑海中浮现出Neo4j或Rexter。

当从Python访问这些库时,有几个可用的库:

  • http://bulbflow.com/overview/
  • http://py2neo.org/

尽管编写一个快速/可扩展的Python版本并非不可能,但据我所知,目前还没有。

最新更新