MLW模型的matlab实现(已修复)
原作者:(5条消息) 复杂网络多局域世界模型matlab算法实现_乾三连的博客-CSDN博客_多局域世界模型https://blog.csdn.net/qq_36434958/article/details/102770052MLW模型,即复杂网络多局域世界模型(the Multi Local Worlds Model)是一个具有度指数分布特性的小世界模型。比起BA等其他小世界模型,MLW模型最大的优点是具有较高的聚类系数,而高聚类系数是多数现实小世界网络的特征。因此,MLW模型能较好地模拟现实中的小世界网络。
MLW模型的生成过程为数个步骤的迭代,最终生成数个互相有较少连接的局域世界,局域世界内的节点之间的连边则较多。具体的步骤可以参考上面贴出来的原作者的文章,这里不具体阐述。
原作者贴出的代码存在较多的bug,我已将其修复,现于此贴出以便诸位可直接使用。
这段代码需要一个matlab app的支持(具体哪个我不记得了,总之如果到时候报缺少xxx的错误直接下载那个就可以了)。如果仍有bug(下载该app后仍无法运行),请告知我,我尽可能及时修正代码!
clc,clearm=5;m0=8;e0=15;p=0.3;q=0.2;r=0.25;s=0.05;u=0.2;m1=3;m2=5;m3=4;m4=6;alpha=1;p=[p,q,r,s,u];n=m;pp=cumsum(p); %轮盘赌法选条件for i=1:mA{i}=generategraph(m0,e0); %产生初始的m个局域世界endnum(1:m)=m0; %此处先声名一个num变量,num变量的1到m个元素都是m0,此处是为了存储各个局域世界的节点个数Tno=[];Tuv=[]; %返回值初始化for i=1:400 % 迭代2000次ind=find(pp>=rand); % 轮盘赌法,此处返回一个索引向量,即大于随机数rand的两个累计概率值switch ind(1) % 索引到第一个大于累计概率值的对应索引,共有五种可能1,2,3,4,5。分别对应我们的五种可能case 1 %如果上面返回1就执行这个操作n=n+1; %更新局域世界个数A{n}=generategraph(m0,e0); % 定义细胞对象A的第n个细胞数组num(n)=length(A{n}); %更新num变量,将新生成的这个局域小世界的节点个数加进去case 2 %如果上面返回2就执行这个操作rn=randperm(n);%生成从1到n的整数构成的一个排列,排列是随机的,因为我们需要随机先挑一个局域世界k=rn(1);%索引rn向量的第一个元素相当于从从1到n中随机抽一个数。从而实现从n个小世界中随机挑一个的%功能。A{k}=addnode(A{k},m1,alpha);%使用我们前面写的函数给局域小世界加点。num(k)=length(A{k}); %再次更新numcase 3 %如果上面返回3就执行这个操作rn=randperm(n);k=rn(1); %随机挑一个局域世界A{k}=addedge(A{k},m2,alpha) %执行随机加边的操作,这一步不需要更新num,因为只是加边,没有加点case 4 rn=randperm(n);k=rn(1); %随机挑选一个局域世界A{k}=deleteedge(A{k},m3,alpha); %随机删边otherwise[no,uv]=addlongedge(A,m4,alpha) %在局域世界中随机增加长程边,此处返回由数对组成的两个变量,%no是一个矩阵,有两行元素,每一列的两个元素对应每一次加边的起点局域世界编号与终点局域世界编号。%uv同理,每一列对应的两个元素分别对应起点局域世界内的加边的起点节点的编号与终点局域世界加边的终点%节点编号。Tno=[Tno,no];%每一次迭代后更新TnoTuv=[Tuv,uv];%每一次迭代后更新Tuvend %switch结束end %for循环结束B=blkdiag(A{:}); %将细胞对象A的所有邻接矩阵按照对角线拼成一个大的邻接矩阵num=[0,num]; %方便计算,如果不添加零的话对第一个局域世界在整个网络中的加边将会很麻烦,需要倒着索引。cnum=cumsum(num); %计算累加for i=1:length(Tno)%虽然大邻接矩阵拼出来了,但是局域世界之间加的边还没有在这个邻接矩阵里面加上,下面加边u=cnum(Tno(1,i))+Tuv(1,i); %首先利用节点累加值定位到该局域世界的起点处,然后再在起点处上根据第二项地位到%具体位置v=cnum(Tno(2,i))+Tuv(2,i); %同理上面,找到要加的边的终点在整个大网络中的位置if (u ~= 0 && v ~= 0)B(u,v)=1;B(v,u)=1;%完成加边endend %迭代所有值,完成加边B=degreeaddedge(B); %调用前面编写的函数,完成对度为0或者1的点随机加边B=Locworldconnect(B); %调用自己写的函数完成对孤立局域世界之间的连接。function a=generategraph(m0,e0)
if e0>m0*(m0-1)/2 %判断输入的参数是否有效,一个有m0个节点的网络最多有m0*(m0-1)/2条边,因此e0不可能大于这个数fprintf('输入的m0,e0不匹配\n');return
end
a=zeros(m0, m0); %从这儿开始构造这个网络的邻接矩阵,用zeros函数产生m0Xm0阶的元素全为零的矩阵
ra = rand(m0, m0); %用rand函数生成m0xmo阶的元素全为0-1之间随机数的矩阵
ra = tril(ra); %用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';endfunction b=addnode(a,m,alpha);%a为输入的矩阵,m为建立边的条数,alpha吸引力
b=a;n=length(a); %n为节点个数
if m>nreturn %输入数据不匹配,因为建立边的个数不可能大于整个局域世界中的节点数
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
endfunction b=addedge(a,m,alpha); %a为输入的矩阵,m为加边的个数,alpha为调节的系数b=a;n=length(a)for i=1:mdeg=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;endif flag==n+1,continue,endind=find(pp>=rand);if rnum(flag)~=ind(1)&b(rnum(flag),ind(1))==0b(rnum(flag),ind(1))=1;b(ind(1),rnum(flag))=1endend
endfunction b=deleteedge(a,m,alpha);
b=a;n=length(a);
for i=1:mdeg=sum(b)LP=(1-(deg+alpha)/sum(deg+alpha))/(n-1); %计算各节点对应的删除概率pp=cumsum(LP);rnum=randperm(n);flag=1;while flag<n & deg(rnum(flag))==0 %当前为孤立点取下一个点flag=flag+1;endif flag==n& deg(rnum(flag))==0continueendind=find(pp>=rand);if b(rnum(flag),ind(1))==1b(rnum(flag),ind(1))=0;b(ind(1),rnum(flag))=0; %删除原边end
end
endfunction[no,uv]=addlongedge(A,m,alpha);%A为所有局域世界邻接矩阵的细胞数组,A{1}为第一个邻接矩阵,m为加边的条数;no为矩阵,每个列对应两个局域世界存在连边,连边编号存放在矩阵uv的对应列中。n=length(A); %局域世界的个数no=[];uv=[];for i=1:mrn=randperm(n); %随机抽局域世界排列no=[no,rn(1:2)']; %这个排列的前个元素分别是起点局域世界和终点局域世界a=A{rn(1)};b=A{rn(2)} %分别挑出两个局域世界的邻接矩阵p1=(sum(a)+alpha)/sum(sum(a)+alpha);pp1=cumsum(p1);p2=(1-(sum(b)+alpha)/sum(sum(b)+alpha))/length(b)-1pp2=cumsum(p2);ind1=find(pp1>=rand);ind2=find(pp2>=rand);if ~isempty(ind2)uv=[uv,[ind1(1);ind2(1)]]; elseuv=[uv,[ind1(1);0]]; endend
endfunction B=degreeaddedge(A); %输入参数A是存在孤立点的网络的邻接矩阵,输出B是加边之后的邻接矩阵B=A;while any(sum(B)<=1) %sum(B)得到当前邻接矩阵的所有节点的度,如果有任何一个节点的度小于或者等于1%就执行操作deg=sum(B);p=(deg+1)/sum(deg+1); %算出当前局域世界网络所有节点的加边概率pp=cumsum(p); %轮盘赌法选边k=find(deg<=1); %找出所有度小于或者等于1的节点编号for i=kind=find(pp>=rand);jj=ind(1); %jj为用轮盘赌法选择的节点地址if jj~=i %确保不会自己连到自己B(i,jj)=1;B(jj,i)=1;endendendendfunction B=Locworldconnect(A);C=tril(A);C=sparse(C);%生成稀疏矩阵[num,label]=graphconncomp(C,'directed',0); %这个函数是matlab工具箱里的函数,用于计算无向图连通分量.此处介绍%一下什么是连通分量,每一个连通分量就是点的集合,每个集合内部的点都能到达同样在集合中的点,这个函数的目的%就是为了把孤立的小世界挑出来,此函数返回两个参数第一个参数num表示这个图中有多少个连通分量。第二个label表%示每个节点的所属的分量编号。if num==1 %如果不存在孤立的小世界,所有的点都连接成一个大的网络,函数循环结束,直接返回BB==A;returnendfor i=1:num %对我们得到的num个连通分量开始进行迭代n{i}=find(label==i); %前面label得到的分量编号虽然值不同,但是所有的点都混在一起了,此处将属于第i个连通%分量节点的编号挑出来endB=A;deg=sum(A); %计算各节点的度for i=1:nump1=(deg(n{i})+1)/sum(deg(n{i})+1); %首先把所有属于第i个分支节点的节点的编号挑出来,利用deg()索引到这%这些节点的度,进而计算连接概率pp1=cumsum(p1); %计算累积概率,轮盘赌法选点又开始了ii=(i+1)*(i+1<=num)+mod(i+1,num)*(i+1>num); %此处是为了实现依次相连,第i个分支连接到第i+1个分支,之%所以这句写的这么麻烦是因为到最后一个分支num时,没有下一个分支和他相连,而是需要和第一个分支首尾相连形成%一个环,所以引入(i+1<=num)做判断是否循环到了最后一个,注意此处的运算顺序,不同于其他语言,这里%加法是优先于逻辑判断的,所以此处返回的是表示布尔值的0或者1.然后用mod取余数1实现定位到第一个分支。p2=(deg(n{ii})+1)/sum(deg(n{ii})+1); %把所有属于第i+1个节点的度给挑出来pp2=cumsum(p2); %计算累积概率,轮盘赌法ind1=find(pp1>=rand); %利用概率定位连边起点ind2=find(pp2>=rand); %利用概率定位连边终点B(n{i}(ind1(1)),n{ii}(ind2(1)))=1; %进行连边操作B(n{ii}(ind2(1)),n{i}(ind1(1)))=1;end end
MLW模型的matlab实现(已修复)相关推荐
- Gompertz模型绘图 matlab,Logistic模型matlab求解
Logistic模型求解怎么用matlab求解啊? 悬赏分:100 - 解决时间:2008-11-17 23:09 已知 x=0:1:12 y=[43.65 109.86 187.21 312.67 ...
- matlab状态空间法算反馈阵,matlab中已知系统的状态方程怎样绘制系统阶跃响应曲线...
matlab中,怎样设置坐标系统的原点在左上角? axisijx=-pi:0.1:pi;y=sin(x);plot(x,y,'g:'); 谁能帮我做Matlab的作业:分析系统能否通过状态反馈实现镇定 ...
- boid模型的Matlab程序,基于Boid模型以及吸引—排斥模型的沙丁鱼集群运动行为模拟...
刘培 宫子涵 [摘 要]本文首先为了分析了沙丁鱼集群的运动模式,引入了 Boid 模型.通过个体间的距离划分出了排斥区域.一致区域和吸引区域.当相邻个体处于排斥区域则保持足够的距离,尽量避免碰撞,当处 ...
- 【图像修复】基于matlab损坏图像修复【含Matlab源码 731期】
一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像修复]基于matlab损坏图像修复[含Matlab源码 731期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付费专栏 ...
- 随机信号的参数建模法--AR模型及Matlab实现
目录 一.随机信号参数模型 二.AR模型 三.AR模型参数的估计 1. AR 模型参数和自相关函数的关系 2. Y-W 方程的解法--L-D 算法 2-1 前向预测器 2-2 建立更高阶的AR模型 2 ...
- 风电随机性动态经济调度模型(Matlab代码实现)
目录 0 写在前面 1 引言 1.1 机会约束规划 1.2 基于场景的方法 1.3 模糊模型 2 六种处理风电随机性动态经济调度模型描述 2.1 考虑正负旋转储备约束的确定性模型 2.2 机会约束的随 ...
- matlab中估计丢失的数据,空间计量经济学基本模型的matlab估计
原标题:空间计量经济学基本模型的matlab估计 空间计量经济学 Matlab应用学习手册 空间计量经济学创造性地处理了经典计量方法在面对空间数据时的缺陷,考察了数据在地理观测值之间的关联.近年来在人 ...
- EA周报 |向李彦宏泼水男子寻衅滋事被行拘5日;iCloud 出现宕机,已修复;一线城市年均工资:北京领跑广深首入10万元俱乐部...
EA周报 2019年7月5日 每周星期五7分钟,元宝带你喝一杯IT人的浓缩咖啡,了解天下事.掌握IT核心技术. ♬ 点上方绿标可收听周报音频 关闭窗口或屏幕也可听哦~ 热点大事件 一线城市年均工资:北 ...
- Denuvo 防篡改技术又被攻克;饿了么回应大规模故障:已修复
(点击上方蓝字,快速关注我们) 转自:开源中国.solidot.cnBeta.腾讯科技等 0.魔高一丈?Denuvo 防篡改技术最新版本已被攻克 貌似Denuvo防篡改技术的最新版本现在已经被攻克了, ...
最新文章
- fiddler使用技巧进阶,如何抓包修改数据?——AutoResponder重定向
- php pdo.dll不存在,php pdo.dll没有找到怎么办
- http请求 url 竖线_http.createServer创建http服务
- 零基础 Amazon Web Services (AWS) 入门教程图文版(一)
- java jbutton 事件_java-需要JButton事件支持
- linux 主机名修改日志,Linux:修改主机名【Centos7】
- 使用ANNdotNET GUI工具创建CIFAR-10深度学习模型
- 镜像串之字符串常量用处
- mysql中的like查询能否用的到索引
- 自适应控制——仿真实验一 用李雅普诺夫稳定性理论设计自适应规律
- Project 制作工作进度计划 排除休息日
- 双态运维联盟(BOA)正式成立
- android图片浮动层,android浮层图片拖动并且可点击效果
- 7月1号连连支付不能提现PayPal了,以后PayPal怎样提现?
- 小程序中switch case如何优化
- Git拉代码(https以及ssh两种)
- Linux下使用alsamixer配置系统默认的声卡设备(默认音频输出设备、输入设备、系统音量)
- 盘点分布式文件存储系统
- 海华cywdhd wifi驱动移植
- Dreamweaver CC 2017中文版