Python:如何计算网络鲁棒性的快速度量?

标签 python algorithm performance networkx computation

我正在使用常规 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

最佳答案

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

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

关于Python:如何计算网络鲁棒性的快速度量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35888160/

相关文章:

python - SQLAlchemy 和通行证库

python - 在写入命令中保留颜色

algorithm - 澄清 Sedgewick "Algorithms"heapsort chapter remark(第 4 版,第 2.4 章)

python - 矩阵求逆 (3,3) python - 硬编码与 numpy.linalg.inv

data-structures - 随机化数组的有效方法 - Shuffle 代码

python - 使用 Python 进行 Web 编程有什么好处?

Python 属性更改监听器模式

java - 如何将文本图像(计算机输入)转换为 java 中的字符串

algorithm - 寻找中位数

c# - 如何使用列表对象中 3 个属性的搜索条件加快 List<> 上的此 linq 查询