簡體   English   中英

Networkx 在圖中查找不同最短路徑之間的公共節點 - 是否有替代解決方案?

[英]Networkx finding common nodes between different shortest paths in a graph - Is there a alternate solution?

我正在編寫一個工具,用於識別網絡中的節點,當給定一組兩個或多個源和目的地遇到網絡問題或延遲時,這些節點會導致延遲。 我正在使用 networkx python 庫來構建網絡圖。 考慮這張圖 -

a -- b -- c -- d  
     |    |
     e -- f

比如說,這些是面臨網絡問題的源和目標集。 這意味着 a 和 d 之間的流量正在經歷延遲,而 e 和 d 之間的流量正在經歷延遲,依此類推。

| source | destination |
|--------|-------------|
| a      | d           |
| e      | d           |
| f      | a           |
  • 我找到了這些源和目標對的最短路徑。 我在這兩個列表之間取一個交集並檢查這些設備上的錯誤。 如果我有 100 對 (source, dest) 集,那么我將找到 100 個列表之間的公共節點,代表這兩對之間的路徑。
Shortest path host a to host d: 
     ['a', 'b', 'c', 'd']
Shortest path host e to host d: 
     ['e', 'b', 'c', 'd']
Shortest path host f to host a: 
     ['f', 'c', 'b', 'a']

^^ 常見節點是“c”和“b”,因此檢查它們是否有錯誤。

  • 我的問題是在networkx中是否有更好的方法來做到這一點,我可以在源和目標之間采用多條路徑並找到一組共同的節點? 我對網絡/圖論的了解非常有限,但這似乎是使用圖解決的常見問題。

我認為您正在尋找的是最大度數的節點,它們的每條邊的平均權重最低。 我們可以獲得排序節點所需的信息,如下所示:

def avg_weight(graph, node):
    all_edges = graph.edges(data=True)
    edges = list(filter(lambda e: node in e, all_edges))
    avg = 0
    for e in edges:
        avg += e[2]['weight'] / len(edges)
    return avg

def weight_and_degree(G):
    degrees = dict(G.degree)
    weights = dict(map(lambda n: (n, avg_weight(G, n)), G.nodes))
    return dict(map(lambda p: (p[0], (p[1], weights[p[0]])), degrees.items()))

現在這是一個(加權)圖,它具有與您在上面指定的相同的屬性。 權重代表延遲時間。

import networkx as nx

G = nx.Graph()
G.add_edge('a','b', weight=0.1)
G.add_edge('b','c', weight=0.1)
G.add_edge('d','c', weight=0.1)
G.add_edge('b','e', weight=0.1)
G.add_edge('f','e', weight=0.3)
G.add_edge('f','c', weight=0.2)

如果我們在圖表上運行上面的 function,我們可以像這樣一次按度數和平均權重排序:

s = dict(sorted(weight_and_degree(G).items(), key=lambda x: (-x[1][0], x[1][1])))
print(' '.join(s.keys())) # b c e f a d

然后你可以根據你可用的資源查看這個列表的前n結果,或者你可以修改代碼只返回最大度數節點等。

參考:

暫無
暫無

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

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