查找连接到n

时间:2015-08-01 17:49:08

标签: python networkx

我需要找到有向图中每对节点之间的所有最短路径。我在做的是:

for i in A.nodes()
    for y in A.nodes()
        paths = nx.all_shortest_paths(G,i,y)

但是我觉得这很慢,因为在图中有很多节点无论如何都没有连接到我。 有没有办法优化这个过程?我已经注意到没有可能连接到其他节点的节点不会在A中结束。

3 个答案:

答案 0 :(得分:1)

您可以尝试使用构造算法来查找所有节点对之间的所有最短路径,而不是迭代所有对并获得每对的最短路径(每次都不会使用过去的知识)。

答案 1 :(得分:1)

正如Roy Shahaf所说,你或许能够建立一种不会失去你已经完成的工作的建设性算法。此外,由于图形是定向的,如果首先对图形进行拓扑排序,则可以立即优化50%的改进,因为您可能达到的唯一节点是起始节点之后的节点。我发布了一个早期的答案(不使用nx)进行拓扑排序,然后查找从节点到其他每个节点的所有距离here

请注意,为清楚起见,该答案根本未进行优化(初始目标除外)。它相当于for n1 in G for n2 in G,但正如我所说的,如果你将节点放在一个列表中,然后在第一个节点的整个列表中索引,并通过列表中的所有节点编制索引,就可以将其删除在第一个之后,例如,第二个(nlist[i], nlist[j]) for i in range(len(nlist)) for j in range(i+1, len(nlist))

答案 2 :(得分:0)

内置了一个命令: single_source_shortest_path_length(G, source)为您提供源和每个可达节点之间的最短路径。

import networkx as nx
G=nx.DiGraph()
G.add_edges_from([(1,2), (2,3), (3,4), (1,5), (2,5), (6,7)]) #6,7 not reachable from 1
nx.single_source_shortest_path(G,1)
>{1: [1], 2: [1, 2], 3: [1, 2, 3], 4: [1, 2, 3, 4], 5: [1, 5]}

问题标题表明您只想知道可到达的节点而不是路径。在这种情况下,请使用深度优先或广度优先搜索。文档是here。例如:dfs_postorder_nodes(G, source=None)为从源可到达的节点提供迭代器。它们出现的具体顺序是深度优先搜索后序。

for reachable_node in nx.dfs_postorder_nodes(G,source=1):
   print reachable_node
>4
>3
>5
>2
>1