%function A=BA_net()
%%% 从已有的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
%%生成两个1*m0阶全零阵,做初值
x=100*rand(1,m0);
y=100*rand(1,m0);
%%选择初始节点连接情况
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)=0;
end
end
end
otherwise
disp('输入参数pp不合法');
return;
end
%%主要形成过程
for k=m0+1:N%对新节点进行循环
M=size(A,1);%新连接矩阵大小
p=zeros(1,M);
x0=100*rand(1,1);y0=100*rand(1,1);%生成0-100间随机数
x(k)=x0;y(k)=y0;
if isempty(find(A==1))%如果A中没有元素为1
p(:)=1/M;
else
for i=1:M
p(i)=length(find(A(i,:)==1))/length(find(A==1));%分别将连接矩阵中每行为1的个数除以连接矩阵中1的总个数
end
end
pp=cumsum(p); %求累计概率
for i=1:m %利用赌轮法从已有的节点中随机选择m个节点与新加入的节点相连
random_data=rand(1,1);
aa=find(pp>=random_data);jj=aa(1); % 节点jj即为用赌轮法选择的节点
A(k,jj)=1;A(jj,k)=1;
end
end
plot(x,y,'ro','MarkerEdgeColor','g','MarkerFaceColor','r','markersize',8);%()内分别表示x轴、y轴、红色圆圈线形、节点边缘颜色为绿色、节点内部颜色为红色、节点大小号为8
hold on;%保持当前图形
%画图
for i=1:N
for j=i+1:N
if A(i,j)~=0%&~='意思是不等于'
plot([x(i),x(j)],[y(i),y(j)],'linewidth',1.2);
hold on; %% 画出BA无标度网络图
end
end
end
axis equal;%让两轴相等的语句
hold off%关闭当前图形
[C,aver_C]=Clustering_Coefficient(A);%求聚类系数的子函数
[DeD,aver_DeD]=Degree_Distribution(A);%求度分布的子函数
[D,aver_D]=Aver_Path_Length(A); %求平均路径长度的子函数
disp(['该随机图的平均路径长度为:',num2str(aver_D)]); %%分别输出该网络的三个特征参数
disp(['该随机图的聚类系数为:',num2str(aver_C)]);
disp(['该随机图的平均度为:',num2str(aver_DeD)]);