我正在尝试为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.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)
我知道图形创建存在问题,但我不知道如何解决它! 有人可以帮帮我吗。
答案 0 :(得分:1)
问题似乎是你定义了一个无向图,并且你向它添加了两次相同的节点。其中一个形式为(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));
你的边缘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的下一个版本中,这将变得更加容易,我希望这个版本能在几个月内完成。 :)