【发布时间】:2016-06-23 15:00:24
【问题描述】:
我正在使用常规的NxN 网络,我需要确定其稳健性的衡量标准(即承受故障的能力)。为此,我使用average node connectivity,由this function 描述。
但是,正如您在下面看到的那样,这种计算被证明是极其缓慢且计算量大的。我应该在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))
前两个时间:
N: 10
Avg node conn: 3.328
--- 6.80954619325 seconds --- #This must be multiplied by 60,000
N: 20
Avg node conn: 3.636
--- 531.969059161 seconds --- #This must be multiplied by 60,000
【问题讨论】:
-
在这种情况下,“稳健性”对您意味着什么?
-
承受失败的能力。
-
所以我假设大卫提供的是你所追求的——但你应该知道,可能会发生许多不同的“失败”。取决于这对您意味着什么,这可能是也可能不是计算的正确数量。我们可以谈论节点失败。我们可以谈论边缘失败。承受故障可能意味着整个网络仍然保持连接,或者它可能意味着大部分网络保持连接,或者它可能意味着路径长度不会变长......等等。
标签: python algorithm performance networkx computation