级联失效的定义如下:网络中,一个或少数几个节点或连线的失效会通过节点之间的耦合关系引发其他节点也发生失效,进而产生级联效应,最终导致相当一部分节点甚至整个网络的崩溃,这种现象就称为级联失效,有时也形象称之为“ 雪崩”。
级联失效的原理并不难懂,但是实现起来并不简单,也曾在网上寻找过代码,可以几无所得。有的实现代码确实有点复杂,但我觉得从逻辑上来讲,应该是不难的。
负载-容量模型是应用最为广泛的级联失效模型。该模型主要有三个部分组成,初始负载定义、节点容量设置、负载重分配策略。
一个简单的负荷容量模型流程图可如下图所示:
流程图
重分配策略一般是创新点集中存在的地方,因为这块可以做文章的地方比较多,我理解重这部分可以分三块:策略,节点状态和分配负载的比例。
策略:常见的负载重分配策略有随机分配,按某指标进行分配,剩余负载重分配等等。
节点状态:最简单的就是两种:正常和失效。所以有研究者又设置了一种叫做 过载 的状态,顾名思义就是介于正常和失效的中间状态。
分配负载的比例:最简单的就是当节点失效的时候,失效节点上的所有负载都参与重分配。那么如果有过载这个节点状态呢?那么此时就不是所有的负载都会被分配。
💥 级联失效动态演示
下图是失效过程的动态模拟,红色节点表示在各阶段中失效的节点,示例网络是100节点的侧视图。
根据实际攻击结果的动态图
🎯 模拟前后网络对比
对比图
上面的理论说的差不多,具体从哪里开始创新还是要靠个人自己的研究,本文从代码层面帮助大家实现一个最基础的级联失效模型,希望可以帮助到大家。
下面的示例代码:初始负载为度,节点容量设置为线性模型设置,负载重分配策略为按照度分配。
其中初始负载L0 定义和节点容量C 设置,这两部分相对比较简单:
1 | L0 = sum(A); |
%% 重分配
pre_attack_list = [1];
% 初始节点状态 一开始都是正常所以都是0, 失效为1
status_list = zeros([1 node_num]);
% 失效节点列表
node_index_list{1,1} = pre_attack_list;
% 当前失效的列表
failure_list = node_index_list{1,1};
status_list(node_index_list{1,1}) = 1;
% 存储每个阶段的失效列表
failure_cell{1,1} = node_index_list{1,1};
% 1.从node_index_list拿出此次失效的节点
% 2.计算出相邻节点开始分配
for i = 1:length(indexs)
% 开始分配
f1(i) = Load_redistribution(indexs(i),indexs, L0, status_list(node_index(j)));
L( indexs(i) ) = L0( indexs(i) ) + f1(i)* L0( node_index(j));
% 3. 更新节点状态
% 4. 更新失效列表
if status_list(indexs(i)) == 1
failure_list = [failure_list indexs(i)];
end
end
% 5. 根据失效列表求得当前网络的指标
A(failure_list,:) = 0;
A(:,failure_list) = 0;
AA = A;
% 记载失效集合
failure_cell{1,k+1} = failure_list;
node_index_list{1,k+1} = setdiff(failure_cell{1,k+1}, failure_cell{1,k});
% 判断级联失效是否停止
all_the_indexs = figure_NetEff( AA ,node_num);
NetEff = all_the_indexs.Eglob;
Max_sub_num = all_the_indexs.Max_sub_num;
实现算法不易,本文仅放置了部分代码,若想获取完整代码或者与我交流,可关注:公众号【三紫智造局】,或直接访问下方内测入口也可以。后续会一直更新相关复杂网络算法和内容,欢迎关注。
放在最后:
我们最近正在开发一个复杂网络平台,参与内测后续上线会赠送免费计算次数
平台入口(内测中)
www.threepurple.cn/
并且我准备建立一个复杂网络交流群,想进群可以联系我。