как проверить алгоритм PageRank для Юнга?

Я пытаюсь протестировать алгоритм 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);

       }

затем в основном классе я использовал этот код для проверки рейтинга страниц на моем графике:

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 генерирует эту ошибку: Исключение в потоке «основной» java.lang.IllegalArgumentException: ребро 4 уже существует в этом графе с конечными точками и не может быть добавлено с конечными точками в edu.uci.ics.jung.graph.AbstractGraph.getValidatedEndpoints(AbstractGraph. java:93) на edu.uci.ics.jung.graph.UndirectedSparseGraph.addEdge(UndirectedSparseGraph.java:64) на edu.uci.ics.jung.graph.AbstractGraph.addEdge(AbstractGraph.java:60) на edu.uci .ics.jung.graph.AbstractGraph.addEdge(AbstractGraph.java:55) в com.tweets.helpers.FileHelper.createGraphForPageRank(FileHelper.java:1496) в com.tweets.test.Main.main(Main.java:105) )

Я знаю, что есть проблема с построением графа, но не знаю, как ее решить!!!! Может кто-нибудь, пожалуйста, помогите мне.


person Amira    schedule 28.03.2016    source источник


Ответы (2)


Похоже, проблема в том, что вы определили неориентированный граф и дважды добавили в него один и тот же узел. Один в виде (x,y), а другой в виде (y,x) - для одинаковых значений x и y.

Решите это, повторяя свой внутренний цикл только с 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));

ваш идентификатор края не уникален, как я думаю, он должен быть, но я недостаточно знаком с API, чтобы быть уверенным.

person amit    schedule 28.03.2016
comment
Амира, почему предложение @amit не работает? Он указал на обе проблемы в вашем коде. - person Joshua O'Madadhain; 29.03.2016

Есть несколько проблем, которые привели к вашей ошибке.

(1) Как заметил @amit, поскольку ваш граф неориентирован, вам не нужно добавлять ребро от x до y и еще одно от y до x. Однако, если у вас есть следующий код:

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

Второй вызов addEdge() будет просто проигнорирован, и это нормально.

(2) нельзя повторно использовать идентификаторы ребер для разных наборов инцидентных узлов; это то, что говорит вам это сообщение об ошибке. Пограничные объекты (и объекты-узлы) аналогичны ключам карты: они должны быть уникальными.

Ваш код предполагает, что вы на самом деле не заботитесь о краевых объектах как таковых, а это означает, что вы можете просто создать Graph<String, Object> и сделать это при добавлении края:

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

В JUNG это станет проще в следующей версии, которая, я надеюсь, выйдет через несколько месяцев. :)

person Joshua O'Madadhain    schedule 29.03.2016
comment
спасибо @joshua, я понимаю, что у меня проблема с созданием графа и особенно с ребрами, что мои идентификаторы не уникальны, но я не понял, как решить эту проблему, учитывая ваше решение, когда вы предложили использовать Object().! !! - person Amira; 29.03.2016
comment
Идентификаторы Edge должны быть уникальными. Вы используете их повторно: каждый раз, когда у вас есть ребро, которое соединяется с вершиной с индексом y в вашей матрице, вы используете y в качестве идентификатора ребра, который не уникален и, следовательно, не будет работать. Я немного перефразировал свой ответ; это помогает? - person Joshua O'Madadhain; 29.03.2016
comment
кстати, я искал, как создать граф Юнга из матрицы смежности, и нашел этот код: - person Amira; 29.03.2016
comment
Могу ли я использовать его для создания моего графика из матрицы смежности, а затем использовать реализацию Jung PageRank? - person Amira; 29.03.2016
comment
Вы можете сделать что-то подобное, да. Суть того, что делает этот код, насколько вам известно, заключается в том, что когда требуется объект края, они создают новую строку, увеличивая переменную каждый раз, когда создается новое ребро, и создавая строку из переменной стоимость. Это сработает. - person Joshua O'Madadhain; 29.03.2016
comment
Большое спасибо Джошуа за ваше время и ваш совет... надеюсь, что этот код решит мою проблему. - person Amira; 29.03.2016
comment
Я попытаюсь реализовать что-то подобное и скажу вам, работает это или нет... но я полагаю, что это решение моей проблемы. - person Amira; 29.03.2016
comment
Метод matrixToGraph(DoubleMatrix2D, Factory‹? расширяет Graph‹V,E››, Factory‹V›, Factory‹E›, Map‹E,Number›) в типе GraphMatrixOperations неприменим для аргументов (DoubleMatrix2D, Factory‹ UndirectedGraph‹String,String››, Factory‹DirectedGraph‹String,String››, Factory‹String›, Factory‹String›, Map‹String,Number›) - person Amira; 30.03.2016