2013-12-19 167 views
0

我寫了一個java程序,用隨機生成的100個頂點和隨機生成的800個邊來計算最小生成樹。我想繪製一下當我運行它時該程序生成的圖形。 有誰知道任何工具,可以幫助這個?下面 我的Java代碼:圖形可視化

public static void main (String [] args) 
{ 
    Random random = new Random(); 
    Edge[] edges = new Edge[800]; 
    for(int i = 0; i < edges.length; i++) { 
     edges[i] = new Edge(
     Integer.toString(random.nextInt(100)), 
     Integer.toString(random.nextInt(100)), 
     random.nextInt(100) //weights from 0 to 99 
     ); 
    } 

    System.out.println("Graph"); 
    KEdges vv = new KEdges(); 

    for (Edge edge : edges) { 
     System.out.println(edge); 
     vv.insertEdge(edge); 
    } 
    System.out.println("Implementing Kruskal algorithm"); 
    int total = 0; 
    for (Edge edge : vv.getEdges()) { 
     System.out.println(edge); 
     total += edge.getEdgeWeight(); 
    } 
    System.out.println("Total weight is " + total); 
} 


static class Edge implements Comparable<Edge> 
{ 
    String vertexA; 
    String vertexB; 
    int weight; 

    public Edge(String vertexA, String vertexB, int weight) 
    { 
     this.vertexA = vertexA; 
     this.vertexB = vertexB; 
     this.weight = weight; 
    } 

    public String getVertexA() 
    { 
     return vertexA; 
    } 

    public String getVertexB() 
    { 
     return vertexB; 
    } 

    public int getEdgeWeight() 
    { 
     return weight; 
    } 

    public String toString() 
    { 
     return "("+ vertexA + ", " + vertexB + ") : weight "+ weight ; 
    } 
    @Override 
    public int compareTo(Edge o) { 
     return (this.weight < o.weight)? -1 : 1; 
    } 

} 

static class KEdges 
{ 
    Vector<HashSet<String>> vertexGroups = new Vector<HashSet<String>>(); 
    TreeSet<Edge> kruskalEdges = new TreeSet<Edge>(); 

    public TreeSet<Edge> getEdges() 
    { 
     return kruskalEdges; 
    } 

    public HashSet<String> getVertexGroup(String vertex) 
    { 
     for (HashSet<String> vertexGroup : vertexGroups) 
     { 
      if (vertexGroup.contains(vertex)) 
      { 
       return vertexGroup; 
      } 
     } 
     return null; 
    } 

    public void insertEdge(Edge edge) 
    { 
    String vertexA = edge.getVertexA(); 
    String vertexB = edge.getVertexB(); 

    HashSet<String> vertexGroupA = getVertexGroup(vertexA); 
    HashSet<String> vertexGroupB = getVertexGroup(vertexB); 

    if (vertexGroupA == null) 
    { 
     kruskalEdges.add(edge); 
     if (vertexGroupB == null){ 
      HashSet<String> htNewVertexGroup = new HashSet<String>(); 
      htNewVertexGroup.add(vertexA); 
      htNewVertexGroup.add(vertexB); 
      vertexGroups.add(htNewVertexGroup); 
     } 
    } 
    else{ 
     if (vertexGroupB == null) 
     { 
      vertexGroupA.add(vertexB); 
      kruskalEdges.add(edge); 
     } 
     else if (vertexGroupA != vertexGroupB) 
     { 
     vertexGroupA.addAll(vertexGroupB); 
     vertexGroups.remove(vertexGroupB); 
     kruskalEdges.add(edge); 
     } 
    } 
    } 

} 
+0

你想喲寫一個代碼,或者你想要現成的工具嗎?如果第一,請提供您的代碼 – Donvino

+1

JFreeChart - http://www.jfree.org/jfreechart/ –

+0

@Donvino,代碼更新 – saopayne

回答

2

JUNG或GraphViz的及其Java端口Grappa看看。

我通常使用JUNG

+0

我可以在幾個小時內生成此網絡可視化?將上面的代碼與我的代碼集成有多難? – saopayne

+0

是的,你可以在那段時間工作 – GrahamA

1

我有很好的經驗與Prefuse。特別是國外數據模型的整合。

+0

我可以在幾個小時內產生這種網絡可視化嗎?將上面的代碼與我的代碼集成有多難? – saopayne

+0

可能。這取決於你的技能。嘗試查找一些簡單示例[1](https://docs.google.com/document/d/1w-8dF6GtYnlL_IftWA0epgTsaIsuufCFTkSPsSFY-30/edit)[2](http://www.cs.mun.ca/ 〜hoeber/teaching/cs4767/notes/04-prefuse /)[3](http://stackoverflow.com/a/7600982/1725096)。 –