matlab仿真消息在网络平台的传播

来源:互联网 发布:网络直播内容策划表格 编辑:程序博客网 时间:2024/06/04 00:52

step1代码为网上copy的代码,其余部分原创
step1:生成无标度网络

N = 1000; m0 = 3;m = 3; %初始结点3,度3 节点数Nadjacent_matrix = sparse(m0,m0);%初始化邻接矩阵for i = 1:m0    for j = 1:m0        if j~=i%去掉自身形成的环            adjacent_matrix(i,j) = 1;%建立初始临界矩阵        end    endendadjacent_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);endsave 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     免疫者 -1im = 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(j) == 1)%传播者变为超级传播者            I(j) = 2;        end    end    for j = 1:num        for k = 1:num            if j~=k                 if(I(j) == 1)&&((adj(j,k)==1)&&(I(k) ~= 0))&&(rand(1)<gamma)%传播者变为免疫者                    I(j) = -1;                end                if(I(j) == 2)&&(((adj(j,k) == 1)&&adj(k) == 1)||(jm(i-1)>0))&&(rand(1)<delta)%超级传播者变为免疫者                    I(j) = -1;                end            end        end    end    im(i) = sum(I == 0);s(i) = sum(I == 1);jm(i) = sum(I == 2);r(i) = sum(I == -1);endhold ontitle('ISJR模型')xlabel('T')ylabel('N')plot(1:N,im,'.-k')plot(1:N,s,'-k')plot(1:N,jm,'--k')plot(1:N,r,':k')str = {'未知者','传播者','超级传播者','免疫者'};legend(str,'location','best') 

step3:考虑两消息的相互影响

