Python:如何计算网络稳健性的快速度量?

时间:2016-03-09 09:53:27

标签: python algorithm performance networkx computation

我正在使用常规visreg网络,我需要确定其稳健性的衡量标准(即承受故障的能力)。为此,我使用average node connectivity描述的this function

然而,正如您在下面所看到的,这种计算证明非常缓慢且计算要求很高。我应该在NxN次以下运行脚本,所以时间是一个非常关键的因素。出于这个原因,我愿意减少网络的规模,但我想找到网络规模和计算需求之间的最佳折衷方案。

我的问题:

有没有更快的方法来得出相同的结果?或者,为避免长时间的计算,您还建议采取其他措施吗?

脚本和时间:

60,000

前两个时间:

'''
Timing the average node connectivity function
'''

from __future__ import division
import networkx as nx
import time

#Lattice network
N=10 #This can be 10, 20, 30, ...
G=nx.grid_2d_graph(N,N)
pos = dict( (n, n) for n in G.nodes() )
labels = dict( ((i, j), i + (N-1-j) * N ) for i, j in G.nodes() )
nx.relabel_nodes(G,labels,False)
inds=labels.keys()
vals=labels.values()
inds.sort()
vals.sort()
pos2=dict(zip(vals,inds))

start_time = time.clock()
conn=nx.average_node_connectivity(G)
print('N: '+str(N))
print('Avg node conn: '+str(round(conn, 3)))
print("--- %s seconds ---" % (time.clock() - start_time))

2 个答案:

答案 0 :(得分:3)

此处计算的平均节点连接数是G的所有节点上的本地节点连接的平均值。因此,此函数将覆盖所有可能的对,这使得它非常慢。一个建议是根据需要保留网络的大小,然后从所有可能的节点对中随机抽样,并根据该样本计算连通性估计值。

答案 1 :(得分:3)

NetworkX功能必须使用有向图,因此它使用计算V *(V-1)流的强力算法。由于您有一个无向图,您可以改为计算V-1流中的Gomory--Hu tree,然后使用树结构快速确定最小割(实际上,您可以计算G-H树的平均节点连通性)在线性或线性时间,但我希望二次方可能很好。

(无耻的插件:因为你正在处理具有单位容量的平面图,如果你急需速度,你可以实现我和Philip Klein的线性时间最大流算法,但是我希望通常的算法在实践中大致是线性时间。)