无标度网络级联失效(基于载荷容量模型).zip

  • Blessedhy
    了解作者
  • matlab
    开发工具
  • 2.5KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 2
    下载次数
  • 2022-03-22 21:33
    上传日期
代码完成了BA网络的负载、容量级联失效,并计算了鲁棒性
无标度网络级联失效(基于载荷容量模型).zip
  • cascade.m
    5.4KB
内容介绍
clear all % result = xlsread('result.xls','B2:BX76'); %β beta = 0.5 可调参数 控制节点初始负载 %α alpha=0.3 负载参数 刻画节点应对额外负载以及抵制干扰的能力 %γ gamma=1.5 为过载参数。该参数的值体现了网络主体成员节点的移除弹性, 也从很大程度决定了系统对过载节点的保护程度 %% 随机生成网络 m0 = 5;%未增长前的网络节点个数m0 mmm = 1;%每次引入的新节点时新生成的边数mmm LL = 100;%网络规模 ppp = 2;%初始网络的链接方式选择,初始网络m0个节点的连接选择:1节点均孤立;2,节点间构成完全图(任何两点都有连接);3随机连接一些边' switch ppp case 1 A=zeros(m0); case 2 A=ones(m0); for i=1:m0 A(i,i)=0; end case 3 for i=1:m0 for j=i+1:m0 p1=rand(1,1); if p1>0.5 A(i,j)=1;A(j,i)=1; else A(i,j)=0;A(j,i)=0; end end end otherwise disp('输入的参数pp不合法'); return; end for k=m0+1:LL M=size(A,1);p=zeros(1,M); if isempty(find(A==1, 1))%用于算节点i的被连接概率 p(:)=1/M; else idx = (A == 1); p0 = sum(idx, 2); temp = sum(p0); p = p0 ./ temp; end pp=cumsum(p);%用轮盘赌的方法来实现度越大的节点越可能与新的节点产生连线 for i=1:mmm random_data=rand(1,1); aa=find(pp>=random_data); a=aa(1); jj(i,:)=a; while length(find(a==jj))>1%这个while是为了避免出现重连边的情况(不是这里的问题) random_data=rand(1,1); aa=find(pp>=random_data); a=aa(1); jj(i,:)=a; end A(k,a)=1;%每次引入新的点时,生成的新边 A(a,k)=1; end end %------------------------------------------------------------------------ %% 开始基于级联失效计算鲁棒性 if isempty(find(A==1, 1))%用于算节点i的被连接概率 p(:)=1/M; else idx = (A == 1); p0 = sum(idx, 2); temp = sum(p0); p = p0 ./ temp; end subplot(1,2,1) plot(p0) net = A; % del = 46; alpha=0.3; beta = 0.5; for i = 1:length(net) [node M R] = main(net,i,alpha,beta); RR(i) = R; end subplot(1,2,2) plot(RR) %% function [node M R] = main(net,del,alpha,beta) % 实现给节点设定初始载荷、节点容量。并调用其他函数实现级联失效过程。 % 输出 % node 为剩余节点的编号 % R 借助网络面积评估节点重要度 %系统内某节点失效将被从网络中删除,可能在级联效应下导致其它节点的删除,这些节点称为崩溃节点,剩余有效节点的总数被称为网络面积。 %输入 net为初始邻接矩阵 del为待删除的节点编号 %β beta = 0.5 可调参数 控制节点初始负载 %α alpha=0.3 负载参数 刻画节点应对额外负载以及抵制干扰的能力 %γ gamma=1.5 为过载参数。该参数的值体现了网络主体成员节点的移除弹性, 也从很大程度决定了系统对过载节点的保护程度 %% step1:对初始网络的每个节点计算负载 %首先计算每个节点自己的度 为行矩阵 K=sum(net); %因为邻接矩阵为对称矩阵,所以可以直接sum 求每一列的和 %计算每个节点的负载 for i=1:length(net) L(i)=power(K(i)*(K*net(i,:)'),beta); end %根据负载矩阵L,整体计算每个节点的超载能力 行矩阵 C=(1+alpha)*L; %% step2:节点i崩溃后,它的负载会分配给其邻居节点,分配给邻居节点j的额外负载与其节点的初始负载成正比, %计算每个节点额外分配矩阵 addL=zeros(1,length(L)); %额外分配矩阵 node=1:length(net); %为节点一次编号 %% 触发评价函数 %传入 net初始网络(这个时候还没删除任何节点) %del 为待删除的节点编号 L为Step1的负载矩阵 C为Step2的超载矩阵 node为节点编号 [Nnet del NL NC NaddL node]=assess(net,del,L,C,addL,node);%node为剩余的节点 M=1-sum(sum(Nnet))/(sum(K)); R=length(Nnet)/length(net); end function [net del L C addL node] = assess(net,del,L,C,addL,node) %输入 %传入 net初始网络(这个时候还没删除任何节点) %del 为待删除的节点编号 L为Step1的负载矩阵 C为Step2的超载矩阵 node为节点编号 %输出 % Nnet为级联之后的新网络 del为Step3中记录被删除的节点 NL为新的负载矩阵 NC为新的超载矩阵 NaddL为新的额外分配矩阵 % node为剩余编号 if length(net)==length(del) %如果初始网络的长度=要删掉的长度,表明全部删掉 net=[];del=[];L=[];C=[];addL=[];node=[]; %则全置为空 else if length(del)==0 %如果要删掉长度为0,则表明不删任何节点 net=net;del=del;L=L;C=C;addL=addL;node=node; %则全部矩阵保留 else gamma=1; %% Step2 %第一次删元素 % net(del,del)=0; %将当前被删除的节点位置在邻接矩阵中置为0 %-----------将故障后的节点载荷分配到邻近节点------------------------ for i=1:length(del); %遍历待删节点 num=del(i); %在del中获取数值 ind=find(net(num,:));%ind是故障节点num的邻居节点集合 for j=1:length(ind) % 计算每个邻居节点应有的额外分配负载 addL(ind(j)) = addL(ind(j)) + L(ind(j))*L(num)/(L*net(num,:)');%这里可以变 end end %------------------------------------------------------------ net(del,:)=[];net(:,del)=[]; %在原矩阵中删除故障节点所在的行列 addL(del)=[]; %分配矩阵中也删除 这个点的位置 node(del)=[]; L(del)=[]; C(del)=[]; %节点编号、负载矩阵、超负载矩阵,删除这个节点的位置 %% step 3 节点超负载删除判断 flag=(L+addL)-gamma*C; L = L + addL; addL=zeros(1,length(addL)); %更新节点负载矩阵和额外分配矩阵 Del=find(flag>=0);%flag中大于0的说明需要被删掉 del=Del; [net del L C addL node] = assess(net,del,L,C,addL,node); %然后再次递归调用 end end end
评论
    相关推荐