HITS算法

来源:互联网 发布:淘宝天猫详情页尺寸 编辑:程序博客网 时间:2024/04/29 22:51

本代码实现hits算法的迭代计算和归一化,仅供参考使用,请大家尊重版权~微笑,若需一键下载请移步java实现的hits算法


Main3.java:


package hits;/** * Created by bingo on 16-11-15. */public class Main3 {    public static final int VERTERSNUM=4;    //设定输入几个节点,现在默认为4个,便于对顶点进行赋初值(确定初始中心值和权威值比重),若要增加节点数量请务必在此先更改.    public static void main(String[] args) {        DirectedGraph theGraph = new DirectedGraph();        theGraph.addVertex("A");//4个节点        theGraph.addVertex("B");        theGraph.addVertex("C");        theGraph.addVertex("D");        //添加有向边        theGraph.addEdge(0, 1);        theGraph.addEdge(0, 3);        theGraph.addEdge(1, 3);        theGraph.addEdge(2, 0);        theGraph.addEdge(2, 1);        theGraph.addEdge(3, 2);        System.out.println("visit:");        theGraph.visithits(0.01);        //进行HITS算法,迭代计算中枢值和权威值,        // 收敛条件为0.01,对每个节点的最近两次中心值比重和权威值比重进行分别比较,        // 若所有节点的最近两次中心值比重或权威值比重相差都小0.01则结束迭代    }}


DirectedGraph.java:


package hits;import java.util.ArrayList;/** * Created by bingo on 16-11-15. */public class DirectedGraph {    private final int HUB=1;//中心值    private final int AUTH=0;//权威值    private final int MAX_VERETS=20;//最大顶点数    private Vertex3 vertexList[];// 储存顶点的图    private int adjMat[][];//邻接矩阵    private int nVerts;//当前图的顶点数    private Stack3 theStack;    public DirectedGraph(){//构建有向图        vertexList=new Vertex3[MAX_VERETS];        adjMat=new int[MAX_VERETS][MAX_VERETS];        nVerts=0;        for(int j=0;j<MAX_VERETS;j++) //初始化邻接矩阵,一开始都不相连            for(int k=0;k<MAX_VERETS;k++)                adjMat[j][k]=0;        theStack=new Stack3();    }    //添加顶点,传入一个字符串表示顶点的标志.    public void addVertex(String lab){        vertexList[nVerts++]=new Vertex3(lab);    }    //添加边,连接哪两个点,边的符号1,0    public void addEdge(int start,int end) {        adjMat[start][end] = 1;    }    //展示该顶点的相关值    public void displayVertex(int v){        System.out.println(vertexList[v].lable+" : "                +"(中枢值: "+vertexList[v].hub+")"                +"(权威值: "+vertexList[v].athu+")"                +"(前一次中心值比重: "+vertexList[v].hubs1+")"                +"(本次中心值比重: "+vertexList[v].hubs2+")"                +"(前一次权威值比重: "+vertexList[v].athus1+")"                +"(本次权威值比重: "+vertexList[v].athus2+")"        );    }    //返回一个由v连向j或j连向v的未被访问的顶点    public int getAdjUnvisitedVertex(int v){        for(int j=0;j<nVerts;j++)            if(vertexList[j].wasVisited==false&&(adjMat[v][j]!=0||adjMat[j][v]!=0))                return j;        return -1;    }    //获取连入v节点的所有顶点    public ArrayList<Integer> getAdjInVertex(int v){        ArrayList<Integer> a=new ArrayList<>();        for(int j=0;j<nVerts;j++)            if(adjMat[j][v]!=0)                a.add(j);        return a;    }    //获取v节点连出的所有顶点    public ArrayList<Integer> getAdjOutVertex(int v){        ArrayList<Integer> a=new ArrayList<>();        for(int j=0;j<nVerts;j++)            if(adjMat[v][j]!=0)                a.add(j);        return a;    }    //深度优先算法遍历,计算本阶段的中枢值或权威值.(传入参数为1则表示更新中心值,传入参数为0表示权威值)    private void dfs(int ishub){        vertexList[0].wasVisited=true;        updatehits(0,ishub);//更新中枢值或权威值        theStack.push(0);        while(!theStack.isEmpty()){            int v=getAdjUnvisitedVertex(theStack.peek());            if(v==-1)                theStack.pop();            else{                vertexList[v].wasVisited=true;                updatehits(v,ishub);//更新中枢值或权威值                theStack.push(v);            }        }        for(int j=0;j<nVerts;j++) {            vertexList[j].wasVisited = false;            updatehitsrats(j,ishub);//更新中枢值或权威值比重            displayVertex(j);        }    }    //更新权威值或中心值比重    private void updatehitsrats(int v,int ishub){        int sum=0;        if(ishub==1) {            for (int j = 0; j < nVerts; j++)                sum = sum + vertexList[j].hub;            vertexList[v].hubs1 = vertexList[v].hubs2;            vertexList[v].hubs2 = vertexList[v].hub / (double) sum;        }        else{            for (int j = 0; j < nVerts; j++)                sum = sum + vertexList[j].athu;            vertexList[v].athus1 = vertexList[v].athus2;            vertexList[v].athus2 = vertexList[v].athu / (double) sum;        }    }    //更新权威值或中心值    private void updatehits(int v,int ishub){        ArrayList <Integer> a;        int sum=0;        if(ishub==1)        {            a=getAdjOutVertex(v);            for(int o:a){                sum=sum+vertexList[o].athu;            }            if(sum!=0)                vertexList[v].hub=sum;        }        else        {           a=getAdjInVertex(v);            for(int o:a){                sum=sum+vertexList[o].hub;            }            if(sum!=0)                vertexList[v].athu=sum;        }    }//进行迭代运行HITS算法,迭代计算每个中枢值和权威值,// 收敛条件为0.01,对每个节点的最近两次中心值比重和权威值比重进行分别比较,// 若所有节点的最近两次中心值比重或权威值比重相差都小于p则结束迭代    public void visithits(double p){        int n=1;        do {            System.out.println("\n第"+n+"次循环");            System.out.println("更新权威值");            dfs(AUTH);            System.out.println("更新中心值");            dfs(HUB);            n++;        }while(!isover(p));    }    //遍历所有节点,对每个节点的最近两次中心值比重和权威值比重进行分别比较,    // 若所有节点的最近两次中心值比重或权威值比重相差都小p则返回true;否则返回false.  private boolean isover(double p){        for(int i=0;i<nVerts;i++)        {            if((Math.abs(vertexList[i].athus2-vertexList[i].athus1)>=p)||(Math.abs(vertexList[i].hubs2-vertexList[i].hubs1)>=p))                return false;        }       return true;    }}


Vertex3.java


package hits;/** * Created by bingo on 16-11-15. */public class Vertex3 {    public String lable;//节点标记    public int hub;//中枢值 p指向的所有节点的athu之和    public int athu;//权威值 所有指向p的所有节点的hub之和    public double hubs1;//前一次中枢值比重    public double hubs2;//本次中枢值比重    public double athus1;//前一次权威值比重    public double athus2;//本次权威值比重    public boolean wasVisited;//是否访问过    public Vertex3(String lable) {        this.lable=lable;        this.wasVisited = false;        this.hub=1;        this.athu=1;        hubs1=hubs2=1/(double)Main3.VERTERSNUM;        athus1=athus2=1/(double)Main3.VERTERSNUM;        //这里给顶点的中枢值和权威值比重和赋初值 需要知道当前图中所有的节点数Main3.VERTERSNUM    }}

Stack3.java


package hits;/** * Created by bingo on 16-11-15. */public class Stack3 {    private final int SIZE=20;    private int[] st;    private int top;    public  Stack3()    {        st=new int[SIZE];        top=-1;    }    public void push(int j){        st[++top]=j;    }    public int pop(){return st[top--];    }    public int peek(){        return st[top];    }    public boolean isEmpty(){        return (top==-1);    }}






1 0
原创粉丝点击