特征向量中心性(從文獻中摘抄)


特征向量的方法不僅考慮節
點鄰居數量還考慮了其質量對節點重要性的影響.

 

 

 

   重要的參考文獻: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 \n",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];
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM