复杂网络的级联失效模拟

在分析复杂网络的级联效应时,往往会用到一些定量评估方法,目前网络有较多分析网络级联故障的文章和资源,但很少展示了代码,摸索了一下,将代码分享给大家。若有疑问的地方,请大家自行摸索完善。

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()

分析结果如图所示

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值