![](/img/trans.png)
[英]Networkx: Finding the shortest path to one of multiple nodes in Graph
[英]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 |
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”,因此檢查它們是否有錯誤。
我認為您正在尋找的是最大度數的節點,它們的每條邊的平均權重最低。 我們可以獲得排序節點所需的信息,如下所示:
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.