disp('该程序生成WS小世界网路:');
N=input('请输入最近邻耦合网络中节点的总数N:');
K=input('请输入最近邻耦合网络中每个节点的邻居节点的个数的一半K:');
p=input('请输入随机化重连的概率p:');
if K>floor(N/2)
disp('输入的K值不合法')
return;
end
%%生成最近邻耦合网络的各节点坐标
angle=0:2*pi/N:2*pi-2*pi/N;
x=100*sin(angle);
y=100*cos(angle);
plot(x,y,'ro','MarkerEdgeColor','g','MarkerFaceColor','r','markersize',8);
hold on;
%%生成最近邻耦合网络的邻接矩阵
A=zeros(N);
for i=1:N
for j=i+1:i+K
jj=j;
if j>N
jj=mod(j,N);
end
A(i,jj)=1; A(jj,i)=1;
end
end
for i=1:N
for j=i+1:i+K
jj=j;
if j>N
jj=mod(j,N);
end
p1=rand(1,1);
if p1<p %% 生成的随机数小于p,则边进行随机化重连,否则,边不进行重连
A(i,jj)=0;A(jj,i)=0; %重连策略:先断开原来的边,再在未连的边中随机选择另一个节点,与原节点连接。
A(i,i)=inf; a=find(A(i,:)==0);
rand_data=randint(1,1,[1,length(a)]);
jjj=a(rand_data);
A(i,jjj)=1;A(jjj,i)=1;
A(i,i)=0;
end
end
end
%% 画出WS小世界网络图连接线
for i=1:N
for j=i+1:N
if A(i,j)~=0
plot([x(i),x(j)],[y(i),y(j)],'linewidth',1.2);
hold on;
end
end
end
axis equal;
hold off
%% 以下程序是为了画各节点的节点度的图以及节点度的概率
N=size(A,2); %返回A邻接矩阵的列数,即节点个数
DeD=zeros(1,N);
for i=1:N
% DeD(i)=length(find((A(i,:)==1)));
DeD(i)=sum(A(i,:)); %求各节点的节点度
end
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_DeD(i)=length(find(DeD==i-1));
end
P_DeD=zeros(1,M+1);
P_DeD(:)=N_DeD(:)./sum(N_DeD);
bar([0:M],P_DeD,'r');
xlabel('节点的度 K');
ylabel('节点度为K的概率 P(K)');
title('网络图中节点度的概率分布图');
%% 求网络图中各节点的聚类系数及整个网络的聚类系数
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);
%% 求复杂网络中两节点的距离以及平均路径长度
%% 求解算法:首先利用Floyd算法求解出任意两节点的距离,再求距离的平均值得平均路径长度
% A————————网络图的邻接矩阵
% D————————返回值:网络图的距离矩阵
% aver_D———————返回值:网络图的平均路径长度
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)); %平均路径长度
if aver_D==inf
disp('该网络图不是连通图');
end
%% 输出该网络的特征参数
disp(['该随机图的平均路径长度为:',num2str(aver_D)]);
disp(['该随机图的聚类系数为:',num2str(aver_C)]);
disp(['该随机图的平均度为:',num2str(aver_DeD)]);
评论0