1. 程式人生 > >學習記錄 複雜網路模型的matlab實現

學習記錄 複雜網路模型的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);

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)); % 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)