% function [aver_D]=Aver_Path_Length(A)
% 1 阶配置模型中通过给定原始网络的度序列来构造零模型网络
%
% 2 阶配置模型通过给定原始网络中的联合度分布序列来构造零模型网络
%
% 3 阶配置模型更具体的给定了每个节点中边角的分布情况,即原始网络中的“线”和“角”序列来构造零模型网络
%% 求复杂网络中两节点的距离以及平均路径长度
%% 求解算法:首先利用Floyd算法求解出任意两节点的距离,再求距离的平均值得平均路径长度
% A————————网络图的邻接矩阵
% vertex_Num————————网络图的节点数
% D————————返回值:网络图的距离矩阵
% aver_D———————返回值:网络图的平均路径长度
% A= xlsread('data.xlsx');
% --------netplot(A);
A0= xlsread('data9.csv');
column=size(A0,2);
row=size(A0,1); %-------把原数据化为邻接矩阵
fprintf('原始数据column为 %2d\n',column);
fprintf('row为 %2d\n',row);
B = unique(A0);
n = length(B);
fprintf('不同节点个数为 %2d\n',n);
for i=1:n
for j=1:n
A(i,j)=0;
end
end
for i=1:row
m1=A0(i,1);
m2=A0(i,2);
m1=m1+1;
m2=m2+1;
A(m1,m2)=1;
A(m2,m1)=1;
end
%---------------------------------原始网络邻接矩阵转化为2阶0模型------------------------------------------------------------------
% 2阶置乱是在1阶置乱的基础上,增加约束条件:
% 要求断开的边u-v和新连的边u-y中v,y度相同
vertex_Num= size(A,1);
for i=1:200 %循环次数
[row, col] = find(A~= 0 ); % row,col是所有非零元素的横坐标和纵坐标
num = size(row,1); % 有多少个非零元素
t=randint(1,2,[1 num]); %选择2条边
if (A(row(t(1)),row(t(2)))==0)&&( A(col(t(1)),col(t(2)))==0&&sum(A(row(t(2)),:))==sum(A(col(t(2)),:)))
A(row(t(1)),col(t(2)))=1; %连接新边
A(row(t(2)),col(t(1)))=1;
A(col(t(2)),row(t(1)))=1; %连接新边
A(col(t(1)),row(t(2)))=1;
A(row(t(1)),col(t(1)))=0; % 断旧边
A(row(t(2)),col(t(2)))=0;
A(col(t(1)),row(t(1)))=0; % 断旧边
A(col(t(2)),row(t(2)))=0;
else
;
end
% m=randint(1,1,[1 vertex_Num]);
% n=randint(1,1,[1 vertex_Num]);
% u=randint(1,1,[1 vertex_Num]);
% v=randint(1,1,[1 vertex_Num]);
% if (m~=n)&&(A(m,n)==1)&&(u~=v)&&(A(u,v)==0)) %----------判断条件
% % A(m,n)==0;
% % A(n,m)==0;
% A(u,v)==1; %------断旧边连新边
% A(v,u)==1;
%
% else
% ;
% end
end
ND_netplot(A);
% fprintf('%2d\n', randint(1,2,[1 vertex_Num]));
%--------------读取文件名称-----
fprintf('2阶零模型网络:\n');
fprintf('(1)节点数为%2d\n',vertex_Num);
% ------------------------ 边数计算-------------
edge_Num= sum(sum(A))/2;
fprintf('(2)边数为 %2d\n',edge_Num);
% ------------------------平均度计算--------------------
degree_Av= sum(sum(A))/vertex_Num;
fprintf('(3)平均度为 %2f\n',degree_Av);
% ------------------------度分布计算--------------------
N=size(A,2);%------size(A,2)表示取矩阵A的列数
DeD=zeros(1,N); %------产生一个1行N列的0矩阵
for i=1:N
% DeD(i)=length(find((A(i,:)==1)));
DeD(i)=sum(A(i,:));
end
fprintf('(4)度序列为');
fprintf('%3d',DeD);
fprintf('\n');
YF=zeros(N,1);
for i=1:N
YF(i)=sum(A(i,:));
end
YF1=max(YF);
A2=zeros(1,YF1);
for r=1:vertex_Num
for m=1:YF1
if DeD(r)==m
A2(m)=A2(m)+1;
end
end
end
fprintf('[');
fprintf('%4d',A2);
fprintf(']\n');
aver_DeD=mean(DeD);
if sum(DeD)==0
disp('该网络图只是由一些孤立点组成');
return;
else
figure;
bar([1:N],DeD);
xlabel('节点编号n');
ylabel('各节点的度数K');
title('网络图中各节点的度的大小分布图');
end
figure;
M=max(DeD);
for i=1:M+1; %网络图中节点的度数最大为M,但要同时考虑到度为0的节点的存在性
N_DeD02(i)=length(find(DeD==i-1));
end
P_DeD02=zeros(1,M+1);
P_DeD02(:)=N_DeD02(:)./sum(N_DeD02);
bar([0:M],P_DeD02,'r');
xlabel('节点的度 K');
ylabel('节点度为K的概率 P(K)');
title('网络图中节点度的概率分布图');
%-------------余平均度和余度分布-------------------------
sum_Y=0;
YUdu=zeros(1,N);
for i=1:N
for j=1:N
if A(i,j)==1
sum_Y = sum_Y+sum(A(j,:));
else
;
end
end
YUdu(i)= sum_Y/sum(A(i,:));
sum_Y=0;
end
YUdu_Av=sum(YUdu)/vertex_Num;
% fprintf('(5)余度分布为');
% fprintf('%3d',YUdu);
% fprintf('\n');%
% for r=1:vertex_Num
% for m=1:YF1 %---度的范围
% if DeD(r)==m
fprintf('(5)余平均度为:');
fprintf('%10d \n',YUdu_Av);
%------------余度分布-------------
YF=zeros(N,1);
for i=1:N
YF(i)=sum(A(i,:));
end
YF1=max(YF);
% -------fprintf('最大值为%2d\n', YF1);
sum_Y=0;
A1=zeros(1,YF1);
for i=1:N
for j=1:N
if A(i,j)==1
sum_Y = sum(A(j,:));
for k=1:YF1
if sum_Y==k
A1(k)=A1(k)+1;
end
end
end
end
end
fprintf('(6)余度分布见图\n');
% fprintf('余度序列为');
% fprintf('%2d', A1);
figure;
for i=1:YF1+1; %网络图中节点的度数最大为M,但要同时考虑到度为0的节点的存在性
N_A1(i)=length(find(A1==i-1));
end
P_A1=zeros(1,YF1);
P_A1(:)=A1(:)./sum(A1);
bar([1:YF1],P_A1,'r');
xlabel('任选一节点其邻居节点度为K');
ylabel('任选一节点其邻居节点度为K的概率 Pn(K)');
title('网络图中的余度分布图');
% plot([1:YF1],P_A1,'.');
%-------------平均路径长度----------------------------
N=size(A,2);
D=A;
D(find(D==0))=inf; %将邻接矩阵变为邻接距离矩阵,两点无边相连时赋值为inf,自身到自身的距离为0.
for i=1:N
D(i,i)=0;
end
for k=1:N %Floyd算法求解任意两点的最短距离
for i=1:N
for j=1:N
if D(i,j)>D(i,k)+D(k,j)
D(i,j)=D(i,k)+D(k,j);
end
end
end
end
aver_D=sum(sum(D))/(N*(N-1)); %平均路径长度
fprintf('(7)平均路径长度%2f\n',aver_D);
if aver_D==inf
disp('该网络图不是连通图');
end
%A————————网络图的邻接矩阵--------------------------------------------------------
%C————————网络图各节点的聚类系数
%aver———————整个网络图的聚类系数
N=size(A,2);
C=zeros(1,N);
for i=1:N
aa=find(A(i,:)==1); %寻找子图的邻居节点
if isempty(aa)
disp(['节点',int2str(i),'为孤立节点,其聚类系数赋值为0']);
C(i)=0;
else
m=length(aa);
if m==1
disp(['节点',int2str(i),'只有一个邻居节点,其聚类系数赋值为0']);
C(i)=0;
else
B=A(aa,aa); % 抽取子图的邻接矩阵
C(i)=length(find(B==1))/(m*(m-1));
end
end
end
aver_C=mean(C);
fprintf('(8)整个网络的聚类系数为%2f\n',aver_C);
fprintf('**************************上面是2阶零模型****************************\n\n');