T = 6;%T时刻新消息发布newstype = 1;%消息类型,1:互补促进型,0:互不相容型adj =adjacent_matrix;%邻接矩阵num = size(adj);num = num(1);M = 15;%循环次数beta0 = 0.6;%促进系数 newstype = 0 时有效Q1 = num*0.8;%抑制临界人数Q2 = num*0.3;%原消息beta = 0.4; %一般者变为传播者概率alpha = 0.1;%传播者变为超级传播者delta = 0.3;%超级传播者接受消息变为免疫者gamma = 0.3;%传播者变为免疫者%新消息betan = 0.5; %一般者变为传播者概率alphan = 0.2;deltan = 0.3;gamman = 0.3;I = zeros(num,1); %未知者 0   传播者 1   超级传播者 2     免疫者 -1N = zeros(num,1); %新消息im = zeros(M,1); im(1) = num;s = zeros(M,1);s(1) = 0;jm = zeros(M,1); jm(1) = 0;  r = zeros(M,1);r(1) = 0;in = zeros(M,1);in(T) = num;     sn = zeros(M,1);sn(T) = 0;jn = zeros(M,1);jn(T) = 0;        rn = zeros(M,1);rn(T) = 0;p = 0.1;%活跃着所占比例;q = 0.1;%固执者所占比例为(1-q),且p+q<1,即q>p;S = zeros(num,1);%状态矩阵,0:一般者,1:积极者,-1:固执者,2:其他状态for i = 1:num    if rand(1)<p        S(i) = 1;    elseif rand(1)>q        S(i) =-1;    endend%生成原消息状态矩阵p1 = 0.1;%活跃着所占比例;q1 = 0.1;%固执者所占比例为(1-q),且p+q<1,即q>p;S1 = zeros(num,1);%状态矩阵,0:一般者,1:积极者,-1:固执者,2:其他状态for i = 1:num    if rand(1)<p1        S1(i) = 1;    elseif rand(1)>q1        S1(i) =-1;    endend%生成状态矩阵beta1 = beta;beta2 = betan;for i = 2:1:M    for j = 1:num        if I(j) ==0;%判断未知者            if S(j)== 1%活跃着一定变为变为传播者                I(j) = 1;            elseif (S(j) ==0)&&(rand(1)<beta)%一般者变为传播者                I(j) = 1;            elseif (S(j)==-1)&&(rand(1)<beta1)                I(j) = 1;            end        end    end    for j =1:num        if (rand(1) < alpha)&&(I(j) == 1)%传播者变为超级传播者            I(j) = 2;        end    end    for j = 1:num        for k = 1:num            if j~=k                 if(I(j) == 1)&&((adj(j,k)==1)&&(I(k) ~= 0))&&(rand(1)<gamma)%传播者变为免疫者                    I(j) = -1;                end                if(I(j) == 2)&&(((adj(j,k) == 1)&&adj(k) == 1)||(jm(i-1)>0))&&(rand(1)<delta)%超级传播者变为免疫者                    I(j) = -1;                end            end        end    end    im(i) = sum(I == 0);s(i) = sum(I == 1);jm(i) = sum(I == 2);r(i) = sum(I == -1);    if i>T %新消息发布        for j = 1:num            if N(j) == 0                if S1(j)== 1%活跃着一定变为变为传播者                    N(j) = 1;                elseif (S1(j) ==0)&&(rand(1)<betan)%                    N(j) = 1;                elseif (S1(j)==-1)&&(rand(1)<beta2)%                    N(j) = 1;                end            end        end        for j =1:num            if (rand(1) < alphan)&&(N(j) == 1)%传播者变为超级传播者                N(j) = 2;            end        end        for j = 1:num            for k = 1:num                if j~=k                     if(N(j) == 1)&&((adj(j,k)==1)&&(N(k) ~= 0))&&(rand(1)<gamman)%传播者变为免疫者                        N(j) = -1;                    end                    if(N(j) == 2)&&(((adj(j,k) == 1)&&adj(k) == 1)||(jn(i-1)>0))&&(rand(1)<deltan)%超级传播者变为免疫者                        N(j) = -1;                    end                end            end        end        in(i) = sum(N == 0);sn(i) = sum(N == 1);jn(i) = sum(N == 2);rn(i) = sum(N == -1);        if newstype == 1%促进型             beta = (num-in(i))/num*beta0+beta;%beta0:促进系数            betan = (num-im(i))/num*beta0+betan;        elseif newstype == 0;%抑制型            beta = in(i)/Q1*beta;            betan = im(i)/Q2*betan;        end    end    beta = (1-i/M)*beta;    betan = (1-i/M)*betan;    beta1 =(num-im(i))/num*beta;    beta2 =(num-im(i))/num*betan;endfigurehold ontitle('某消息')xlabel('T')ylabel('N')plot(1:M,im,'.-k')plot(1:M,s,'-k')plot(1:M,jm,'--k')plot(1:M,r,':k')str = {'未知者','传播者','超级传播者','免疫者'};legend(str,'location','best') figurehold ontitle('新消息')xlabel('T')ylabel('N')plot(T:M,in(T:end),'.-k')plot(T:M,sn(T:end),'-k')plot(T:M,jn(T:end),'--k')plot(T:M,rn(T:end),':k')str = {'未知者','传播者','超级传播者','免疫者'};legend(str,'location','best') 

step4:考虑传播方式差异

