step1代码为网上copy的代码,其余部分原创
step1:生成无标度网络
N = 1000; m0 = 3;m = 3; %初始结点3,度3 节点数N
adjacent_matrix = sparse(m0,m0);%初始化邻接矩阵
for i = 1:m0
for j = 1:m0
if j~=i%去掉自身形成的环
adjacent_matrix(i,j) = 1;%建立初始临界矩阵
end
end
end
adjacent_matrix = sparse(adjacent_matrix);
node_degree = zeros(1,m0+1);
node_degree(2:m0+1) = sum(adjacent_matrix);
for iter = 4:N
iter
total_degree = 2*m*(iter - 4)+6;
cum_degree = cumsum(node_degree);
choose = zeros(1,m);
%选出第一个和新点相连接的定点
r1 = rand(1)*total_degree; %计算与已存在点相连的概率
for i = 1:iter-1
if(r1>=cum_degree(i))&(r1<cum_degree(i+1))%选取度大的点
choose(1) = i;
break
end
end
%选出第二个和新点相连接的顶点
r2 = rand(1)*total_degree;
for i = 1:iter-1
if(r2>=cum_degree(i))&(r2<cum_degree(i+1))
choose(2) = i;
break
end
end
while choose(2) == choose(1)
r2 = rand(1)*total_degree;
for i = 1:iter-1
if(r2>=cum_degree(i))&(r2<cum_degree(i+1))
choose(2) = i;
break
end
end
end
%选出第三个和新点相连接的顶点
r3 = rand(1)*total_degree;
for i = 1:iter-1
if(r3>=cum_degree(i))&(r3<cum_degree(i+1))
choose(3) = i;
break
end
end
while (choose(3) == choose(1)|choose(3) == choose(2))
r3 = rand(1)*total_degree;
for i = 1:iter-1
if(r3>=cum_degree(i))&(r3<cum_degree(i+1))
choose(3) = i;
break
end
end
end
%把新点加入网络后,对邻接矩阵进行相应的改变!
for k = 1:m
adjacent_matrix(iter,choose(k))=1;
adjacent_matrix(choose(k),iter)=1;
end
node_degree = zeros(1,iter+1);
node_degree(2:iter+1) = sum(adjacent_matrix);
end
save data adjacent_matrix
step2:理想模型
%所有人接受消息%最初的模型,概率不变,人群相同
adj =adjacent_matrix;%邻接矩阵
num = size(adj);num = num(1);
N = 17;%循环次数
beta = 0.2; %未知者变为传播者概率
alpha = 0.1;%传播者变为超级传播者
delta = 0.3;%超级传播者接受消息变为免疫者
gamma = 0.3;%传播者变为免疫者
I = zeros(num,1); %未知者 0 传播者 1 超级传播者 2 免疫者 -1
im = zeros(N,1); im(1) = num;
s = zeros(N,1);s(1) = 0;
jm = zeros(N,1);jm(1) = 0;
r = zeros(N,1);r(1) = 0;
%信息发布者为超级传播者
for i = 2:1:N
for j = 1:num
if (rand(1) < beta)&&(I(j) == 0)%未知者变为传播者
I(j) = 1;
end
end
for j =1:num
if (rand(1) < alpha)&&(I