PDA

查看完整版本 : [MATLAB基础] 怎么把那个负载超出的节点放回循环进行失效


hypeen
2020-03-22, 16:26
%%级联失效
A=load('szdt.mat')
A=A.sz;
B=betweenness_node(A);
[m n]=sort(B,'descend'); %p 就是将B进行由大到小排序,n就是排序后的位置变化
%比如A=[8 9 3],p=[9 8 3],n=[2 1 3]
d1=[];
n=n(1:10);%B中按大小排在前10的位置,n就是节点编号

N=size(n,2);
%%参数
aerfa=0.1;%容量可调系数
P1=[];%用来装可以进行负载分配的相邻节点
P2=[];%用来装失效节点
averD=[];
%%进行失效
j=1;
while j<=N
G=graph(A);%为下一步运用neighbors函数做基础
P=neighbors(G,n(j));%找与其相邻的节点
P=P';
s=size(P,2);%看p有多少列
A(n(j),:)=0;%把第n行全部元素变成0
A(:,n(j))=0;%把第n列全部元素变成0
P2(end+1)=n(j);
c=1;
while c<=s
D=Degree(A);
if D(P(c))==0%判断相邻节点是否为孤立点
P2(end+1)=P(c);
else
P1(end+1)=P(c);
end
c=c+1;
end%得到P1,P2
s1=size(P1,2);%有多少个要进行负载分配的节点
e=1;
while e<=s1
f=B(P1(e))+B(n(j))*(B(P1(e))/sum(P));%更新负载矩阵,邻接节点的负载等于它本身加上失效节点按比例分配给它的
if f>(1+aerfa)*B(P1(e))如果大于负载,将该点进行失效

end
B(n(j))=0;
e=e+1;
end
for i=1:N
D(i)=sum(A(i,:)==1);
end%计算度大小
averD(end+1)=mean(D);
j=j+1;

end
%%算最后得到的矩阵A中度为0的节点位置

d=Degree(A);
s3=size(A,2);
for k=1:s3
if d(k)==0
d1(end+1)=k;
end
end

%%输出结果
P1
P2
d1
n
x=1:N;
y=averD;
plot(x,y)
hold on