2016-03-28 3 views
0

Pagerank algoritmasını jung için test etmeye çalışıyorum ama bunu yaparken bir problemim var gibi görünüyor. bir kod bölümü ile bir ağırlıklı ve dolaylı grafik oluşturduk:jung için PageRank algoritması nasıl test edilir?

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

ancak tutulması oluşturur:

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

     } 

sonra, ana sınıfı, benim grafikte pagerank test etmek için bu kod kullanılır Bu hata: "ana" iş parçacığı içinde özel durum java.lang.IllegalArgumentException: edge 4, bu grafikte son noktalarda zaten var ve edu.uci.ics.jung.graph.AbstractGraph.getValidatedEndpoints (ÖzetGraph.java) adresinde uç noktaları ile eklenemiyor : 93) edu.uci.ics.jung.graph adresinde . Edu.uci.ics.jung.graph.AbstractGraph.addEdge (AbstractGraph.java:60) adresinde, edu.uci.ics.jung.graph.AbstractGraph.addEdge (AbstractGraph.) 'Da UndirectedSparseGraph.addEdge (UndirectedSparseGraph.java:64) . java: com.tweets.helpers.FileHelper.createGraphForPageRank (FileHelper.java:1496 55) ) com.tweets.test.Main.main (Main.java:105 at)

Ben olduğunu biliyorum grafik oluşturma ile ilgili problem, ama nasıl çözeceğimi bilmiyorum !! Birisi bana yardım edebilir.

cevap

1

Sorun, bir hatalı grafik tanımladığınız ve aynı düğümü iki kez eklediğiniz gibi görünüyor. Biri (x,y) biçiminde ve bir tane (y,x) biçiminde - aynı değerler için x ve y.

0'dan sadece nodeID adresinin iç döngü içinde yineleme bunu çözün, değil: Ayrıca

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

:

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

senin kenar kimliği öyle düşünüyorum ki, benzersiz değil Olmalı, ama emin olmak için API ile yeterince tanıdık değilim.

+0

Cevabınız için teşekkürler, ama işe yaramıyor! – Amira

+0

Amira, @amit önerisi hangi şekilde işe yaramıyor? Kodundaki her iki soruna da parmağını koydu. –

0

Hatanıza yol açan birkaç sorun var.

(1) As @ amit, grafiğinizin yönünün tersine çevrildiğinden, x'den y'ye ve diğeri y'den x'e bir kenar eklemeniz gerekmez. Ancak, aşağıdaki kodu varsa:

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

addEdge ikinci() çağrısı sessizce göz ardı edilecektir, gayet iyi.

(2) Farklı düğümler için kenar kimliklerini yeniden kullanamazsınız; İşte bu hata mesajı size anlatıyor. Kenar nesneleri (ve düğüm nesneleri) eşleme anahtarlarına benzemektedir: benzersiz olmaları gerekir.

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

Bu kolay olacak:

Kodunuz aslında bir kenar eklerken sadece Graph<String, Object> oluşturmak ve bunu yapmak anlamına gelir ki, kenar başına nesneleri umurumda değil düşündürmektedir JUNG bir sonraki sürümünde, umarım birkaç ay içinde çıkacaktır.:)

+0

Teşekkürler @joshua, Grafik oluşturma ile ilgili bir sorunum olduğunu ve özellikle kimliğimin benzersiz olmadığını anladım, ancak "Object()" i kullanmayı önerdiğinizde çözümünüzü dikkate alarak bu problemle nasıl başa çıkacağımı anlamadım. ". !!! – Amira

+0

Kenar kimlikleri benzersiz olmalıdır. Onları yeniden kullanıyorsunuz: matrisinizde indeksi y ile köşeye bağlanan bir kenara her sahip olduğunuzda, y'yi benzersiz bir şekilde kullanmıyorsunuz ve bu yüzden işe yaramayacaksınız. Cevabımı biraz düşündüm; Bu yardımcı olur mu? –

+0

Sorunu çok iyi anlıyorum ama nasıl çözeceğimi bilmiyorum !! – Amira