复杂网络多局域世界模型matlab算法实现

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&deg(rnum(flag))==n-1 %如果当前节点已经有n-1条边,那么是加不了的
         flag=flag+1;
     end
     if flag==n+1,continue,end
     ind=find(pp&g
  • 10
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值