T = 6;%T时刻新消息发布newstype = 1;%消息类型,1:互补促进型,0:互不相容型adj =adjacent_matrix;%邻接矩阵num = size(adj);num = num(1);M = 15;%循环次数beta0 = 0.6;%促进系数 newstype = 0 时有效Q1 = num*0.8;%抑制临界人数Q2 = num*0.3;%原消息beta = 0.4; %一般者变为传播者概率alpha = 0.1;%传播者变为超级传播者delta = 0.3;%超级传播者接受消息变为免疫者gamma = 0.3;%传播者变为免疫者%新消息betan = 0.5; %一般者变为传播者概率alphan = 0.2;deltan = 0.3;gamman = 0.3;I = zeros(num,1); %未知者 0   传播者 1   超级传播者 2     免疫者 -1N = zeros(num,1); %新消息im = zeros(M,1); im(1) = num;s = zeros(M,1);s(1) = 0;jm = zeros(M,1); jm(1) = 0;  r = zeros(M,1);r(1) = 0;in = zeros(M,1);in(T) = num;     sn = zeros(M,1);sn(T) = 0;jn = zeros(M,1);jn(T) = 0;        rn = zeros(M,1);rn(T) = 0;p = 0.1;%活跃着所占比例;q = 0.1;%固执者所占比例为(1-q),且p+q<1,即q>p;S = zeros(num,1);%状态矩阵,0:一般者,1:积极者,-1:固执者,2:其他状态for i = 1:num    if rand(1)<p        S(i) = 1;    elseif rand(1)>q        S(i) =-1;    endend%生成原消息状态矩阵p1 = 0.1;%活跃着所占比例;q1 = 0.1;%固执者所占比例为(1-q),且p+q<1,即q>p;S1 = zeros(num,1);%状态矩阵,0:一般者,1:积极者,-1:固执者,2:其他状态for i = 1:num    if rand(1)<p1        S1(i) = 1;    elseif rand(1)>q1        S1(i) =-1;    endend%生成状态矩阵beta1 = beta;beta2 = betan;for i = 2:1:M    for j = 1:num        if I(j) ==0;%判断未知者            if S(j)== 1%活跃着一定变为变为传播者                I(j) = 1;            elseif (S(j) ==0)&&(rand(1)<beta)%一般者变为传播者                I(j) = 1;            elseif (S(j)==-1)&&(rand(1)<beta1)                I(j) = 1;            end        end    end    for j =1:num        if (rand(1) < alpha)&&(I(j) == 1)%传播者变为超级传播者            I(j) = 2;        end    end    for j = 1:num        for k = 1:num            if j~=k                 if(I(j) == 1)&&((adj(j,k)==1)&&(I(k) ~= 0))&&(rand(1)<gamma)%传播者变为免疫者                    I(j) = -1;                end                if(I(j) == 2)&&(((adj(j,k) == 1)&&adj(k) == 1)||(jm(i-1)>0))&&(rand(1)<delta)%超级传播者变为免疫者                    I(j) = -1;                end            end        end    end    im(i) = sum(I == 0);s(i) = sum(I == 1);jm(i) = sum(I == 2);r(i) = sum(I == -1);    if i>T %新消息发布        for j = 1:num            if N(j) == 0                if S1(j)== 1%活跃着一定变为变为传播者                    N(j) = 1;                elseif (S1(j) ==0)&&(rand(1)<betan)%                    N(j) = 1;                elseif (S1(j)==-1)&&(rand(1)<beta2)%                    N(j) = 1;                end            end        end        for j =1:num            if (rand(1) < alphan)&&(N(j) == 1)%传播者变为超级传播者                N(j) = 2;            end        end        for j = 1:num            for k = 1:num                if j~=k                     if(N(j) == 1)&&((adj(j,k)==1)&&(N(k) ~= 0))&&(rand(1)<gamman)%传播者变为免疫者                        N(j) = -1;                    end                    if(N(j) == 2)&&(((adj(j,k) == 1)&&adj(k) == 1)||(jn(i-1)>0))&&(rand(1)<deltan)%超级传播者变为免疫者                        N(j) = -1;                    end                end            end        end        in(i) = sum(N == 0);sn(i) = sum(N == 1);jn(i) = sum(N == 2);rn(i) = sum(N == -1);        if newstype == 1%促进型             beta = (num-in(i))/num*beta0+beta;%beta0:促进系数            betan = (num-im(i))/num*beta0+betan;        elseif newstype == 0;%抑制型            beta = in(i)/Q1*beta;            betan = im(i)/Q2*betan;        end    end    beta = (1-i/M)*beta;    betan = (1-i/M)*betan;    beta1 =(num-im(i))/num*beta;    beta2 =(num-im(i))/num*betan;endfigurehold ontitle('某消息')xlabel('T')ylabel('N')plot(1:M,im,'.-k')plot(1:M,s,'-k')plot(1:M,jm,'--k')plot(1:M,r,':k')str = {'未知者','传播者','超级传播者','免疫者'};legend(str,'location','best') figurehold ontitle('新消息')xlabel('T')ylabel('N')plot(T:M,in(T:end),'.-k')plot(T:M,sn(T:end),'-k')plot(T:M,jn(T:end),'--k')plot(T:M,rn(T:end),':k')str = {'未知者','传播者','超级传播者','免疫者'};legend(str,'location','best') 
原创粉丝点击