一.上机要求
用Matlab编程实现相关网络参数的计算,输出相关信息:
- 度分布和平均度。
- 联合度分布。
- 各节点的最近邻平均度值Knni。
- 该网络是否同配网络。
- 该网络是否是正相关网络。
- 计算该网络的网络直径D和平均路径长度L。
二.算法设计及实现
命令行:
clc,clear;format rat
n=6;a=zeros(6);
a(1,[2 3 5])=1;a(2,[3 4])=1;
a(3,6)=1;a(4,6)=1;
a=a+a';
d=sum(a); %计算邻接矩阵的列和,即各节点的度
degrange=minmax(d); %求度取值的最小值和最大值
ud=[degrange(1):degrange(2)] %显示度的取值
pinshu=hist(d,ud); %求度取值的频数
df=[ud:pinshu/n] %求度的频率分布表
ave_degree=mean(d) %平均度
M=sum(d)/2; %计算总边数,边数为总度数的1/2
[i,j]=find(triu(a)); %找矩阵a上三角元素中非零元素所在的行标和列标,即每条边的端点
ki=d(i);kj=d(j); %提取所有边的起点度和终点度
kij=[ki' kj'];kij=sort(kij,2); %逐行从小到大排列
bpin=[]; %联合度分布初始化
for i=1:length(ud)
for j=i:degrange(2)
b(i,j)=0;kk=[];
for k=1:size(kij,1)
b(i,j)=b(i,j)+length(findstr(kij(k,:),[i,j]));
if length(findstr(kij(k,:),[i,j]))
kk=[kk,k]; %记录找到的数据
end
end
kij(kk,:)=[]; %删除已找到的数据
bpin=[bpin,[i;j;b(i,j)/M]];
end
end
bpin %显示联合度分布,第1,2行为度值,第3行为频率
knni=d*a./d %计算邻近平均值
for i=1:length(ud)
ind=(d==ud(i));
knn(i)=sum(knni(ind))/pinshu(i);
end
knn=[ud;knn] %显示邻近平均值
r=mycorrelations(a) %计算相关系数
[D,max_D,aver_D]=Aver_Path_Length(a); %计算网络直径和网络平均距离
函数1:求相关系数
输出参数r为相关系数,输入a为邻接矩阵。
function r=mycorrelations(a)
d=sum(a); %计算每个结点的度
M=sum(d)/2; %计算总边数,边数为总度数的一半
[i,j]=find(triu(a)); %找a矩阵上三角元素中非零元素所在的行标和列标,即每条边的两个端点
ki=d(i);kj=d(j); %提取所有边的起点度和终点度
r=(ki*kj'/M-(sum(ki+kj)/2/M)^2)/(sum(ki.^2+kj.^2)/2/M-(sum(ki+kj)/2/M)^2);
end
函数2:求网络直径和平均路径长度
输出max_D为网络直径,aver_D为平均路径长度。输入a为邻接矩阵。sss
function [D,max_D,aver_D]=Aver_Path_Length(A)
N=size(A,1); %求矩阵A的列数(结点数)
D=A;
D(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
max_D=max(max(D));
disp("网络直径为:");
disp(max_D);
aver_D=sum(sum(D))/(N*(N-1)); %平均路径长度
disp("平均路径长度为:");
disp(aver_D);
if aver_D==inf
disp("该网络图不是连通图.");
end
三. 运行结果
可见,随着k的增加,knn下降,该网络为异配网络,r<0,该网络为负相关网络。
网络直径为3,即任意两个节点之间距离最大值为3。平均路径长度为5/3。
相关系数的表达式为: