⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 suijitu.m

📁 在matlab中
💻 M
字号:
% function [p,D]=suijitu()
function suijitu()
disp('随机图生成策略1或2,')
disp('1表示边连接的概率[0,1]内均匀随机数比较,若p(i,j)>random_data,则连接节点i,j.直至总共生成的边数为N*(N-1)/2*alph');
disp('2表示将概率从大到小排序,连接概率排在前面的节点对,直至总共生成的边数为N*(N-1)/2*alph,并以一定的较小的概率对边随机重连');
pp=input('请输入随机图生成策略1或2:');
N=100;
alph=0.25;
beta=0.5;
randData=rand(2,N)*1000;
x=randData(1,:);
y=randData(2,:);
p=lianjiegailv(x,y,alph,beta,N);

switch  pp
    case 1
         D=bian_lianjie1(p,N,alph);
    case 2
         relink=input('请输入边重新连接的概率:');
         D=bian_lianjie2(p,N,alph,relink);
    otherwise
        disp('The number pp you input is wrong');
end
 disp(['该随机图的边数为:',int2str(sum(sum(D)))]);
 disp('该随机图的平均路径长路为:');
 disp('该随机图的聚类系数为:');
 disp('该随机图的平均度为:');

 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:N 
    for j=i+1:N
        if D(i,j)~=0
            plot([x(i),x(j)],[y(i),y(j)]);
            hold on;
        end
    end
end
hold off

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 该函数求解两节点连接边的概率
function p=lianjiegailv(x,y,alph,beta,N)

plot(x,y,'r.','Markersize',18);
hold on;
d=zeros(N);
for i=1:N
    for j=1:N
        d(i,j)=sqrt((x(i)-x(j))^2+((y(i)-y(j)))^2);
    end
end
L=max(max(d));
for i=1:N
    for j=1:N
        p(i,j)=alph*exp(-d(i,j)/beta/L);
    end
        p(i,i)=0;
end
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 生成机制1:与[0,1]内均匀随机数比较,若p(i,j)>random_data,则连接节点i,j.
% 直至总共生成的边数为N*(N-1)/2*alph
function D=bian_lianjie1(p,N,alph)   %  返回值D为邻接矩阵
D=zeros(N);num=0;
for k=1:inf
    for i=1:N
        for j=1:N
            random_data=rand(1,1);
            if p(i,j)>=random_data&D(i,j)==0
                D(i,j)=1; D(j,i)=1;
                num=num+1;
                if num>=N*(N-1)/2*alph
                   return ;
                end
            end
        end
    end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 生成机制2:将概率从大到小排序,连接概率排在前面的节点对,直至总共生成的边数为N*(N-1)/2*alph
%% 以一定的较小的随机随机重连,以实现一定程度的随机化。
function D=bian_lianjie2(p,N,alph,relink)
D=zeros(N);
p1=reshape(tril(p),[1,N*N]);
[p2,px]=sort(p1);
M=ceil(N*(N-1)/2*alph);
for i=1:M
    [m,n]=ind2sub(size(p),px(i));  %单下标索引换为双下标索引
    D(m,n)=1;D(n,m)=1;
end

[m,n]=find(tril(D));               %以一定的概率随机化重连
for i=1:length(m)
    random_data1=rand(1,1);
    if relink>random_data1
         D(m(i),n(i))=0;D(n(i),m(i))=0;        
         n1=n(find(m~=m(i)));
         random_data2=randint(1,1,[1,length(n1)]);
         nn=n1(random_data2);
         D(m(i),nn)=1;D(nn,m(i))=1;
    end
end

      
        



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -