簡體   English   中英

找到所有連接到 n 的節點

[英]Find all nodes connected to n

我需要在我的有向圖中找到每對節點之間的所有最短路徑。 我正在做的是:

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

但這很慢,我猜,因為在圖中有很多節點無論如何都與 i 沒有聯系。 有沒有辦法優化這個過程? 我已經在注意不可能連接到其他節點的節點不會以 A 結束。

有一個內置命令: 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]}

問題標題表明您只想知道可達節點而不是路徑。 在這種情況下,請使用深度優先或廣度優先搜索。 文檔在這里 例如: 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

您可以嘗試使用構造算法來查找所有節點對之間的所有最短路徑,而不是遍歷所有節點並獲取每對節點的最短路徑(每次都不會使用過去的知識)。

正如 Roy Shahaf 所說,您或許能夠構建一個不會丟失您已經完成的工作的建設性算法。 此外,由於圖是有向圖,如果您先對圖進行拓撲排序,您將立即優化 50%,因為您可能到達的唯一節點是起始節點之后的節點。 我張貼較早的答案(不使用NX),做了地形排序,然后查找從節點的所有距離的所有其他節點在這里

請注意,為清楚起見,該答案根本沒有優化(初始拓撲排序除外)。 它相當於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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM