Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 两个节点之间所有路径的快速算法_Python_Graph_Nodes - Fatal编程技术网

Python 两个节点之间所有路径的快速算法

Python 两个节点之间所有路径的快速算法,python,graph,nodes,Python,Graph,Nodes,我对python编码非常陌生,我正在寻找一种算法,可以快速找到一个非常大的图的开始节点和结束节点之间的所有路径,比如一个有大约1000个节点和10000条边的图。从开始节点到结束节点实际存在的路径数很小-十条或更少。为了帮助我们更深入地了解这个问题,考虑一下社交网络——如果我有1000个朋友,我想知道我高中最好的朋友有多少种方式可以和我的室友联系,我不在乎我高中时最好的朋友和我所有的200个高中朋友都有联系,因为这些道路永远不会通向我的室友。我想用这段python代码快速地将我的两个朋友之间存在

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

我已经尝试实现了许多代码示例,所有这些示例都可以很好地处理小而简单的图形。然而,当我尝试将它们合并到我的大型图形分析中时,它们都需要花费太长的时间才有用


你们是否都对要研究的方法有任何建议(例如,networkx中已经创建的东西,甚至是关于使用堆栈与递归的信息,等等),要实现的代码示例,甚至是python之外的其他途径?请记住,我是python新手。

我个人建议为此使用图形数据库。Neo4j或Rexter浮现在脑海中

从Python访问这些文件时,有几个库可用:


虽然要编写一个快速/可伸缩的Python版本并非不可能,但据我所知,目前还没有一个版本。

也许您想要两个节点之间的所有简单(无重复节点)路径?NetworkX有一个基于深度优先搜索的功能。看

其中的示例显示,简单路径的数量可能很大:

>>> 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]

将本文中的一个解决方案翻译成python:还有,这个:挑战在于知道何时找到了所有解决方案。如果不检查大量节点,我认为这是不可能的。该算法不能忽视你的200个朋友,因为它不能知道(不检查他们和他们的其他朋友)他们与你的室友没有联系。事实上,确定是否有通过这些朋友的路径不是运行搜索的全部意义吗?Adrian-感谢提供的资源!我一定会去看看。Blckknght-好的观点-我遇到了与你看到的相同的挑战。在处理这个问题时,我考虑的一件事是,我希望流程查看所有节点,但只输出从一个节点到端点的路径。到目前为止,我认为可以找到距离“1跳”然后是“2跳”的节点,等等。。。但是为了让算法快速运行,我需要使用哈希表/查找数组,而不是队列(我到目前为止已经使用过了)——到目前为止,有人看到了这方面的问题吗?Aric,我注意到当前的实现在实际网络上没有很好的扩展性。是否存在潜在的解决方法?