3.12多局域世界模型
3.12.1 多局域世界模型的构造方法
多局域世界模型主要是为了刻画具有层次特性的网络,比如Internet网有国际连接、国家主干、区域网络、和局域网。区域网之间的点具有很高的聚类系数,彼此之间紧密相连。而区域网只通过很少的点与主干网络相连。多局域世界模型主要通过以下五个步骤进行构造
(1) 以概率p增加一个拥有m0个节点,e0条边的局域世界,代码如下:
function a=genearategraph(m0,e0);
if e0>m0*(m0-1)/2 %判断输入的参数是否有效,一个有m0个节点的网络最多有m0*(m0-1)/2条边,因此e0不可能大于这个数
fprintf('输入的m0,e0不匹配\n');return
end
a=zeros(m0); %从这儿开始构造这个网络的邻接矩阵,用zeros函数产生m0Xm0阶的元素全为零的矩阵
ra=rand(m0); %用rand函数生成m0xmo阶的元素全为0-1之间随机数的矩阵
ra=tril(m0); %用tril函数提取ra矩阵的下三角部分
ra([1:m0+1:end])=0; %将下三角矩阵的对角线元素全部改为0,因为邻接矩阵的对角线元素必为0
[sra,indc]=sort(nonzeros(ra),'descend'); %此处nonzeros返回一个向量,这个向量是上一步矩阵所有元素按照列堆叠构成的,然后对这个向量按照降序排序
p=sra(e0) %选定前e0条边所对应的最小的概率,小于这个概率的不予保留,生成e0条边
a(ra>=p)=1;
a=a+a';
end
(2)选定一个已存在的局域世界,以概率q将一个新节点,以给定概率同局域世界中的点建立m1条边
此处先插入介绍一下轮盘赌法,这个方法在后面反复出现。
假设我们有A,B,C,D,E五个小球,各自抽中的概率为0.2,0.25,0.15,0.3,0.1
标号 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
小球 | A | B | C | D | E |
概率 | 0.2 | 0.25 | 0.1 | 0.15 | 0.3 |
累积概率 | 0.2 | 0.45 | 0.55 | 0.7 | 1 |
我们要实现的功能很简单,就是根据概率大小随机选抽中一个球。
我们可以这样做,用matlab的rand函数产生一个0到1之间的随机数k。用find()从累积概率向量中找到大于或者等于这个随机数k的小球的标号。比如我们产生的随机数是0.46,在累积概率中大于0.46的小球是C,D,E。其标号是3,4,5。find函数返回的就是(3,4,5)。然后我们索引到(3,4,5)中的第一个元素3。说明这次我们抽中的小球就是3号球。此处的本质是利用累积概率对0到1区间划分为5个区域。区域越大,随机数落到这个区间的概率也就越大。
下面贴上代码:
function b=addnode(a,m,alpha);%a为输入的矩阵,m为建立边的条数,alpha吸引力
b=a;n=length(a); %n为节点个数
if m>n
return %输入数据不匹配,因为建立边的个数不可能大于整个局域世界中的节点数
end
for i=1:m %开始循环迭代生成m个点
LP=(sum(b)+alpha)/sum(sum(b)+alpha); %计算所有点的连接的概率
pp=cumsum(LP); %计算累积概率
ind=find(pp>=rand); %依概率与点相连
b(n+1,ind(1))=1;b(ind(1),n+1)=1;
end
end
(3) 以概率r向局域世界增加m条边
function b=addedge(a,m,alpha); %a为输入的矩阵,m为加边的个数,alpha为调节的系数
b=a;n=length(a)
for i=1:m
deg=sum(b); %计算当前网络各节点的度,此处返回一个向量
LP=(deg+alpha)/sum(deg+alpha); %计算到各节点的连接概率
pp=cumsum(LP);
rnum=randperm(m); %产生一个全排列,即元素是1到m的整数,但是顺序是乱的,此处是为了随机设定边的一个起点
flag=1; %初始加边的对象
while flag<=n°(rnum(flag))==n-1 %如果当前节点已经有n-1条边,那么是加不了的
flag=flag+1;
end
if flag==n+1,continue,end
ind=find(pp&g