一、渗流理论
为了量化这个相变的性质,专注于三个量:
簇的规模的平均值:
根据渗流理论,全体有限规模的簇的规模的平均值遵循:
换句话说,在接近 时,簇的规模的平均值是发散的。
序参量:
随机选择一个石子,序参量是这个石子属于最大簇的概率,它遵循:
因此,当p逐渐减小到时,一个石子属于最大簇的概率降为零。
关联长度:
属于同一簇的两颗石子之间的平均距离,它遵循:
总结,随机移除节点对网络造成的破坏并不是一个渐进的过程。相反,移除一小部分节点对网络完整性的影响非常有限。但一旦被移除节点的比例达到一个临界阙值,网络就会迅速地分解为不相连的连通分支。
二、经典方法
初始网络的最大度(HD):
网络的鲁棒性:也称健壮性,是指网络在受到外界攻击的情况下,是否能够保持其功能的正常运转,如果能,就称网络是鲁棒的。复杂系统的鲁棒性是许多领域的一个重要问题。
当前网络的最大度(HDA):
当前网络的最大介数(HBA):
网络的k-核(k-core):
设置一个阈值ks = 1,把网络中所有度小于等于1 的节点全部删除。
集体影响度量(CI):
三、编程实践
# 蓄意攻击:
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
plt.rc('font', family='SimHei')
# 创建一个1000个节点的无标度网络
n, m = 1000, 3
G = nx.barabasi_albert_graph(n, m)
# 计算原始网络的巨连通分支大小
largest_cc = max(nx.connected_components(G), key=len)
initial_size = len(largest_cc) / n
# 静态攻击:始终在初始网络上攻击,按照节点度值大小将占比为f的节点移除,并计算剩余网络的巨连通分支相对大小
# 获取初始网络节点度值排序后的列表
degrees = dict(G.degree())
sorted_degrees = sorted(degrees.items(), key=lambda x: x[1], reverse=True)
nums = 51
f_values = np.linspace(0, 1, num=nums)
relative_sizes = np.zeros(nums)
relative_sizes[0] = initial_size
for i in range(1, nums):
# 计算要移除的节点列表
num_removed = int(f_values[i] * n)
removed_nodes = [x[0] for x in sorted_degrees[:num_removed]]
# 移除节点并计算剩余网络的巨连通分支大小
G_removed = G.copy()
G_removed.remove_nodes_from(removed_nodes)
if len(G_removed)==0:
break
largest_cc_removed = max(nx.connected_components(G_removed), key=len)
relative_sizes[i] = len(largest_cc_removed) / n
# 绘制相对大小随着占比f的变化图
plt.plot(f_values, relative_sizes, 'ro-', linewidth=2)
plt.xlabel('占比 f')
plt.ylabel('巨连通分支相对大小')
plt.title('蓄意攻击')
plt.show()