复杂网络实验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随机图与度分布直方图