声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1998|回复: 3

[数学理论] 请问一下:有人运行出来这个Scale Free Networks程序吗?

[复制链接]
发表于 2007-11-1 17:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%        生成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;       %%% 计算程序运行需要的时间
回复
分享到:

使用道具 举报

发表于 2007-11-1 20:39 | 显示全部楼层
呵呵,可能没有时间帮你做这个测试,不知道你是遇到了什么问题,说出来还有可能讨论!
 楼主| 发表于 2007-11-5 15:43 | 显示全部楼层

回复 #2 无水1324 的帖子

我运行了2天,都没有算出来!估计是死循环了
Matlab才开始学不知道问题在哪?
哪位能帮忙看看!谢谢了
发表于 2007-11-5 15:51 | 显示全部楼层

回复 #3 joyo 的帖子

在调试的时候可以先将循环的次数减少,运行准确无误之后再增加
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-9 01:53 , Processed in 0.052172 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表