zoukankan      html  css  js  c++  java
  • 特征向量中心性(从文献中摘抄)

    特征向量的方法不仅考虑节
    点邻居数量还考虑了其质量对节点重要性的影响.

       重要的参考文献: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];
        }
    }
  • 相关阅读:
    1221D
    1249E
    D. Yet Another Monster Killing Problem
    大佬传送门
    Zookeeper客户端连接报错
    搭建PXC集群
    Docker分布式环境
    Docker使用
    Docker入门
    MySQL数据库集群概述
  • 原文地址:https://www.cnblogs.com/miaobo/p/12485574.html
Copyright © 2011-2022 走看看