📄 smallworld.m
字号:
clear
clc
N=20; %vertex of the network
p=0.3; %the probability of link
k=2; %%%% k<<N
%%%%%%%%%%%%%%%%生成一个NW小世界网络%%%%%%%%%%%%%%%%%%%%
a=rand(N);
for i=1:N
for j=i-k:i+k
if j<=0
a(i,j+N)=1;
elseif j>N
a(i,j-N)=1;
else
a(i,j)=1;
end
end
a(i,i)=0;
end
%%%%%%%%%%%%%%
for i=1:N
for j=1:N
if a(i,j)<p
a(i,j)=1;
else
a(i,j)=0;
end
end
end
for i=1:N
for j=i:N
if a(i,j)~=a(j,i)
a(j,i)=a(i,j);
end
end
end
for i=1:N
a(i,i)=0;
end
s=sum(a);
for i=1:N
a(i,i)=-s(i);
end
%%%%%%%%%%%%%%%%结束生成一个NW小世界网络%%%%%%%%%%%%%%%%
clc
%%%%%%%%%%%%%%%%生成一个SW小世界网络%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%% A 代表连接矩阵 %%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%% S 代表稀疏化表的矩阵A 可节省内存 %%%%%%%%%%%%%%%%%%%
N=100; %vertex of the network
p=0.2; %the probability of link
k=10; %%%% k<<N 最近邻 一维网络每个节点分别与两侧的k个节点相接。
q=1/(N-1-2*k); % 需要进行重新连接时的选取概率
A=zeros(N);%%% 生一N×N的0矩阵。
for i=1:N
for j=i-k:i+k
if j<=0
A(i,j+N)=1;
elseif j>N
A(i,j-N)=1;
else
A(i,j)=1;
end
end
A(i,i)=0;
end
%%%%%%%%%%%%%%生成一个最近邻的一维耦合网络矩阵,对角线元素为0,存在连接则为1,其余0。
%%%%%%%%%%%%%%%%%% 开始以概p随机改写下三角阵的边
t1=0;t2=0;t3=0;%% t1统计随机选取边重连成功次数 t2随机重连不成功时强制选取的次数 t3 需要进行重新连接的次数
for i=2:N
r=1;
for j=1:i-1
if A(i,j)==1 %% 找到一个元素"1"
m=rand(1);
if m>1-p
r=0; %% 以一定的概率 p 重新连接
t3=t3+1;
%%%%%
for w=1:5
for l=1:N
if A(i,l)==0 & r==0 & l~=i
n=rand(1);
if n>1-q
A(i,l)=1;
A(l,i)=1;
r=2;
t1=t1+1;%% 保证每重新连接只有一个0被置为1
A(i,j)=0;
A(j,i)=0; break
end
end
end
end
%%%% 在对角线元素外的其余0 元素中随机选取一个 置为1 。
%%%%
if r==0
for l=N:-1:1
if A(i,l)==0 & r==0 & l~=i
A(i,l)=1;
r=3;
t2=t2+1;
A(l,i)=1;
A(i,j)=0;
A(j,i)=0;
end
end
end
%%%%% 当上述随机选取方法失败,不能找一个0 元素时,用该行最后一元素设为0 。保重连成功
end
end
end
end
%%%%%%%%%%%%%%%%%% 结束以概p随机改写下三角阵的边
%%%%%%%%%%%% 保证A为对称矩阵
for i=1:N
for j=i:N
A(i,j)=A(j,i);
end
end
%%%%%%%%%%%%% 上三角与下三角元素对称化。
s=sum(A);
for i=1:N
A(i,i)=-s(i);
end
%%%%% 重置对角线元素,为度的相反数。
t1;
t2;
t3; %%% t3=t1+t2 且 t2越小越好
%%%%%%%%%%%%%%%%结束生成一个SW小世界网络%%%%%%%%%%%%%%%%
S=sparse(A);
%%%%%%%%%%%% 用稀疏矩阵表A,减少内存使用。
%%%%%%%%%%%%%%%%% 生成一个N个节点连接概率p的随机图网络.
A=rand(N);
for i=1:N
for j=i:N
if A(i,j)<p
A(i,j)=1;
else
A(i,j)=0;
end
end
end
for i=1:N
for j=i:N
A(j,i)=A(i,j);
end
A(i,i)=0;
end
d=sum(A); %%%% d 为节点的度, d(i)为节点i的度 %%
for i=1:N
A(i,i)=-d(i);
end
%%%%%%%%%%%%%%%%%结束 生成一个N个节点连接概率p的随机图网络.
% %%%%%%%%%%%%%%%%% 计算节点的度分布 %%%%%%%%%%%%
for j=1:N
k(j)=0;
for i=1:N
if j==d(i)
k(j)=k(j)+1;
end
end
P(j)=k(j)/N;
end
for i=1:N
k(i)=i;
end
plot(k,P,'-*'); %%%%用对数坐标画出度分布图%%%%%%%%%%
% %%%%%%%%%%%%%%%%% 结束计算节点的度分布 %%%%%%%%%%%%%%%%%
%
%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -