在分析复杂网络的级联效应时,往往会用到一些定量评估方法,目前网络有较多分析网络级联故障的文章和资源,但很少展示了代码,摸索了一下,将代码分享给大家。若有疑问的地方,请大家自行摸索完善。
import networkx as nx
import random
import matplotlib.pyplot as plt
# 创建一个有向加权网络,这里以随机图为例
num_nodes = 100
probability = 0.1
G = nx.erdos_renyi_graph(num_nodes, probability, directed=True)
# 添加边的权重(这里简化为随机赋予一个权重值)
for u, v in G.edges():
G[u][v]['weight'] = random.uniform(0.1, 1.0)
# 获取节点的中心度(这里使用度中心度作为示例,您可以根据需要选择其他中心度指标)
centrality = nx.degree_centrality(G)
# 对中心度进行排序,获得按中心度从高到低的节点列表
sorted_nodes = sorted(centrality, key=centrality.get, reverse=True)
# 定义故障传播规则,这里简化为移除节点及其相邻边
def cascade_failure(graph, failed_nodes):
for node in failed_nodes:
graph.remove_node(node)
# 进行级联失效模拟
def cascade_simulation(graph, seed_nodes):
failed_nodes = seed_nodes.copy()
while True:
new_failed_nodes = []
for node in failed_nodes:
if node in graph:
neighbors = list(graph.neighbors(node))
new_failed_nodes.extend(neighbors)
new_failed_nodes = list(set(new_failed_nodes))
if not new_failed_nodes:
break
cascade_failure(graph, new_failed_nodes)
failed_nodes = new_failed_nodes.copy()
return len(graph.nodes())
# 运行多次级联失效模拟,记录每次模拟后剩余节点数
num_simulations = 100
remaining_nodes_list = []
for i in range(1, num_nodes + 1):
# 取前 i 个中心度最高的节点作为初始故障点
initial_failure_nodes = sorted_nodes[:i]
H = G.copy()
remaining_nodes = cascade_simulation(H, initial_failure_nodes)
remaining_nodes_list.append(remaining_nodes)
# 绘制曲线
plt.figure(figsize=(10, 6))
plt.plot(range(1, num_nodes + 1), remaining_nodes_list, marker='o', linestyle='-', color='b')
plt.xlabel('Number of Attacked Nodes')
plt.ylabel('Remaining Nodes')
plt.title('Cascade Failure Analysis')
plt.grid(True)
plt.show()
分析结果如图所示