Networkx带标签的平均最短路径

时间:2018-03-30 09:05:05

标签: python networkx shortest-path

我想计算标记图中具有相同标签的节点的平均最短路径。例如,红色标记为A,黑色标记为B.

G = nx.DiGraph()
G.add_node('A', label = 'A')
G.add_node('B', label = 'B')
G.add_node('C', label = 'A')
G.add_node('D', label = 'B')
G.add_edges_from([('A', 'B'), ('B', 'C'), ('C', 'D'), ('D', 'A')])
H = G.to_undirected()

Labeled Graph

现在我只想基于此计算A的平均最短路径 equation

V_m是具有相同标签的顶点。 n_ {i,j}是最短路径的数量 d_ {i,j}是测地距离。

我想使用Networkx来实现它。开始使用节点属性进行标记。

我可以使用

标签读出节点
graph_labels = (nx.get_node_attributes(G, 'label'))

现在我只想保留标签所在的键/值对。 " A&#34 ;.所以我可以专注于具有相同标签的节点。我希望不是抽象,但你有什么想法吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

按标签选择节点

def select_nodes_by_label(G, lab):
    return [node[0] for node in G.nodes(data='label') if node[1] == lab ]

这将返回一个节点列表,我们可以使用它们来获取所有组合的最短路径。

from itertools import combinations

def avg_shortest_path_labeled_node(G, lab):
    sel_nodes = select_nodes_by_label(G,lab)
    V_m = len(sel_nodes)

    # collect all lengths of shortest paths from combinations of labeled nodes 
    sp_len = [len(nx.shortest_path(G,c[0], c[1]))  for c in combinations(sel_nodes,2)]
    n = len(sp_len)
    return sum(sp_len)/(n) * 1/(V_m * (V_m - 1))

测试

avg_shortest_path_labeled_node(G,'A')

[OUT]:

1.5

这是你期望的结果吗?在更复杂的图表上测试此函数可能会很有趣。