#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; info3[i]=0.0; info4[i]=0; } int k=0; 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; 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; } } } //对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( 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(int k=0;k<line;k++) { printf("%d ",eflag[k]); } //比较的数值从大往小排 printf(" ------- "); for( int k=0;k<line;k++) { printf("%f ",ec[k]); } */ //计算kendall(进行比较的参数,进行比较的参数,个数) double q=kendall(degree1,rate1,2000); printf("%f ",q); //计算相关性 //节点比例依次从0.05到0.2(i=比例*2000) FILE* fp2; char* str2="E:\data_set\relative.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+=ec1[dflag[k]]; } for( k=0;k<nodeNum;k++) { x2+=ec[k]; } num1=1.0-(x1/x2); //printf("degree is: %f ",1.0-(x1/x2)); //按照ec for( k=0;k<nodeNum;k++) { x1+=ec1[eflag[k]]; } for( k=0;k<nodeNum;k++) { x2+=ec[k]; } num2=1.0-(x1/x2); //printf("the ec is: %f ",1.0-(x1/x2)); //按照kcore for( k=0;k<nodeNum;k++) { x1+=ec1[kflag[k]]; } for( k=0;k<nodeNum;k++) { x2+=ec[k]; } num3=1.0-(x1/x2); fprintf(fp2,"%.3f %f %f %f ",i,num1,num2,num3); } } int main(){ char* str="E:\data_set\result2b.txt";//传入的文件必须没有空格 sortByRate( str,2000); return 0; }
#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; info3[i]=0.0; info4[i]=0; } int k=0; 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; 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; } } }//对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( 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(int k=0;k<line;k++) { printf("%d ",eflag[k]); } //比较的数值从大往小排 printf("
-------
"); for( int k=0;k<line;k++) { printf("%f ",ec[k]); } */ //计算kendall(进行比较的参数,进行比较的参数,个数)double q=kendall(degree1,rate1,2000);printf("%f ",q); //计算相关性//节点比例依次从0.05到0.2(i=比例*2000)FILE* fp2;char* str2="E:\data_set\relative.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+=ec1[dflag[k]]; } for( k=0;k<nodeNum;k++) { x2+=ec[k]; } num1=1.0-(x1/x2); //printf("degree is: %f
",1.0-(x1/x2));
//按照ec for( k=0;k<nodeNum;k++) { x1+=ec1[eflag[k]]; } for( k=0;k<nodeNum;k++) { x2+=ec[k]; } num2=1.0-(x1/x2); //printf("the ec is: %f
",1.0-(x1/x2)); //按照kcore for( k=0;k<nodeNum;k++) { x1+=ec1[kflag[k]]; } for( k=0;k<nodeNum;k++) { x2+=ec[k]; } num3=1.0-(x1/x2); fprintf(fp2,"%.3f%f%f %f
",i,num1,num2,num3); } }
int main(){ char* str="E:\data_set\result2b.txt";//传入的文件必须没有空格 sortByRate( str,2000); return 0;}