用Matlab程序分别绘制含有至少100个节点的WS、NW小世界网络模型,并给出具体程序代码,带每行注释。
Matlab版本:matlab R2022b
代码1:自己不用去创建函数体
% 设置节点数量为100
N = 100;
% 设置平均度数为4
K = 4;
% 设置小世界网络的重连概率为0.1
p = 0.1;
% 生成环形拓扑结构
s = zeros(N);%初始化邻接矩阵
for i=1:N
for j=1:K/2
s(i, mod(i+j-1, N)+1) = 1;%将节点i与其前j个节点连接
s(i, mod(i-j-1, N)+1) = 1;%将节点i与其后j个节点连接
end
end
% 随机重连部分边
for i=1:N
for j=i+1:N
if s(i,j) == 1 && rand < p
s(i,j) = 0;
s(j,i) = 0;
while true
new_j = randi(N);
if s(i,new_j) == 0 && new_j ~= i
s(i,new_j) = 1;
s(new_j,i) = 1;
break;
end
end
end
end
end%对于每对相邻节点,有概率p断开他们之间的边,并随机重连其中的一条边
% 将图形可视化
subplot(1,2,1);%在一个1行2列的图中,绘制左侧子图
gplot(s, [cos(2*pi*(1:N)/N); sin(2*pi*(1:N)/N)]');%绘制邻接矩阵对应的图形
title('WS小世界网络');%设置左侧子图标题
% 生成NW小世界网络
p = 1 - (1-p)^(1/(K-1));%计算NW小世界网络中每条边重连的概率
s_nw = zeros(N);%初始化NW小世界的邻接矩阵
for i=1:N
for j=1:K/2
s_nw(i, mod(i+j-1, N)+1) = 1;
s_nw(i, mod(i-j-1, N)+1) = 1;
end
end%生成环形拓扑结构
% 随机重连部分边
for i=1:N
for j=i+1:N
if s_nw(i,j) == 1 && rand < p
s_nw(i,j) = 0;
s_nw(j,i) = 0;
while true
new_j = randi(N);
if s_nw(i,new_j) == 0 && new_j ~= i
s_nw(i,new_j) = 1;
s_nw(new_j,i) = 1;
break;
end
end
end
end
end%对于每对相邻节点,有概率p断开它们之间的边,并随机重连其中的一条边
% 将图形可视化
subplot(1,2,2);%在一个1行2列的图中,绘制右侧子图。
gplot(s_nw, [cos(2*pi*(1:N)/N); sin(2*pi*(1:N)/N)]');%绘制邻接矩阵对应的图形
title('NW小世界网络');%设置右侧子图标题。
运行结果如下:
代码2:需要自己去创捷两个函数:WattsStrogatz函数和Smallw函数
1.创建WattsStrogatz函数代码如下:
function A = WattsStrogatz(N, K, beta)
% 生成具有Watts-Strogatz小世界性质的邻接矩阵
% 输入:N-节点数;K-每个节点相连的邻居数;beta-重连边的概率
% 输出:N×N的邻接矩阵A
% 生成环形图
A = zeros(N);
for i = 1:N
for j = 1:K/2
A(i, mod(i+j-1, N)+1) = 1;
A(mod(i+j-1, N)+1, i) = 1;
end
end
% 随机重连边
for i = 1:N
for j = 1:N
if A(i,j) == 1 && rand() < beta
% 找到不与i相邻的节点
idx = find(A(i,:)==0 & (1:N)~=i);
% 随机选择一个节点
newidx = idx(randi(length(idx)));
% 重连边
A(i,j) = 0;
A(j,i) = 0;
A(i,newidx) = 1;
A(newidx,i) = 1;
end
end
end
2. Smallw函数代码如下:
function A = Smallw(N, K, beta)
% 生成具有小世界性质的邻接矩阵
% 输入:N-节点数;K-每个节点相连的邻居数;beta-重连边的概率
% 输出:N×N的邻接矩阵A
% 生成环形图
A = zeros(N);
for i = 1:N
for j = 1:K/2
A(i, mod(i+j-1, N)+1) = 1;
A(mod(i+j-1, N)+1, i) = 1;
end
end
% 随机重连边
for i = 1:N
for j = 1:N
if A(i,j) == 1 && rand() < beta
% 找到不与i相邻的节点
idx = find(A(i,:)==0 & (1:N)~=i);
% 随机选择一个节点
newidx = idx(randi(length(idx)));
% 重连边
A(i,j) = 0;
A(j,i) = 0;
A(i,newidx) = 1;
A(newidx,i) = 1;
end
end
end
这两个函数必须与主程序在同一路径下
主程序代码如下:
% 设置节点数量为100
N = 100;
% 设置平均度数为4
K = 4;
% 设置小世界网络的重连概率为0.1
beta = 0.1;
% 生成wS小世界网络
ws = WattsStrogatz(N,K,beta);
% 生成N小世界网络
nw = Smallw(N,K,beta);
% 绘制wS小世界网络
subplot(1,2,1);%在一个1行2列的图中,绘制左侧子图
gplot(ws, [cos(2*pi*(1:N)/N); sin(2*pi*(1:N)/N)]');%绘制邻接矩阵对应的图形
title('WS小世界网络');%设置左侧子图标题
% 绘制N小世界网络
subplot(1,2,2);%在一个1行2列的图中,绘制右侧子图
gplot(nw, [cos(2*pi*(1:N)/N); sin(2*pi*(1:N)/N)]');%绘制邻接矩阵对应的图形
title('NW小世界网络');%设置右侧子图标题
运行结果如下: