學習記錄 複雜網路模型的matlab實現
function [DeD,aver_DeD]=Degree_Distribution(A)
%% 求網路圖中各節點的度及度的分佈曲線
%% 求解演算法:求解每個節點的度,再按發生頻率即為概率,求P(k)
%A————————網路圖的鄰接矩陣
%DeD————————網路圖各節點的度分佈
%aver_DeD———————網路圖的平均度
N=size(A,2);
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);
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)); % DeD=[2 2 2 2 2 2]
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('網路圖中節點度的概率分佈圖');
平均路徑長度
function [D,aver_D]=Aver_Path_Length(A)
%% 求複雜網路中兩節點的距離以及平均路徑長度
%% 求解演算法:首先利用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
%% 演算法2: 用時間量級O(MN)的廣度優先演算法求解一個含N個節點和M條邊的網路圖的平均路徑長度
聚類係數
function [C,aver_C]=Clustering_Coefficient(A)
%% 求網路圖中各節點的聚類係數及整個網路的聚類係數
%% 求解演算法:求解每個節點的聚類係數,找某節點的所有鄰居,這些鄰居節點構成一個子圖
%% 從A中抽出該子圖的鄰接矩陣,計運算元圖的邊數,再根據聚類係數的定義,即可算出該節點的聚類係數
%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)