如何测试jung的PageRank算法?

时间:2016-03-28 16:39:24

标签: java algorithm jung

我正在尝试为jung测试Pagerank算法,但似乎我遇到了问题。 我用这部分代码创建了一个加权和间接图:

private static String getId(int nodeId) 
    {
        return "Node " + nodeId;
    }

    private static String getId(int nodeId, int neighborId) 
    {
        return "Edge " + nodeId + " -> " + neighborId;
    }


public static Graph<String, Integer> createGraphForPageRank(String graphId, double[][] adjacencyMatrix) 
        {
         Graph<String,Integer> g = new UndirectedSparseGraph <String,Integer>();

            for (int nodeId = 0; nodeId < adjacencyMatrix.length; nodeId++)
                g.addVertex(getId(nodeId));



            for (int nodeId = 0; nodeId < adjacencyMatrix.length; nodeId++)
                for (int neighborId = 0; neighborId < adjacencyMatrix[nodeId].length; neighborId++)
                    if (adjacencyMatrix[nodeId][neighborId]>0)

                     g.addEdge(neighborId,getId(nodeId),getId(neighborId));



            return(g);

       }

然后,在主类中,我使用此代码在我的图表上测试pagerank:

double[][] adjacencyMatrixForPageRank =FileHelper.calculateSimilaritySentences("E:\\my workspace\\TweetsAnalyser2\\outputFiles\\splittedStemmeredFile-1.txt","");
    Graph<String,Integer> g2=FileHelper.createGraphForPageRank("MyGraphForPageRank",adjacencyMatrixForPageRank);
    PageRank<String,Integer> pagerank= new PageRank<String,Integer>(g2,alpha1);
    pagerank.initialize(); 
    pagerank.setTolerance(0.000001);
    pagerank.setMaxIterations(200);
    pagerank.evaluate();

但是eclipse会产生这个错误: 线程“main”中的异常java.lang.IllegalArgumentException:此图中已存在带有端点的edge 4,并且无法使用端点添加     在edu.uci.ics.jung.graph.Abs​​tractGraph.getValidatedEndpoints(AbstractGraph.java:93)     在edu.uci.ics.jung.graph.UndirectedSparseGraph.addEdge(UndirectedSparseGraph.java:64)     在edu.uci.ics.jung.graph.Abs​​tractGraph.addEdge(AbstractGraph.java:60)     在edu.uci.ics.jung.graph.Abs​​tractGraph.addEdge(AbstractGraph.java:55)     在com.tweets.helpers.FileHelper.createGraphForPageRank(FileHelper.java:1496)     在com.tweets.test.Main.main(Main.java:105)

我知道图形创建存在问题,但我不知道如何解决它! 有人可以帮帮我吗。

2 个答案:

答案 0 :(得分:1)

问题似乎是你定义了一个无向图,并且你向它添加了两次相同的节点。其中一个形式为(x,y),另一个形式为(y,x) - 适用于xy的相同值。

通过仅从nodeID迭代你的内循环来解决它,而不是从0开始:

for (int nodeId = 0; nodeId < adjacencyMatrix.length; nodeId++)
   for (int neighborId = nodeId; neighborId < adjacencyMatrix[nodeId].length; neighborId++)
                         ^^^

另外:

g.addEdge(neighborId,getId(nodeId),getId(neighborId));

你的边缘ID并不是唯一的,我认为它应该是唯一的,但我对API的认识还不够熟悉。

答案 1 :(得分:0)

有几个问题导致了您的错误。

(1)正如@amit观察到的那样,由于你的图是无向的,你不需要从x到y添加边,而从y到x添加另一个边。 但是,如果您有以下代码:

g.addEdge(edgeId, x, y);
...
g.addEdge(edgeId, y, x);

第二次调用addEdge()将被忽略,这很好。

(2)您不能将边缘ID重用于不同的事件节点集;那是错误信息告诉你的。边缘对象(和节点对象)类似于地图键:它们必须是唯一的。

您的代码表明您实际上并不关心边缘对象本身,这意味着您只需创建Graph<String, Object>并在添加边缘时执行此操作:

g.addEdge(new Object(), x, y);

在JUNG的下一个版本中,这将变得更加容易,我希望这个版本能在几个月内完成。 :)