怎么就不知道改一下呢?这么简单的错误,只是排版问题,晕~~
修改以后,已经可以运行,但没有对结果进行考核
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 生成scale-free网络,目的是在这个网络结构上展开相关的讨论!
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- tic;
- %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- % 开发人:: 李光正
- % 单位:: 上海大学数学系
- % 开发日期:: 2004年12月6日
- %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- %**************************************************************************
- %%% 网络的全局变量
- %**************************************************************************
- %%%%%% 四个输入变量
- I=30; %% 表示现实的次数,I要大于或者等于3,才能对节点的度数用邻接矩阵进行统计
- N=10000; %% 表示网络的节点的个数
- m0=3; %% 表示网络的初始节点个数
- m=3; %% 表示新点与旧网络连边的数目
- %%%%%% 只有一个输出变量realization_of_distribution
- realization_of_distribution=sparse(I,N); % 矩阵的每行存储度分布的一个现实
- %**************************************************************************
- %**************************************************************************
- %**************************************************************************
- %**************************************************************************
- for J=1:I % 对I次现实做平均,然后用这个平均值近似网络的度分布
- format long;
- adjacent_matrix=sparse(m0,m0); % 用sparse表示邻接矩阵adjacent_matrix,极大地释放内存
- for i=1:m0
- for j=1:3
- if j~=i
- adjacent_matrix(i,j)=1;
- end
- end
- end
- adjacent_matrix=sparse(adjacent_matrix); %%% 初始网络,这里利用sparse把内存得以释放
- %%%%%%%%%%%%%%%%%%%%%%%%
- %修改cumsum,目的是使得网络的顶点的个数能够超过10万,而不超过内存空间的限制
- node_degree=sparse(1,m0); % node_degree表示各个节点的度数
- for p=1:m0
- %last_element=sparse(m0,1);
- %last_element=cumsum(adjacent_matrix(1:m0,p));
- %node_degree(p)=last_element(m0);
- node_degree(p)=sum(adjacent_matrix(1:m0,p));
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%
- %**************************************************************************
- %**************************************************************************
- %**************************************************************************
- % 每次加入一个新点,新点和老点之间按照择优概率进行连接,
- % 值得注意的是,每次新点加入之后,网络的择优概率都发生变化,
- % 每一次循环都是一个相对独立的整体,要把流程进行分割处理
- for iteration=4:N
- [J,iteration]; % 控制现实和迭代的次数
- %**************************************************************************
- %%%% node_degree是每次循环所需要的唯一输出变量
- %**************************************************************************
- %%% 为每次迭代配置相关的变量
- total_degree=2*m*(iteration-4)+6; %%% 迭代之前的网络各个节点的度数之和
- degree_frequency=node_degree/total_degree; %%% 每个节点的度数的频数,这是新点连边的择优概率
- cum_distribution=cumsum(degree_frequency); %%% cum_distribution把区间 [0,1] 分成若干个小区间,从而对这些个小区间进行投点实验
- interval=cum_distribution(1:(iteration-1)); %%% 这是小区间的端点,是cum_distribution的前 iteration-1 个元素
- %**************************************************************************
- %%% 下面把 r1 和 [0,1] 内的各个小区间的端点进行比较,落在第 i 小区间,就意味着和第 i 个节点相连边 %%%
- choose=zeros(1,m); %%% choose存放的是和新点相连接的三个老点
- %r2=rand(1); %||| 任意选择的一个 [0,1] 随机数
- %r3=rand(1); %|||
- %**************************************************************************
- %**************************************************************************
- %%% 选出第一个和新点相连接的顶点
- r1=rand(1);
- if r1
- choose(1)=1;
- elseif r1>=interval(iteration-2)
- choose(1)=iteration-1;
- elseif (r1>=interval(1))&r1
- for j=2:iteration-2
- if (r1>=interval(j-1))&r1
- choose(1)=j;
- break;
- end
- end
- end
- %**************************************************************************
- %**************************************************************************
- %%% 选出第二个和新点相连接的顶点,注意这两个点是不同的,目的是避免重复边的出现
- r2=rand(1);
- if r2
- choose(2)=1;
- elseif r2>=interval(iteration-2)
- choose(2)=iteration-1;
- elseif (r2>=interval(1))&r2
- for j=2:iteration-2
- if (r2>=interval(j-1))&r2
- choose(2)=j;
- break;
- end
- end
- end
- while choose(2)==choose(1)
- r2=rand(1);
- if r2
- choose(2)=1;
- elseif r2>=interval(iteration-2)
- choose(2)=iteration-1;
- elseif (r2>=interval(1))&r2
- for j=2:iteration-2
- if (r2>=interval(j-1))&r2
- choose(2)=j;
- break;
- end
- end
- end
- end
- %**************************************************************************
- %**************************************************************************
- %%% 选出第三个和新点相连接的顶点,注意这三个点是不同的,目的是避免重复边的出现
- r3=rand(1);
- if r3
- choose(3)=1;
- elseif r3>=interval(iteration-2)
- choose(3)=iteration-1;
- elseif (r3>=interval(1))&r3
- for j=2:iteration-2
- if (r3>=interval(j-1))&r3
- choose(3)=j;
- break;
- end
- end
- end
- while (choose(3)==choose(1))|(choose(3)==choose(2))
- r3=rand(1);
- if r3
- choose(3)=1;
- elseif r3>=interval(iteration-2)
- choose(3)=iteration-1;
- elseif (r3>=interval(1))&r3
- for j=2:iteration-2
- if (r3>=interval(j-1))&r3
- choose(3)=j;
- break;
- end
- end
- end
- end
- %**************************************************************************
- %**************************************************************************
- %%% 把新点加入网络后,对邻接矩阵进行相应的改变!
- %**************************************************************************
- %%% 这是在一次循环下生成的新的邻接矩阵,下一次循环就是在这个邻接矩阵的基础上进行的!
- for k=1:m
- adjacent_matrix(iteration,choose(k))=1;
- adjacent_matrix(choose(k),iteration)=1;
- end
- % node_degree=sparse(1,N); % node_degree表示各个节点的度数
- for p=1:iteration
- %last_element=sparse(iteration,1);
- %last_element=cumsum(adjacent_matrix(1:iteration,p));
- %node_degree(p)=last_element(iteration);
- node_degree(p)=sum(adjacent_matrix(1:iteration,p)); % 这个循环的目的是重新给各个节点的度赋值
- end
- % element_cumsum=sparse(cumsum(adjacent_matrix));
- % node_degree=element_cumsum(N,:);
- end
- % 一次最外层循环的结束
- %**************************************************************************
- %**************************************************************************
- %**************************************************************************
- % element_cumsum=sparse(cumsum(adjacent_matrix)); % element_cumsum的最后一行给出各个节点的度数
- % node_degree=element_cumsum(N,:);
- number_of_nodes_with_equal_degree=zeros(1,N); % 存储度相同的顶点的个数
- for i=1:N
- difference=node_degree-i*ones(1,N);
- number_of_nodes_with_equal_degree(i)=length(find(difference==0)); % 度为i的节点的个数
- % node_degree=element_cumsum(N,:);
- end
- a_realization_of_distribution=number_of_nodes_with_equal_degree;
- for i=1:N
- realization_of_distribution(J,i)=a_realization_of_distribution(i);
- end
- %%% 循环完毕之后,清空内存,只保留realization_of_distribution的相关信息,这是唯一有用的数据,
- %%% 下面的讨论仅仅与这个数据有关
- %clear number_of_nodes_with_equal_degree;
- %clear element_cumsum;
- %clear node_degree;
- %clear adjacent_matrix;
- % clear
- % clear
- % clear
- % 开始第二次最外层的循环
- %**************************************************************************
- end % 外层循环的中止
- %**************************************************************************
- %**************************************************************************
- %**************************************************************************
- aaa=cumsum(realization_of_distribution);
- bb1=aaa(I,:); %%% 譬如,度为3的节点的个数,由于度数为1,2的节点的个数为0,故可以从度数为3的节点个数开始计算
- bb2=bb1(m:N);
- bbb=bb2/(I*N); %%% 譬如,度为3的节点的个数在网络中的比例
- K=m:N; %%%% 这是
- loglog(K,bbb,'*') % 注意,作图的时候,一定要做散点图
- axis([1 N 0.0000001 0.9])
- hold on;
- y1=2*m^2*K.^(-3);
- loglog(K,y1,'r'); % 与平均场结果进行比较 p(k)=2*m^2*k^(-3)
- %**************************************************************************
- %%% 第四步::全部工作结束
- toc; %%% 计算程序运行需要的时间
复制代码 |