特征向量的方法不仅考虑节
点邻居数量还考虑了其质量对节点重要性的影响.
重要的参考文献:https://blog.csdn.net/yyl424525/article/details/103108506?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
用上述参考文献写出代码(存在问题,无法结束循环)
//计算特征向量中心性 void EigenvectorCentrality(ALGraph* G) { //先定义x[vexnum];并将初值设置为他们的度 int x[G->vexnum]; int y[G->vexnum];//保留上一次的x[i] int flag=0;//判断是否AX=λX //先把度初始化给x[i] for(int i=0;i<G->vexnum;i++) { EdgeNode* s; x[i]=G->adjlist[i].degree; s=G->adjlist[i].firstedge; } //循环执行Ax=x操作,直到AX=λX do{ //先把上一次的x[i]交给y[i] for(int k=0;k<G->vexnum;k++) { y[k]=x[k]; } //计算这一个的x[i] for(int j=0;j<G->vexnum;j++) { EdgeNode* s; s=G->adjlist[j].firstedge; x[j]=0; while(s!=NULL) { x[j]+=y[s->adjvex];//用的是上一次的x[i](即y[i])进行相加 s=s->next; } printf("x[%d]=%d ",j,x[j]); } //判断这一次的x[i]/x[i-1],各个节点的结果是否相同 for(int m=1;m<G->vexnum-1;m++) { if(x[m]/y[m]!=x[m-1]/y[m-1]) break; if(x[m]/y[m]==x[m-1]/y[m-1]&&m==G->vexnum-1) flag=1; } }while(flag!=1); for(int n=0;n<G->vexnum;n++) { printf("%d ",x[n]); } }
正确的写法:
//计算特征向量中心性 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]; } }