matlab no-scale model模拟

原博客地址
这儿是学习并做笔记

N = 1000; m0 = 3;m = 3; %初始结点3,度3 节点数N
adjacent_matrix = sparse(m0,m0);%初始化邻接矩阵
for i = 1:m0
    for j = 1:m0
        if j~=i%去掉自身形成的环
            adjacent_matrix(i,j) = 1;%建立初始临界矩阵
        end
    end
end
adjacent_matrix = sparse(adjacent_matrix);
%之所以多了一个0,是因为基本思想是以线段的长度类比于degree,线段越长,被选中的概率就越大
node_degree = zeros(1,m0+1);
node_degree(2:m0+1) = sum(adjacent_matrix);
for iter = 4:N
    iter
    total_degree = 2*m*(iter - 4)+6;
    %还是上面提到过的,以线段长度类比于degree,所以得用cumsum,也就解释了为什么得多一个0,因为作为线段的边界(开始)
    cum_degree = cumsum(node_degree);
    choose = zeros(1,m);
    %选出第一个和新点相连接的定点
    r1 = rand(1)*total_degree; %计算与已存在点相连的概率
    for i = 1:iter-1
        if(r1>=cum_degree(i))&(r1<cum_degree(i+1))%选取度大的点
            choose(1) = i;
            break
        end
    end
    %选出第二个和新点相连接的顶点
    r2 = rand(1)*total_degree;
    for i = 1:iter-1
        if(r2>=cum_degree(i))&(r2<cum_degree(i+1))
            choose(2) = i;
            break
        end
    end
    while choose(2) == choose(1)
        r2 = rand(1)*total_degree;
        for i = 1:iter-1
            if(r2>=cum_degree(i))&(r2<cum_degree(i+1))
                choose(2) = i;
                break
            end
        end
    end
    %选出第三个和新点相连接的顶点
    r3 = rand(1)*total_degree;
    for i = 1:iter-1
        if(r3>=cum_degree(i))&(r3<cum_degree(i+1))
            choose(3) = i;
            break
        end
    end
    %若选择一样,则重新选择,直到不同为止
    while (choose(3) == choose(1)|choose(3) == choose(2))
        r3 = rand(1)*total_degree;
        for i = 1:iter-1
            if(r3>=cum_degree(i))&(r3<cum_degree(i+1))
                choose(3) = i;
                break
            end
        end
    end
    %把新点加入网络后,对邻接矩阵进行相应的改变!   
    for k = 1:m
        adjacent_matrix(iter,choose(k))=1;
        adjacent_matrix(choose(k),iter)=1;
    end
    node_degree = zeros(1,iter+1);
    node_degree(2:iter+1) = sum(adjacent_matrix);
end
save data adjacent_matrix

猜你喜欢

转载自blog.csdn.net/normol/article/details/79155633
今日推荐