2013-12-19 121 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)。 –