将不同方法进行对比并写入relative文件
#include<stdio.h> #include<stdlib.h> //对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 i=0; int j=0; int p=0; //用于排序的degeree,ec,rate int degree[2000]; float ec[2000]; float rate[2000]; //记录节点真实的degeree,ec,rate int degree1[2000]; float ec1[2000]; float rate1[2000]; //记录节点变化 int dflag[2000]; int eflag[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%f",&a,&b,&c); degree[i]=a; ec[i]=b; rate[i]=c; degree1[i]=a; ec1[i]=b; 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( 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("\n-------\n"); for( int k=0;k<line;k++) { printf("%f ",ec[k]); } */ //计算相关性 //节点比例依次从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; 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 \n",1.0-(x1/x2)); 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 \n",1.0-(x1/x2)); fprintf(fp2,"%.3f %.6f %.6f\n",i,num1,num2); } } int main(){ char* str="E:\\data_set\\result2a.txt";//传入的文件必须没有空格 sortByRate( str,2000); return 0; }