• 源码


    相关性:

    #include<stdio.h>
    #include<stdlib.h>
    //kendall相关系数 
    //传入两个数组,以及数组元素个数,计算这两个数组元素的Kendall相关性
    double kendall(double X[],double Y[],int line)
    {
    
        /*
            int **edge;
            edge=(int **)malloc(G->vexnum*sizeof(int *));
            for(int i=0; i<G->vexnum; i++)
            {
                edge[i]=(int *)malloc(G->vexnum*sizeof(int));
            }
            */
        double info1[line];
        int info2[line];
        double info3[line];
        int info4[line];
        for(int i=0; i<line; i++)
        {
            info1[i]=0.0;
            info2[i]=0;//集合Y上,小集合中的元素个数 
            info3[i]=0.0;
            info4[i]=0;//集合X上 ,小集合中元素个数 
        }
        int k=0;//Y集合中小集合的数目 
        for(int j=0; j<line; j++)
        {
            int judge=0;
            if(k>0)
            {
                for(int m=0; m<k; m++)
                {
                    if( Y[j]==info1[m])//如果当前元素之前已经被记录则不再进行查找  
                    {
                        judge=1;
                    }
                }
            }
            if(judge==0)
            {
                info1[k]=Y[j];//记录当前元素,并以此构成小集合 
                int n=1;
                for(int m=j+1; m<line; m++)
                {
                    if(Y[m]==Y[j])
                        n++;;
                }
                info2[k]=n;//将该元素构成小集合中元素的数目记录 
                k++;//小集合的数目 
            }
        }
        int k2=0;//X集合中小集合的数目 
        for(int j=0; j<line; j++)
        {
            int judge=0;
            if(k2>0)
            {
                for(int m=0; m<k2; m++)
                {
                    if( X[j]==info3[m])
                    {
                        judge=1;
                    }
                }
            }
    
            if(judge==0)
            {
                info3[k2]=X[j];//记录当前元素,并以此构成小集合 
                int n=1;
                for(int m=j+1; m<line; m++)
                {
                    if(X[m]==X[j])
                        n++;;
                }
                info4[k2]=n;
                k2++;
            }
        }
        int C=0,D=0;//分别记录一致性元素和不一致性元素个数 
        double N1=0.0,N2=0.0;
        for(int i=0; i<line; i++)
        {
            if(i<k)
            {
                N2+=0.5*info2[i]*(info2[i]-1);
            }
            if(i<k2)
            {
                N1+=0.5*info4[i]*(info4[i]-1);
            }
            for(int j=i+1; j<line; j++)
            {
                if((X[i]>X[j]&&Y[i]>Y[j])||(X[i]<X[j]&&Y[i]<Y[j]))
                    C++;
                else if((X[i]>X[j]&&Y[i]<Y[j])||(X[i]<X[j]&&Y[i]>Y[j]))
                    D++;
            }
        }
        double N3=line*(line-1)/2.0;
        double kendall=((C-D)*1.0)/sqrt((N3-N1)*(N3-N2));//eb和rb
        return kendall;
    }
    
    
    //对rate和ec和degree进行排序
    //str传入需要排序的文件,line传入文件行数即节点数
     void sortByRate(char* str,int line){
         FILE* fp;
        
         float ex;//用于rate和ec的比较
         int ex1;//用于degree的比较
         int temp;
        int a;
        float b;
        float c;
        int d;
        int i=0;
        int j=0;
        int p=0;
        //用于排序的degeree,ec,rate
        int degree[2000];
        float ec[2000];
        int kcore[2000];
        float rate[2000];
        
        //记录节点真实的degeree,ec,rate
        int degree1[2000];
        float ec1[2000];
        int kcore1[2000];
        float rate1[2000];
    //记录节点变化
        int dflag[2000];
        int eflag[2000];
        int kflag[2000];
        int rflag[2000];
    
        fp=fopen(str,"r");
        char buf[1024];
        char StrLine[1024];
        if((fp=fopen(str,"r"))==NULL)
        {
        perror("faile to read");
        exit(1);
        }
    int max=0;
    while(!feof(fp))//因为行数等于边数,则读取行数个就可以把其他的节点的连接读完
        {
    
    fgets(StrLine,1024,fp);
    sscanf(StrLine,"%d%f%d%f",&a,&b,&d,&c);
    
         degree[i]=a;
         ec[i]=b;
         rate[i]=c;
         kcore[i]=d;
    
         degree1[i]=a;
         ec1[i]=b;
         kcore1[i]=d;
         rate1[i]=c;
    
        i++;
        
        
        }
     
    //对感染率排序
        for( p=0;p<line;p++)
        {
        rflag[p]=p;
        }
         for(i=0;i<line;i++){
             for( j=0;j<line-i-1;j++){
                 if(rate[j]<rate[j+1]){
                    temp=rflag[j];
                    rflag[j]=rflag[j+1];
                    rflag[j+1]=temp;
                     
                    ex=rate[j];
                    rate[j]=rate[j+1];
                    rate[j+1]=ex;
                     }
                
            
                                        }
                                 }
    //对度排序
    for( p=0;p<line;p++)
        {
        dflag[p]=p;
        
        }
         for(i=0;i<line;i++){
             for( j=0;j<line-i-1;j++){
                 if(degree[j]<degree[j+1]){
                    temp=dflag[j];
                    dflag[j]=dflag[j+1];
                    dflag[j+1]=temp;
                     
                    ex1=degree[j];
                    degree[j]=degree[j+1];
                    degree[j+1]=ex1;
                     }
                
            
                                        }
                                 }
     
      /*//测试 
      for(i=0;i<line;i++) {
          printf("%d ",degree[i] );
          
          
      }   printf("
    "); 
        for(i=0;i<line;i++) 
        printf("%d ",dflag[i]);    */            
    //对kcore进行排序
     for( p=0;p<line;p++)
        {
        kflag[p]=p;
        
        }
         for(i=0;i<line;i++){
             for( j=0;j<line-i-1;j++){
                 if(kcore[j]<kcore[j+1]){
                    temp=kflag[j];
                    kflag[j]=kflag[j+1];
                    kflag[j+1]=temp;
                     
                    ex1=kcore[j];
                    kcore[j]=kcore[j+1];
                    kcore[j+1]=ex1;
                     }
                
            
                                        }
                                 }
                                 
    /*
    //测试 
      for(i=0;i<line;i++) {
          printf("%d ",kcore[i] );
          
          
      }   printf("
    "); 
        for(i=0;i<line;i++) 
        printf("%d ",kflag[i]); 
        */ 
    //对特征向量中心性排序
    for( p=0;p<line;p++)
        {
        eflag[p]=p;
        }
         for(i=0;i<line;i++){
             for( j=0;j<line-i-1;j++){
                 if(ec[j]<ec[j+1]){
                    temp=eflag[j];
                    eflag[j]=eflag[j+1];
                    eflag[j+1]=temp;
                     
                    ex=ec[j];
                    ec[j]=ec[j+1];
                    ec[j+1]=ex;
                     }
                
            
                                        }
                                 }
       
     /*
     //测试 
      for(i=0;i<line;i++) {
          printf("%f ",ec[i] );
          
          
      }   printf("
    "); 
        for(i=0;i<line;i++) 
        printf("%d ",eflag[i]);
       
       */ 
        
        /*
        //比较数值所属节点从大往小排
        for(int k=0;k<line;k++)
        {
        
        printf("%d ",eflag[k]);
        }
        //比较的数值从大往小排
        printf("
    -------
    ");
        for( int k=0;k<line;k++)
        {
            printf("%f ",ec[k]);
        
        }
        
        */
        
       
        //计算kendall(进行比较的参数,进行比较的参数,个数)1111111111111111111111111111111111111111111111111111111111
        double de=kendall(degree1,rate1,2000);
        //printf("degree= %f 
    ",de); 
        double e=kendall(ec1,rate1,2000);
        //printf("ec1= %f 
    ",e); 
        double k=kendall(kcore1,rate1,2000);
        //printf("kcore= %f 
    ",k);
        printf("%f        %f        %f
    ",de,e,k); 
    
        
        
        //计算相关性
        //节点比例依次从0.05到0.2(i=比例*2000)
        FILE* fp2;
        char* str2="E:\data_set\relative18b.txt";//写入结果的文件 
        fp2=fopen(str2,"w");
         for(int nodeNum=10;nodeNum<=400;nodeNum=nodeNum+10){
        float i;
        i=nodeNum/2000.0;//nodeNum占总个数的比例 
        int k=0;
        float x1=0;
        float x2=0;
        float num1=0;
        float num2=0;
        float num3=0;
        //按照度 
         for( k=0;k<nodeNum;k++)
        {
        x1+=rate1[dflag[k]];
    
        }
        for( k=0;k<nodeNum;k++)
        {
        x2+=rate[k];
        }
        num1=1.0-(x1/x2);
        //printf("degree is: %f 
    ",1.0-(x1/x2));
        
    
        //按照ec 
         for( k=0;k<nodeNum;k++)
        {
        x1+=rate1[eflag[k]];
       
        
        }
        for( k=0;k<nodeNum;k++)
        {
        x2+=rate[k];
        }
        num2=1.0-(x1/x2);
        //printf("the ec is: %f 
    ",1.0-(x1/x2));
          
          //按照kcore 
         for( k=0;k<nodeNum;k++)
        {
        x1+=rate1[kflag[k]];
        }
        for( k=0;k<nodeNum;k++)
        {
        x2+=rate[k];
        }
        num3=1.0-(x1/x2);
        
        
        fprintf(fp2,"%.3f        %f        %f         %f
    ",i,num1,num2,num3);
        
        
        
    }
     } 
    
    
    int main(){
        
        char* str="E:\data_set\result18b.txt";//传入的文件必须没有空格 
        
        
        sortByRate( str,2000);
        
        return 0;
    }

    复杂网络:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<malloc.h>
    #include<math.h>
    #include<time.h>
    #define MaxVertexNum 90000
    #define RAND_MAX 0x7fff 
    //边表节点
    typedef struct node
    {
    int adjvex;
    struct node *next;
    int visit;
    }EdgeNode;
    //顶点表节点
    typedef struct vnode
    {
    int vertex;
    int KS;//k-core
    float ec;//特征向量中心性
    int is_infected;
    int nodeState;
    int is_visit;
    int layer;//
    int degree;//该节点的度
    EdgeNode* firstedge;//指向边表的指针
    }VertexNode;
    typedef VertexNode AdjList[MaxVertexNum];
    //图的结构
    typedef struct
    {
    AdjList adjlist;//顶点表(类似于数组的)
    int vexnum;//顶点个数
    int arcnum;//边个数
    }ALGraph;
    //返回文件行数(网络边数),有换行符"
    "就为一行
    int lines(char* str)
    {
    int c;
    FILE* fp;
    int lines=0;
    fp=fopen(str,"r");
    if(fp)
        {
        while((c=fgetc(fp))!=EOF)
            if(c=='
    ')
                lines++;
            fclose(fp);
        }
    return lines;
    }
    //返回文件最大数(网络节点数)
    int max(char* str)
    {
    FILE* fp;
    char* p;
    int line=lines(str);
    int i=0;
    int a=0;
    int b=0;
    fp=fopen(str,"r");
    char buf[1024];
    if((fp=fopen(str,"r"))==NULL)
        {
        perror("fail to read");
            exit(1);
        }
    //把文件的内容给buf
    
    while(fgets(buf,line,fp)!=NULL)
        {
    
    
    //p就没有    
        p=buf;
    sscanf(p,"%d %d",&a,&b);//输入源为p
    
        //i始终为最大的
        if(a>i)
            i=a;
        if(b>i)
            i=b;
        }
    
    return i;
    }
    //创建图
    void createAlgraph(ALGraph*  G,char* str)
    {
    FILE* fp;
    int line=lines(str);
    int node=max(str);//其中最大数
    G->vexnum=node+1;//因为是从0开始,所以+1,多了一个0 
    G->arcnum=line;
    fp=fopen(str,"r");
    char buf[1024];
    int len;
    int m;
    int n;
    EdgeNode* s;
    char* p;
    int a=0;
    int b=0;
    int i=0;
    char StrLine[1024];
    //每个节点的顶点表(vn1(i),vn2(i))
    int vn1[line];//这里本来要用vn[line],如果是vc++就不能通过编译,有多少行就有多少(i,j)
    int vn2[line];
    //顶点录入
    for(int j=0;j<G->vexnum;j++)
        {
        G->adjlist[j].vertex=j;
        G->adjlist[j].firstedge=NULL;
        G->adjlist[j].nodeState=1;
        }
    if((fp=fopen(str,"r"))==NULL)
        {
        perror("faile to read");
        exit(1);
        }
    
    while(!feof(fp))//因为行数等于边数,则读取行数个就可以把其他的节点的连接读完
        {
    
    fgets(StrLine,1024,fp);
    sscanf(StrLine,"%d%d",&a,&b);
    
        vn1[i]=a;
        vn2[i]=b;
        i++;
        }
    
    //边节点放入链表
    //一行就是一个坐标,有多少行就有多少坐标 
    for(int k=0;k<line;k++)//有多少行就有多少节点,每个节点对应一个边链
        {
        m=vn1[k],n=vn2[k];
        int ii=0;
        EdgeNode* p;
        p=G->adjlist[m].firstedge;
        while(p!=NULL)
            {
            if(p->adjvex==n)
                {
                ii=1;
                break;
                }
            p=p->next;
            }
        if(ii!=1)
            {
            s=(EdgeNode*)malloc(sizeof(EdgeNode));
            s->adjvex=n;//相连接的顶点
            s->next=NULL;
            s->next=G->adjlist[m].firstedge;//类似于自己写的链表 
            G->adjlist[m].firstedge=s;
            //无向图 有来回
            s=(EdgeNode*)malloc(sizeof(EdgeNode));
            s->adjvex=m;
            s->next=NULL;
            s->next=G->adjlist[n].firstedge;
            G->adjlist[n].firstedge=s;
            }
        }
    //深度为每个节点后面连接的链长度
    EdgeNode* q;
    for( i=0;i<G->vexnum;i++)
        {
        int k=0;
        q=G->adjlist[i].firstedge;
        while(q!=NULL)
            {
            k++;
            q=q->next;
            }
        G->adjlist[i].degree=k;    
        }
        
    }
    //打印邻接表
    void printGraph(ALGraph* G)
    {
            EdgeNode* s;
        for(int i=0;i<G->vexnum;i++)
            {
            
            s=G->adjlist[i].firstedge;//s为一个带adjvex,next指针的边表节点 
        
            while(s)
                {
                printf("(%d,%d)",G->adjlist[i].vertex,s->adjvex);    
                s=s->next;
                }
            printf("
    ");
            }
    }
    //所属层插入
    void insertLayer(ALGraph* G,int layer)
    {
    for(int i=0;i<G->vexnum;i++)
        {
        G->adjlist[i].layer=layer;
        }
    }
    //打印度中心性
    void printDegreeCentrality(ALGraph* G)
    {
        
    for(int i=0;i<G->vexnum;i++)
        {
        
        printf("node %d dgree centrality is:%d
    ",i,G->adjlist[i].degree);
        
        }
    }
    
    
    //计算特征向量中心性
    void eigenvector_centrality(ALGraph *G)
    {
        float e[G->vexnum];//记录上一次的指标(最终的特征向量中心性指标 ,因为会把最终的计算赋值给e);下面都用指标代表特征向量指标
        float e1[G->vexnum];//记录这一次的指标 
        float max = 0;//这一次的最大指标 
        float max1 = 0;//记录上一次最大指标 
        int  flag=0;//当flag=1时,代表找到各个指标 
        for(int i=0; i<G->vexnum; i++)
        {
            e[i]=1;//将每个点初始化为1 
            e1[i]=0;
        }
        EdgeNode *p;
        p=(EdgeNode*)malloc(sizeof(EdgeNode));
        //循环开始 
        while(flag==0)
        {
            max1=max;//max1为上一次的最大值 
            max=0;
            for (int i=0; i<G->vexnum; i++)
            {
                p=G->adjlist[i].firstedge;
                while(p!=NULL)
                {
                    e1[i]+=e[p->adjvex];//第一次的计算结果为他们各自的度 
                    p=p->next;
                }
                if(e1[i]>max)
                    max=e1[i];//记录本次的最大指标 
            }
            for(int i=0; i<G->vexnum; i++)
            {
                if(e[i]!=e1[i])
                    break;
                if(i==G->vexnum-1)
                    flag=1;//两次计算结果相同结束循环 
            }
            if((1.0/max1-1.0/max)<0.01&&(1.0/max1-1.0/max)>-0.01)
                flag=1;//当差值较小时也可结束循环 
                //保留这次的结果到e中,并且将ei重置为0,方便下次计算 
            for(int i=0; i<G->vexnum; i++)
            {
                e[i]=e1[i]; 
                e1[i]=0;
            }
        }
        for(int i=0; i<G->vexnum; i++)
        {
            e[i]=e[i]/max;
            G->adjlist[i].ec=e[i];
        }
    }
    /*
    1.SIR传播模型,改变node.state(0为感染,1为易感染,2为恢复。所有节点初始化为1) 
    2.SIR函数主要操作感染点,感染点会做两件事:①感染易感节点;②感染节点恢复 
    3.传播完成的标志为不能再感染新的节点,并返回处于恢复节点的个数 
    */
    void SIR1(ALGraph* G,int a,double inf,double rec,char* str)
    //传入的分别为网络,感染节点,感染率,恢复率,写入的文件 
    {
        double rate;//传入节点作为感染节点的感染规模 
        
        int i=0;
        
        int sum=0;//统计100次传播后的结果 
        FILE* fp;
        
        fp=fopen(str,"at"); 
        //所有节点最开始为易感态 
        for(int k=0;k<100;k++)
        {    
            int Inf[G->vexnum];
            int newInf[G->vexnum];
            int recnum=0;//统计传播结束后,处于恢复状态的节点个数
            for(i=0;i<G->vexnum;i++)
            {
                G->adjlist[i].nodeState=0;
            } 
    //给感染节点赋值 
        G->adjlist[a].nodeState=1;//传入的j节点a为感染态 
        //把感染节点交给数组 
        Inf[0]=a;
        double infection=inf;//感染概率 
        int count=1;//当前网络中的感染个数
        srand((unsigned)time(NULL)); //设置种子,用于随机数产生 
        while(count>0)//还能继续感染 
        {
            int newInfLength=0;//表示新感染节点的个数 
            //节点感染 
            for(i=0;i<count;i++)
            {
                int vert=Inf[i];//当前的感染点 
                
                EdgeNode* p;
                
                p=G->adjlist[vert].firstedge;
                //用当前节点去感染其他节点
                while(p!=NULL)
                {
                    int n=0; 
                    double infect_rate;//感染的概率为1-(1-λ)^n;其中λ为感染率,n为周围节点是感染者的个数 
                    double test=rand()/(double)RAND_MAX;//rand()产生随机数为[1,32767],RAND_MAX设置为32767,那么test范围[0.1] ;
                     //计算n
                    int nodej=p->adjvex;//记录当前连接的节点
                    //用s查看当前连接节点的周围有多少感染者 
                    EdgeNode* s=G->adjlist[nodej].firstedge;
                    while(s!=NULL)
                    {
                        if(G->adjlist[s->adjvex].nodeState==1)
                        {
                            n++;
                        }
                        s=s->next;
                    }
                     //计算感染率infect_rate
                     infect_rate=1.0-pow(1.0-infection,n);
                    
                    //如果随机数比感染概率小(能感染),且节点状态为易感染,就感染该节点 
                    if(test<=infect_rate&&G->adjlist[nodej].nodeState==0)
                    {
                    newInf[newInfLength]=nodej;
                    G->adjlist[nodej].nodeState=1;//被感染 
                    newInfLength++;    
                    }
                    p=p->next; 
                } 
            }
            //感染节点恢复(不包括上一步新感染的)
             for(i=0;i<count;i++)
             {
                 double recovRate=rec;
                 double test_1=rand()/(double)RAND_MAX;//rand()产生随机数为[1,32767],RAND_MAX设置为32767,那么test范围[0.1] 
                 //此处当恢复率设置为1时所有感染节点都能恢复 
                 //恢复分两种情况:1.能恢复,改变nodeState为2;2.不能恢复,放入新感染数组 
                 if(test_1<=recovRate)
                 {
                     G->adjlist[Inf[i]].nodeState=2;
                  } 
                  else
                  {
                      newInf[newInfLength]=Inf[i];
                      newInfLength++;
                  }
             }
             //newInf数组中元素两个来源:1.易感染节点被感染;2.感染节点未恢复 
             //再把新感染的数组newInf交给Inf进行下一次循环
             for(i=0;i<newInfLength;i++)
             {
                 Inf[i]=newInf[i];
                 
              } 
             
              count=newInfLength;//记录当前新感染的个数,作为继续循环的依据 
        }
        for(i=0;i<G->vexnum;i++)
        {
            if(G->adjlist[i].nodeState==2)
            {
            
            recnum++;    
            }
         }
         sum+=recnum;
    //     //重置所有会节点状态 ,作为下一轮感染准备 
    //     recnum=0;
    ////     Inf[G->vexnum]={0};
    ////    newInf[G->vexnum]={0};
    //    for(i=0;i<G->vexnum;i++)
    //    {
    //        G->adjlist[i].nodeState=;
    //     } 
             } 
          rate=(sum*1.0)/(G->vexnum*100); 
        fprintf(fp,"%d    %lf     %lf
    ",G->adjlist[a].degree,G->adjlist[a].ec,rate);
        //重置所有节点的node.state
        
        fclose(fp);
        return;
        
    }
    
    void SIR(ALGraph *G,char* str,double beta)
    {
        //0:易感染 1:感染 2:恢复 
        double gama=1.0;
        srand(time( NULL ));
        int sum_of_recovered;
        int sum_of_infected;
        FILE *fp;
        fp=fopen(str,"w");
        for(int node=0;node<G->vexnum;node++)
        {
            printf("%d  ",node);
            int sum=0;
            for(int k=0; k<100; k++)
            {
                sum_of_recovered =0;
                //先把所有节点设置为易感染 
                for(int i=0; i<G->vexnum; i++)
                    G->adjlist[i].is_infected=0;
                    //最初那个节点设置为感染 
                G->adjlist[node].is_infected=1;
                sum_of_infected=1;
                //下面的while中一轮一轮的把所有节点进行感染 
                while(1)
                {
                    //记录所有节点的感染状态 
                    int temp[G->vexnum];
                    for(int i=0; i<G->vexnum; i++)
                        temp[i]=G->adjlist[i].is_infected;
                        //下面把所有节点进行判断是否感染或易感 
                    for(int i=0; i<G->vexnum; i++)
                    {
                        if(G->adjlist[i].is_infected==0)
                        {
                            EdgeNode *p;
                            p=G->adjlist[i].firstedge;
                            int count=0;//统计易感旁边感染的个数,用于计算感染的概率 
                            while(p!=NULL)
                            {
                                if(temp[p->adjvex]==1)
                                    count++;
                                p=p->next;
                            }
                            double infect_rate=1-pow(1.0-beta,count);
                            if(rand()/(double)RAND_MAX<=infect_rate)
                            {
                                G->adjlist[i].is_infected=1;
                                sum_of_infected++;
                            }
                        }
                        else if(G->adjlist[i].is_infected==1)
                        {
                            if(rand()/(double)RAND_MAX<=gama)
                            {
                                G->adjlist[i].is_infected=2;
                                sum_of_infected--;
                                sum_of_recovered++;
                            }
                        }
                    }
                    if(sum_of_infected==0)
                        break;
                }
                sum+=sum_of_recovered;
            }
            double rate=(sum*1.0)/(G->vexnum*100.0);
            fprintf(fp,"%d    %lf     %lf
    ",G->adjlist[node].degree,G->adjlist[node].ec,rate);
        }
        fclose(fp);
    }
    
    void DoubleNetworkSIR(ALGraph *G1,ALGraph* G2,ALGraph* G3,char* str,char* str1,double beta1,double beta2,double beta3,double beta4) 
    {    
        //传入参数依次为(网络G1.连接边G2,网络G3,写入G1结果的文件,写入G2结果的文件,G1中的传播率,G2中的传播率,G1->G3,G3->G1) 
        //0:易感染 1:感染 2:恢复 
        double gama=1.0;
        srand(time( NULL ));
        int sum_of_recovered;
        int sum_of_infected;
        FILE *fp;
        fp=fopen(str,"w");
        FILE *fp1;
        fp1=fopen(str1,"w");
        for(int node=0;node<(G1->vexnum+G3->vexnum);node++)
        {
            printf("%d  ",node);
            int sum=0;
            for(int k=0; k<100; k++)
            {
                sum_of_recovered =0;
                //先把所有节点设置为易感染 
                for(int i=0; i<G1->vexnum; i++)
                    G1->adjlist[i].is_infected=0;
                for(int i=0; i<G3->vexnum; i++)
                    G3->adjlist[i].is_infected=0;
                    //最初那个节点设置为感染(需要区分两个不同的网络)
                if(node<G1->vexnum) 
                G1->adjlist[node].is_infected=1;
                else
                G3->adjlist[node-(G1->vexnum)].is_infected=1;
                sum_of_infected=1;
                //下面的while中一轮一轮的把所有节点进行感染 
                while(1)
                {
                    
                    
                    //记录所有节点的感染状态 
                    int temp1[G1->vexnum];//G1中的感染点 
                    int temp2[G3->vexnum];//G3中的感染点 
                    for(int i=0; i<G1->vexnum; i++)
                        temp1[i]=G1->adjlist[i].is_infected;
                    for(int i=0; i<G3->vexnum; i++)
                        temp2[i]=G3->adjlist[i].is_infected;
                        //下面把所有节点进行判断是否感染或易感 
                        //G1中的点 
                    for(int i=0; i<G1->vexnum; i++)
                    {
                        if(G1->adjlist[i].is_infected==0)
                        {
                            EdgeNode *p;
                            p=G1->adjlist[i].firstedge;
                            int count1=0;//统计易感旁边感染的个数,用于计算感染的概率 (先统计自己网络的,再统计相连接网络的) ,这里为G1中的邻居 
                            int count2=0;//统计G3中的邻居 
                            while(p!=NULL)
                            {
                                if(temp1[p->adjvex]==1)
                                    count1++;
                                p=p->next;
                            }
                            //需要判断这个点是否与G3中的点相连(根据这个点是否在G2判断) 
                             EdgeNode *s;
                             s=G2->adjlist[i].firstedge;
                             //如果相连,看相连G3中的点是否感染 
                             while(s!=NULL)
                             {
                                 if(temp2[s->adjvex]==1)
                                 count2++;
                                 s=s->next;
                             }
                            
                            double infect_rate=1-pow(1.0-beta1,count1)*pow(1.0-beta4,count2);
                            if(rand()/(double)RAND_MAX<=infect_rate)
                            {
                                G1->adjlist[i].is_infected=1;
                                sum_of_infected++;
                            }
                        }
                        else if(G1->adjlist[i].is_infected==1)
                        {
                            if(rand()/(double)RAND_MAX<=gama)
                            {
                                G1->adjlist[i].is_infected=2;
                                sum_of_infected--;
                                sum_of_recovered++;
                            }
                        }
                    }
                    //G3中的点 
                    for(int i=0; i<G3->vexnum; i++)
                    {
                        if(G3->adjlist[i].is_infected==0)
                        {
                            EdgeNode *p;
                            p=G3->adjlist[i].firstedge;
                             int count1=0;//统计易感旁边感染的个数,用于计算感染的概率 
                             int count2=0;//统计G3的邻居 
                            while(p!=NULL)
                            {
                                if(temp2[p->adjvex]==1)
                                    count2++;
                                p=p->next;
                            }
                            //需要判断这个点是否与G1中的点相连(根据这个点是否在G2判断) 
                             EdgeNode *s;
                             s=G2->adjlist[i].firstedge;
                             //如果相连,看相连G3中的点是否感染 
                             while(s!=NULL)
                             {
                                 if(temp1[s->adjvex]==1)
                                 count1++;
                                 s=s->next;
                             }
                            
                            double infect_rate=1-pow(1.0-beta3,count1)*pow(1.0-beta2,count2);
                            if(rand()/(double)RAND_MAX<=infect_rate)
                            {
                                G3->adjlist[i].is_infected=1;
                                sum_of_infected++;
                            }
                        }
                        else if(G3->adjlist[i].is_infected==1)
                        {
                            if(rand()/(double)RAND_MAX<=gama)
                            {
                                G3->adjlist[i].is_infected=2;
                                sum_of_infected--;
                                sum_of_recovered++;
                            }
                        }
                    }
                    
                    if(sum_of_infected==0)
                        break;
                }
                sum+=sum_of_recovered;
            }
            double rate=(sum*1.0)/((G1->vexnum+G3->vexnum)*100.0);
            if(node<G1->vexnum)
            fprintf(fp,"%d    %lf      %d      %lf
    ",G1->adjlist[node].degree,G1->adjlist[node].ec,G1->adjlist[node].KS,rate);
            else
            fprintf(fp1,"%d    %lf      %d     %lf
    ",G3->adjlist[node-(G1->vexnum)].degree,G3->adjlist[node-(G1->vexnum)].ec,G3->adjlist[node-(G1->vexnum)].KS,rate);
        }
        fclose(fp);    
        fclose(fp1);    
    }
    
    //创建连接的边,并写入文件
    void createLink(char* str)
    {
        FILE* fp;
        fp=fopen(str,"w");
        srand((unsigned)time(NULL));
        for (int i=0;i<2000;i++)
        {
            fprintf(fp,"%d    %d
    ",rand()%2000,rand()%2000); 
        //fpintf(fp,"%d    %d",rand()%2000,rand()%2000);
        }
        fclose(fp);
     } 
    //写入K-core
    void Kshlle(ALGraph *G)
    {
        int count;
        int i=0;
        int ksnum=0;
        int k=1;
        for(int j=0; j<G->vexnum; j++)
        {
            G->adjlist[j].KS=0;
            EdgeNode *s;
            s=(EdgeNode*)malloc(sizeof(EdgeNode));
            s=G->adjlist[j].firstedge;
            while(s!=NULL)
            {
                s->visit=0;
                s=s->next;
            }
        }
        while(ksnum<G->vexnum)
        {
            int count2=0;//用来判断当前KS值为k的是否找完
            for(i=0; i<G->vexnum; i++)
            {
                if(G->adjlist[i].KS==0)
                {
                    EdgeNode *p;
                    count=0;
                    p=G->adjlist[i].firstedge;
                    while(p!=NULL)
                    {
                        if(p->visit==0)
                            count++;
                        p=p->next;
                    }
                    if(count<=k)
                    {
                        count2++;
                        ksnum++;
                        int num;
                        EdgeNode *s;
                        EdgeNode *q;
                        s=G->adjlist[i].firstedge;
                        while(s!=NULL)
                        {
                            //如果没有访问过,则在两个点出把对方互相标记
                            if(s->visit==0)
                            {
                                s->visit=1;
                                num=s->adjvex;
                                q=G->adjlist[num].firstedge;
                                while(q!=NULL)
                                {
                                    if(q->adjvex==G->adjlist[i].vertex)
                                        q->visit=1;
                                    q=q->next;
                                }
                            }
                            s=s->next;
                        }
                        if(count<=k)
                            G->adjlist[i].KS=k;
                    }
                }
            }
            if(count2==0)
                k++;
        }
    } 
    //计算网络阈值
    void value(ALGraph *G)
    {
        int x=0,y=0;
        for(int i=0; i<G->vexnum; i++)
        {
            x+=G->adjlist[i].degree;
            y+=((G->adjlist[i].degree)*(G->adjlist[i].degree));
        }
        x=(x*1.0)/(G->vexnum*1.0);
        y=(y*1.0)/(G->vexnum*1.0);
        double val=(x*1.0)/((y-x)*1.0);
        printf("%lf  ",val);
    } 
    int main()
    {
    
    char* str1="E:\data_set\netsci1.txt";//G1,网络 
    char* str2="E:\data_set\netsci2.txt";//G2,连边 
    char* str3="E:\data_set\netsci3.txt";//G3,网络 
     createLink(str2);//创建连边 
    
    //G1、G3为两个网络,G2为他们的连接
    ALGraph* G1;
    ALGraph* G2;
    ALGraph* G3;
    G1=(ALGraph*)malloc(sizeof(ALGraph));
    G2=(ALGraph*)malloc(sizeof(ALGraph));
    G3=(ALGraph*)malloc(sizeof(ALGraph));
    //创建三个表的信息 
    createAlgraph(G1,str1);//分别插入图的地址,连接顶点信息
    createAlgraph(G2,str2);
    createAlgraph(G3,str3);
    //插入层数
    insertLayer(G1,1);
    insertLayer(G3,2);
    //计算特征向量中心性 
    eigenvector_centrality(G1);
    eigenvector_centrality(G3);
    //计算k-core
    Kshlle(G1);
    Kshlle(G3);
    //计算爆发阈值
    //value(G1);//结果为0.057692,要取其两倍 
    //value(G3); 
    //SIR,此处为单个节点推动 
    char* str4="E:\data_set\result20a.txt";
    char* str5="E:\data_set\result20b.txt";
     
    //{
    //printf("%d ",i);    
    //SIR1(G1,i,0.08,1,str4);    
    //}
    //SIR(G1,str4,0.08); 
    //先固定beta3为0.3改变beta4依次为0.1 0.3 0.5 0.7 0.9 
    DoubleNetworkSIR(G1,G2,G3,str4,str5,0.115384,0.115384,0.8,0.3);
    
    
        return 0;
    }
  • 相关阅读:
    threading学习
    Python基础-5
    BS4
    requests基础
    Python基础-4
    Python基础-3
    Python基础-2
    Python基础-1
    DevOps
    nginx配置ssl证书实现https
  • 原文地址:https://www.cnblogs.com/miaobo/p/12950559.html
Copyright © 2020-2023  润新知