NetworkX:Djikstra的最短路径与Brandes算法的关系中心性

时间:2017-03-24 13:32:34

标签: graph-theory networkx

我有几个Python脚本可以计算各种网络指标。

给定图(G),第一个脚本计算从每个节点到所有其他节点的平均最短路径,并将其存储在Nx1矩阵(L)中。从NetworkX Python库实现了Djikstra算法:

for i in range(num_nodes):
    for j in range(num_nodes):
        dj_path_matrix[i,j] = nx.dijkstra_path_length(G, i, j)

L = np.sum(dj_path_matrix, axis=0)/(num_nodes - 1)

给定相同的图形(G),第二个脚本在NetworkX库中使用Brande算法的实现来计算中介中心性并将其存储在Nx1矩阵(BC)中:

BC = nx.betweenness_centrality(G, normalized=True)

我的问题是:与BC相比,为什么计算L需要这么长时间?

我理解它的方式,节点的BC是衡量最短路径穿过该节点的频率。因此,要计算BC,您肯定需要计算图中所有可能的最短路径。当然,BC应该至少和L一样长吗?使用我的脚本,给定相同的图形,计算BC需要几秒钟,但计算L需要半小时。

1 个答案:

答案 0 :(得分:1)

如果我要求您找到从给定节点u到图表中每个其他节点的最短路径,您可能不会选择您在此处获得的技术。如果我们同时完成所有这些路径长度,则可以更有效地计算所有这些路径长度。我们找到长度为1的所有路径。然后我们找到长度为2的所有路径,它们不会重新访问先前找到的节点。然后所有长度为3的路径等等。

这比计算从u到一个节点的路径,然后重新开始并找到下一个节点的路径要高效得多。通过一次查找uG中所有节点之间的所有最短路径而不是按顺序查找每个节点来计算中介中心性。