BA網路matlab代碼及度分布可視化1
%%% 從已有的m0個節點的網路開始,採用增長機制與優先連接的機制生成BA無標度網路
%% A ——————返回生成網路的鄰接矩陣
m0=input(未增長前的網路節點個數m0: );
m=input( 每次引入的新節點時新生成的邊數m: );
N=input(增長後的網路規模N: );
disp(初始網路時m0個節點的連接情況:1表示都是孤立;2表示構成完全圖;3表示隨機連接一些邊);
pp=input(初始網路情況1,2或3: );
if m>m0
disp(輸入參數m不合法);
return;
end
switch pp
case 1
A=zeros(m0);
case 2
A=ones(m0);
for i=1:m0
A(i,i)=0;
end
case 3
for i=1:m0
for j=i+1:m0
p1=rand(1,1);
if p1>0.5
A(i,j)=1;
A(j,i)=1;
if i == j
A(i,j)=0;
end
end
end
end
otherwise
disp(輸入參數pp不合法);
return;
end
for k=m0+1:N %次數的k就是控制新添加的第k行和第k列
M=size(A,1);
p=zeros(1,M);
%find(A==1)返回A中等於1的元素所在的編號(不等於下標),即值1=1,1(下標); 2 = 2,1; 3 = 2,1; 4 =
%2,2之類的。返回的結果也是一個一維度的矩陣。1,2,3,4,5....n
%length()返回這個矩陣的大小
if length(find(A==1))==0
p(:)=1/M;%p中的每一個元素
else
for i=1:M
%不論是上三角形式還是對稱矩陣形式,都不用除以2
p(i)=length(find(A(i,:)==1))/length(find(A==1));
end
end
pp=cumsum(p); %求累計概率
%下面這部分在BA網路的構建模型中經常不講,導致無法理解怎麼選點連接。
%是選累積概率最大的幾個點連接?
%還是隨機選幾個概率大的點連接。
for i=1:m %利用賭輪法從已有的節點中隨機選擇m個節點與新加入的節點相連
random_data=rand(1,1);
%pp是從小到大排列,因此,aa(1)就是比隨機數大一個的數,即上界,或者所在區間的最大坐標值。
aa=find(pp>=random_data);jj=aa(1); % 節點jj即為用賭輪法選擇的節點
A(k,jj)=1;
A(jj,k)=1;
%設置對角線元素為0
if k == jj
A(k,jj)=0;
end
end
end
%
df=sum(A>0);
pp2=tabulate(df);
sw=find(pp2(:,3)>0);
loglog(pp2(sw,1),pp2(sw,3)/100,b*);
%lsline %最小二乘擬合直線,會導致報數據為負的警告
title(BA無標度網路度分布圖)
xlabel(k);
ylabel(P(k));
推薦閱讀:
※如何為列表裡的字典(元組)進行排序
※個人的努力在時代的進步面前不值一提
※碼農面試知識收藏夾
※Python黑科技:50行代碼運用Python+OpenCV實現人臉追蹤
※BinaryTree_.h_.cpp