anhuati
答疑小能手
12-10
TA获得超过2123个赞
tic;
%%%%%% 四个输入变量
I=10; %% 表示现实的次数,I要大于或者等于3,才能对节点的度数用邻接矩阵进行统计
N=1000; %% 表示网络的节点的个数
m0=3; %% 表示网络的初始节点个数
m=1; %% 表示新点与旧网络连边的数目
realization_of_distribution=sparse(I,N);
for J=1:I % 对I次现实做平均,然后用这个平均值近似网络的度分布
format long;
adjacent_matrix=sparse(m0,m0);
for i=1:m0
for j=1:3
if j~=i
adjacent_matrix(i,j)=1;
end
end
end
adjacent_matrix=sparse(adjacent_matrix);
node_degree=sparse(1,m0); % node_degree表示各个节点的度数
for p=1:m0
%last_element=sparse(m0,1);
%last_element=cumsum(adjacent_matrix(1:m0,p));
%node_degree(p)=last_element(m0);
node_degree(p)=sum(adjacent_matrix(1:m0,p));
end
%%%%%%%%%%%%%%%%%%%%%%%%%
% 每次加入一个新点,新点和老点之间按照择优概率进行连接,
% 值得注意的是,每次新点加入之后,网络的择优概率都发生变化,
% 每一次循环都是一个相对独立的整体,要把流程进行分割处理
for iteration=4:N
[J,iteration]; % 控制现实和迭代的次数
total_degree=2*m*(iteration-4)+6; %%% 迭代之前的网络各个节点的度数之和
degree_frequency=node_degree/total_degree; %%% 每个节点的度数的频数,这是新点连边的择优概率
cum_distribution=cumsum(degree_frequency); %%% cum_distribution把区间 [0,1] 分成若干个小区间,从而对这些个小区间进行投点实验
interval=cum_distribution(1:(iteration-1)); %%% 这是小区间的端点,是cum_distribution的前 iteration-1 个元素
%**************************************************************************
%%% 下面把 r1 和 [0,1] 内的各个小区间的端点进行比较,落在第 i 小区间,就意味着和第 i 个节点相连边 %%%
choose=zeros(1,m); %%% choose存放的是和新点相连接的一个老点
%%% 选出第一个和新点相连接的顶点
r1=rand(1);
if r1
choose(1)=1;
elseif r1>=interval(iteration-2)
choose(1)=iteration-1;
elseif (r1>=interval(1))&r1
for j=2:iteration-2
if (r1>=interval(j-1))&r1
choose(1)=j;
break;
end
end
end