簡體   English   中英

從度量> = 3的節點處拆分的圖形中檢索路徑

[英]Retrieve paths from a graph split at nodes with a degree >= 3

當我向圖表添加路徑時:

>>> graph = nx.MultiGraph()  # Needs to be MultiGraph/MultiDiGraph.
>>> graph.add_path([1,2,3,4,5])
>>> graph.add_path([2,6,7])
>>> graph.add_path([4,8,9,10,11])

我可以做什么來檢索在度數> = 3的節點上拆分的路徑? 所以我得到:

[[1, 2], [2, 6, 7], [2, 3, 4], [4, 8, 9, 10, 11], [4, 5]]

我假設你事先知道你的路徑。 如果你真的開始使用圖表並希望將其“剝離”到路徑中,請告訴我。 我會建議另一種方法。

這是我想出來的,可能不是最快或最優雅的方式,但它應該工作:

import networkx as nx

graph = nx.MultiGraph()
paths = [[1,2,3,4,5], [2,6,7], [4,8,9,10,11]]

for path in paths:
    graph.add_path(path)

splitted_paths = []    

# generate list of nodes at which the paths are to be splitted
splitting_nodes = [node for node in graph if graph.degree(node)>=3]

for path in paths:
    # find the splitting nodes in the current path
    splitting_nodes_in_path = [node for node in splitting_nodes if node in path]
    for splitting_node in splitting_nodes_in_path:
        # get remaining path up to the current splitting node
        path_piece = path[:path.index(splitting_node)+1]
        if len(path_piece) > 1:
            splitted_paths.append(path_piece)
        # overwrite current path with the remaining path
        path = path[path.index(splitting_node):]
    # get the remaining piece from the last splitting node until the end of the current path
    if len(path) > 1:        
        splitted_paths.append(path)

print splitted_paths

希望這可以幫助!

編輯1:刪除了一個不必要的for循環並添加了一些丟失的代碼行


編輯2:如果您需要從圖表開始,如@marcus評論建議,並希望在給定的路徑列表中有兩個路徑“粘在一起”,如果它們連接沒有度數> = 3的節點,你有使用不同的方法。 我沒有時間完全編寫我的想法來解決這個問題,但這里是我想要嘗試的草圖:

  • 編寫一個函數cut(graph, node) ,它接受Networkx圖和nodelabel並逐個node替換nodenode )新節點,每個節點連接到一個node的鄰居(一個人必須想到一個聰明的方法來命名新節點) ,所以最終他們來自哪里清楚)
  • cut()應用於度> = 3的所有節點,最后得到一個斷開連接的圖,其中每個組件都是所需的分割路徑之一

以下Networkx函數可能對此有用: remove_node()remove_node() subgraph() all_simple_paths()predecessor()Operators

第一:你為什么需要MultiGraph? 根據你的說法,一個簡單的DiGraph就足夠了; 只有在需要兩個不同的連接時才需要MultiGraphs,例如節點4和10,具有不同的屬性。

很多nx函數不適用於MultiGraphs,但如果DiGraphs可以工作,那么你可以嘗試使用weakly_connected_subcomponent_graphs 我沒有時間對其進行完全編碼,但這應該是算法:

1-獲取程度> = 3的所有節點(這很容易,並留給讀者練習),以及連接到它的任何節點(前輩+后繼者)。 2-從圖中刪除節點。 這應該只留下度<= 2的節點.3-調用weakly_connected_subcomponent_graphs。 這將返回未相互連接的剩余圖形的林。 4-但是不包括度> = 3的節點; 你需要把它們加回去。 你必須添加節點和邊; 你可以從弱連接的子樹中獲取節點列表,添加連接節點,並向原始圖形詢問子圖,或者自己添加邊。

這應該相當快。

暫無
暫無

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

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