复杂网络实验1:ER随机图(matlab)

复杂网络实验1:ER随机图(matlab)

一.版本1(单纯画图,无邻接矩阵)

1.创建degree(度)一维矩阵

2.创建点位置二维矩阵

3.生成圆形的形状,把圆形分成N份,给点赋值

4.每个点之间以一定概率形成边

二.版本2(有邻接矩阵)

鉴于一些朋友需要有邻接矩阵的版本,后面再添加有邻接矩阵的版本

由于我这里不需要邻接图的逻辑,我只要画图,所以把邻接图省略了,下面补上

由于这是比较早期的博文,下面的部分有点混乱,也不怎么想改了,给出具体的思路

具体的解析我就全放到代码部分了,可以自己看代码

1.创建邻接矩阵(N*N)

2.创建点位置矩阵(N*2)

3.安排好每个点的位置

4.先画出所有点,保持住图形

5.遍历一遍邻接矩阵

#1.刚开始的时候,邻接矩阵是全零的,这一遍遍历,就是以一定概率(程序中设置的概率是0.1)把0变成1

#2.程序中邻接表表示为adj,如果adj(2,3) = 0 ,说明节点2和节点3之间没有连边,如果是1,就是有连边存在

#3.整个邻接图是对称矩阵,就是以主对角线对称 adj(2,3) = adj (3,2),因为是无向图

6.通过上面这一遍遍历,设定好了点与点之间的连边,再遍历一遍邻接表

#1.这一遍看到邻接表中数值是1,形成连边就行

#2.可以看到这一步是多余的,其实在上一次循环的时候,就能把线画出来,而这里的邻接表其实也没啥用

#3.就是有些朋友想要邻接表的版本而已

三.代码+解析

这里贴的代码后面用//注释,不能放入matlab运行

matlab注释要用%

简单自启动,不输入点数量,边随机重连P

N=100;                                      //100个点

p=0.1;                                       //边随机连接概率P=0.1

degree=zeros(N,1);               //初始化每个点的度为0,N行1列

position=zeros(N,2);                  //生成N行2列零矩阵,存放点的位置

注意1:

matlab的矩阵下标从1开始

 

for m=1:N                                      //遍历每一行(每个点),给每个点赋值X,Y

   position(m,1)=cos(m/N*2*pi)      //X是cos,在半径为1的圆上找点

   position(m,2)=sin(m/N*2*pi)      //Y是sin

end           

注意2:        

这里我们把点分布在一个圆上,通过把2π分成N份的思路

半径为1,所以X直接取cos,Y直接取sin

 

figure;                                         //单纯显示一个窗口(用来显示图像)

hold on;                                     //把这个窗口保持住

plot(position(:,1),position(:,2),'o');  //画出这个圆上所有点,以空心圆的形式

注意3:

这里把这个窗口保持住的原因是,matlab每次使用plot都会默认打开一个窗口

这个默认窗口只有一个,也就是你两次调用plot命令,上一个默认图形窗口会被这次关掉

我们希望把画的东西画在一个图里,所以会使用hold on

我们先把点在图上画出来,下面要在点之间连线,所以这里要保持住

 

for m=1:N        

    for n=m+1:N                                                     //遍历每一个点,继而遍历这个点之后的点

        if(rand(1,1)<p)                                             //生成一个随机数(一行一列),如果小于P(这里设置成0.1)

            degree(m,1)=degree(m,1)+1;   

            degree(n,1)=degree(n,1)+1;                   //这两个点的度分别加1

            plot(position([m,n],1),position([m,n],2));   //在第m个点和第n个点之间画一条线

        end

    end

end

hold off;

 

注意4:

这里hold off的意思就是停止保持窗口,下面我们需要展示度的窗口,这个窗口的图已经画完了

figure;                           //打开一个新窗口,不和上一个窗口冲突

hist(degree);                 //hist()是直方图的命令,默认10个值的分布,给出度分布的直方图

 

四.源码

N=100
p=0.1

degree=zeros(N,1);
position=zeros(N,2);

for m=1:N
    position(m,1)=cos(m/N*2*pi);
    position(m,2)=sin(m/N*2*pi);
end

figure('name','ER随机图');
hold on;
plot(position(:,1),position(:,2),'d')

for m=1:N
    for n=m+1:N
        if(rand(1,1)<p)
            degree(m,1)=degree(m,1)+1;
            degree(n,1)=degree(n,1)+1;
            plot(position([m,n],1),position([m,n],2))
        end
    end
end
hold off;

figure('name','度分布直方图');
hist(degree);

有邻接矩阵版本:
 

N = 100  %100个点
p = 0.1  %点与点之间以0.1的概率形成连边
%可以修改上方的参数,得到不同的模型

position=zeros(N,2);    %点位置信息position,一共有N组数据,每组数据有2个信息
adj = zeros(N,N);  %创建邻接矩阵,初始化邻接矩阵全零
for m=1:N           %给每个点安排位置,围成一个圆
    position(m,1)=cos(m/N*2*pi);
    position(m,2)=sin(m/N*2*pi);
end

figure('name','ER随机图');
hold on;
plot(position(:,1),position(:,2),'d')

for m=1:N
    for n=m+1:N
        if(rand(1,1)<p)  %以0.1的概率生成边
            adj(m,n)=1;  %这里两句给邻接表赋值
            adj(n,m)=1;  
        end
    end
end
for m = 1:N
    for n = m+1:N
        if(adj(m,n)==1)  %如果有边就画出来
            plot(position([m,n],1),position([m,n],2));
        end
    end
end
hold off;

五.小结

在100个点,随机连边概率0.1的情况下的ER随机图与度分布直方图 

  • 20
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值