ER随机图的Matlab代码

刚接触复杂网络,用编写了几个简单的网络代码

G(N,P)型网络代码:

function ER(N,p)
%--------------------------------------------------------------------------
A = zeros(N,N);  %生成一个N*N的空矩阵,用以生成一个邻接矩阵
C = zeros(1,N);  %生成一个一维矩阵,用以判断N个节点中是否有节点没有连边,成为了孤立点
for i=1:N
    for j=(i+1):N  %以上三角矩阵为基础,遍历所有的连边情况
        b=rand();  %生成一个0~1的随机数,作为节点i与节点j之间存在连边的可能性
        if b<=p    
            A(i,j)=1;A(j,i)=1;   %当存在连边的可能性小于给定概率时,则生成连边,并将对应矩阵元素的值从0改为1
            C(1,i)=1;C(1,j)=1;   %对一维矩阵中的i、j号位置也改为1,表示该节点存在至少一条连边
        end
    end
end    
for i=1:N
    B(i,1)=cos((2*pi/N)*(i-1)); 
    B(i,2)=sin((2*pi/N)*(i-1));  %生成一个N*2的矩阵用以存放N个节点在图中的位置
end       
gplot(A,B,"-o");  %用gplot函数画出对应邻接矩阵的图 
%--------------------------------------------------------------------------
%由于可能存在孤立点,而孤立点在上图中无法显示,所以进行如下操作,补全图中的孤立点
k=0;  %存放孤立点个数
for i=1:N
    if C(1,i)==0
       k=k+1;  %通过之前生成的一维矩阵计算共有多少个孤立点
    end
end
K=ones(k,k);   %生成一个matlab可接受的邻接矩阵
if k>0         %当存在孤立点时,进一步生成孤立点的位置坐标
   for i=1:k
      D(i,1)=2+0.5*cos((2*pi/k)*(i-1));
      D(i,2)=0.5*sin((2*pi/k)*(i-1));
   end  
   hold on
   gplot(K,D,"o");  %在同一幅图中输出孤立点
end
%--------------------------------------------------------------------------
%完善输出的随机图的标题,图例等
axis equal
format short
title(sprintf("ER随机图模型G(%d,%.3f)", N,p))
if k>0
    legend("存在连边的节点","孤立点");
    axis([-1.5 3 -1.5 1.5]);
else
    legend("存在连边的节点");
    axis([-1.5 1.5 -1.5 1.5]);
end
hold off
%--------------------------------------------------------------------------

end

G(N,M)型网络代码:

function ER2(N,M)
A=zeros(N,N);
C=zeros(1,N);
t=0;k=1;
q=0;
while t==0
    d=unidrnd(N);
    if ((k-d)~=0&&C(1,d)==0&&A(k,d)==0)||(q==(N-1)/2&&(k-d)~=0&&A(k,d)==0)
        A(k,d)=1;A(d,k)=1;
        C(1,k)=1;C(1,d)=1;
        q=q+1;
    end
    w=0;
    for i=1:N
        if C(1,i)==0
            k=i;w=1;
            break
        end
    end
    if w==0
        t=1;
    end
end
for i=(q+1):M
    e=unidrnd(N);
    f=unidrnd(N);
    if (e-f)~=0&&A(e,f)==0
        A(e,f)=1;A(e,f)=1;
    else
        i=i-1;
    end
end
for i=1:N
    B(i,1)=cos((2*pi/N)*(i-1));
    B(i,2)=sin((2*pi/N)*(i-1));
end
gplot(A,B,"-o");
axis equal
axis([-1.5 1.5 -1.5 1.5]);
title(sprintf("ER随机图模型G(%d,%d)", N,M));

end

你可能感兴趣的:(matlab,图论)