2016-03-28 11 views
0

Ich versuche, Pagerank Algorithmus für jung zu testen, aber es scheint, dass ich ein Problem dabei habe. Ich habe gewichtet und indirekte Graph mit diesem Teil des Codes erstellt:wie man PageRank Algorithmus für jung testen?

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); 

     } 

dann, in der Hauptklasse, habe ich diesen Code pagerank auf meinem Diagramm zu testen:

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(); 

aber Eclipse erzeugt Dieser Fehler: Ausnahme im Thread "Haupt" java.lang.IllegalArgumentException: Kante 4 ist bereits in diesem Diagramm mit Endpunkten vorhanden und kann nicht mit Endpunkten bei edu.uci.ics.jung.graph.AbstractGraph.getValidatedEndpoints (AbstractGraph.java : 93) bei edu.uci.ics.jung.graph. UndirectedSparseGraph.addEdge (UndirectedSparseGraph.java:64) bei edu.uci.ics.jung.graph.AbstractGraph.addEdge (AbstractGraph.java:60) bei edu.uci.ics.jung.graph.AbstractGraph.addEdge (AbstractGraph. java: 55) bei com.tweets.helpers.FileHelper.createGraphForPageRank (FileHelper.java:1496) bei com.tweets.test.Main.main (Main.java:105)

ich weiß, dass es eine Problem mit der Graphenerstellung, aber ich weiß nicht, wie ich das lösen soll !!!! Kann mir bitte jemand helfen.

Antwort

1

Das Problem scheint ein ungerichtetes Diagramm definiert zu sein, und Sie fügen denselben Knoten zweimal hinzu. Eine in Form von (x,y) und eine in Form von (y,x) - für die gleichen Werte von x und y.

es lösen, indem nur von den nodeID in Ihrer inneren Schleife iteriert, und nicht von 0:

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

Zusätzlich:

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

Ihr Rand-ID nicht eindeutig ist, was ich denke, es sollte sein, aber ich bin nicht genug vertraut mit der API, um sicher zu sein.

+0

danke für deine antwort, aber es funktioniert nicht !!! – Amira

+0

Amira, in welcher Weise funktioniert der Vorschlag @amit nicht funktioniert? Er hat sich mit beiden Problemen in Ihrem Code beschäftigt. –

0

Es gibt ein paar Probleme, die zu Ihrem Fehler geführt haben.

(1) Wie @amit beobachtet wurde, müssen Sie, da Ihr Diagramm ungerichtet ist, keine Kante von x nach y und eine weitere von y nach x hinzufügen. Wenn Sie jedoch den folgenden Code haben:

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

Der zweite Aufruf von addEdge() wird stillschweigend ignoriert, was in Ordnung ist.

(2) Sie können keine Edge-IDs für verschiedene Gruppen von Incident-Knoten verwenden. Das ist, was diese Fehlermeldung Ihnen sagt. Kantenobjekte (und Knotenobjekte) sind analog zu Kartenschlüsseln: Sie müssen eindeutig sein.

Ihr Code schlägt vor, dass Sie eigentlich gar nicht kümmern sich um die Kante per se Objekte, was bedeutet, dass Sie nur ein Graph<String, Object> erstellen können und dies tun, wenn Sie einen Rand hinzu:

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

Dies wird einfacher in JUNG in seiner nächsten Version, von der ich hoffe, dass sie in ein paar Monaten veröffentlicht wird.:)

+0

danke @joshua, ich verstehe, dass ich ein Problem mit der Graphenerstellung habe und besonders mit Kanten, dass meine IDs nicht eindeutig sind, aber ich habe nicht verstanden, wie man mit diesem Problem umgeht, wenn man "Object()" ". !!! – Amira

+0

Edge IDs müssen eindeutig sein. Sie verwenden sie erneut: Jedes Mal, wenn Sie eine Kante haben, die mit dem Scheitelpunkt mit dem Index y in Ihrer Matrix verbunden ist, verwenden Sie y als Kanten-ID, was nicht eindeutig ist und daher nicht funktioniert. Ich habe meine Antwort ein wenig umformuliert; Hilft das? –

+0

Ich verstehe sehr gut das Problem, aber ich weiß nicht, wie ich es lösen soll !!!! – Amira