2016-03-28 4 views
0

私はJungのPagerankアルゴリズムをテストしようとしていますが、問題が発生しているようです。 私は、コードのこの部分で重み付けし、間接的なグラフを作成しました:jungの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(); 

が、日食が発生:

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をテストするには、このコードを使用しましたこのエラー: スレッド "main"の例外java.lang.IllegalArgumentException:端点を持つこのグラフにはすでにエッジ4が存在し、エンドポイントとともに追加することはできません edu.uci.ics.jung.graph.Abs​​tractGraph.getValidatedEndpoints(AbstractGraph.java :93) at edu.uci.ics.jung.graph。 (AbstractGraph.addEdge(AbstractGraph.java:60) ) Javaの:55) com.tweets.helpers.FileHelper.createGraphForPageRank com.tweets.test.Main.mainで(FileHelper.java:1496) (Main.java:105)

で私がそこにあることを知っていますグラフ作成の問題ですが、私はそれを解決する方法を知らない! 誰かが私を助けてくれますか?

答えて

1

無向グラフを定義し、同じノードを2度追加すると問題が発生しているようです。 1つは(x,y)の形であり、1つは(y,x)の形であり、同じ値がxおよびyである。

0からのみnodeIDからあなたの内側のループで繰り返すことによってそれを解決し、ではない。また

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に十分な知識がありません。

+0

あなたの答えをありがとうが、それは動作しません! – Amira

+0

Amira、@amitの提案はうまくいかないのですか?彼はあなたのコードの両方の問題に指をかけています。 –

0

エラーが発生したいくつかの問題があります。

(1)@amitが観察したように、グラフは無向グラフなので、xからyとyからxの間にエッジを追加する必要はありません。 しかし、あなたは以下のコードがある場合:

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

addEdgeへの2回目の呼び出しは()黙って無視されます、大丈夫です。

(2)異なるインシデントノードセットに対してエッジIDを再利用することはできません。そのエラーメッセージがあなたに伝えていることです。エッジオブジェクト(およびノー​​ドオブジェクト)はマップキーに似ています。それらは一意でなければなりません。

あなたのコードは、あなたが実際にエッジを気にしないことを示唆しているが、あなただけのGraph<String, Object>を作成し、エッジを追加するときに、これを行うことができることを意味しており、それ自体がオブジェクト:

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

これは、より簡単になりますJUNGの次のバージョンでは、私は数ヶ月で外に出ることを願っています。:)

+0

ありがとう@ジョシュア、私はグラフの作成に問題があると特に私のIDが一意ではないエッジと、理解していますが、私はあなたのソリューションを考慮してこの問題に対処する方法を理解していない " "!!! – Amira

+0

エッジIDは一意である必要があります。あなたはそれらを再利用しています:あなたが行列のインデックスyを持つ頂点に接続するエッジを持つたびに、あなたはエッジIDとしてyを使います。これはユニークではないため動作しません。私は私の答えを少し言い換えました。それは役に立ちますか? –

+0

私は問題を非常によく理解していますが、解決する方法はわかりません!!!!ところで、 – Amira

関連する問題