2

すべてのノードを反復処理しようとしているので、graphviz 用に出力できます。JGraphT ライブラリを使用してそれを行う最善の方法は何ですか?

public static void main(String[] args) {
    UndirectedGraph<String, DefaultEdge> g = new SimpleWeightedGraph<String, DefaultEdge>(DefaultEdge.class);

    String odp = "ODP";
    String cck = "CCK";
    String mfe = "MFE";

    g.addVertex(odp);
    g.addVertex(cck);
    g.addVertex(mfe);

    g.addEdge(odp, cck);
    g.addEdge(odp, mfe);

}

また、エッジの重みを追加するにはどうすればよいですか?

編集:これはかなりうまくいくようです。しかし、より良い方法はありますか?

    Set<DefaultEdge> edges = g.edgeSet();

    for (DefaultEdge e : edges) {
        gv.addln(String.format("\"%s\" -> \"%s\"", g.getEdgeSource(e), g.getEdgeTarget(e)));            
    }
4

3 に答える 3

1

関数を使用してグラフのすべての情報をグラフに出力できtoString()ます。たとえば、グラフ h がある場合は、次のように実行できます。

System.out.println(h.toString());

このようにして、グラフが一列に表示されます。一方、たとえばグラフを使用して、頂点に座標を割り当てるグラフを視覚化できます。

positionVertexAt(ODP, 130, 40);
positionVertexAt(CCK, 60, 20);
positionVertexAt(MFE, 240, 140);

いくつかの機能を実装する必要があるという問題。このリンクhttp://kickjava.com/src/org/jgrapht/demo/JGraphAdapterDemo.java.htmに例があります。

少し難しいと思いますが、素敵なグラフの視覚化を作成できます。

さらに、Web http://www.graphviz.orgを使用して、既に行ったようにグラフの情報をフォーマットしてから、このコードを入力すると、この例のようにプログラムがグラフを作成できます (コードはウェブの例):

digraph finite_state_machine {
rankdir=LR;
size="8,5"
node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8;
node [shape = circle];
LR_0 -> LR_2 [ label = "SS(B)" ];
LR_0 -> LR_1 [ label = "SS(S)" ];
LR_1 -> LR_3 [ label = "S($end)" ];
LR_2 -> LR_6 [ label = "SS(b)" ];
LR_2 -> LR_5 [ label = "SS(a)" ];
LR_2 -> LR_4 [ label = "S(A)" ];
LR_5 -> LR_7 [ label = "S(b)" ];
LR_5 -> LR_5 [ label = "S(a)" ];
LR_6 -> LR_6 [ label = "S(b)" ];
LR_6 -> LR_5 [ label = "S(a)" ];
LR_7 -> LR_8 [ label = "S(b)" ];
LR_7 -> LR_5 [ label = "S(a)" ];
LR_8 -> LR_6 [ label = "S(b)" ];
LR_8 -> LR_5 [ label = "S(a)" ];

}

プログラムはこのグラフを作成します: http://www.graphviz.org/content/fsm

私はあなたにここのウェブを書きます: http://www.graphviz.org/ . より多くの情報や簡単なものを見つけたら、お知らせします。

Pd: 私の英語で申し訳ありません。すべて理解していただければ幸いです。

于 2012-06-07T09:45:44.893 に答える
0

UndirectedGraph の代わりに WeightedGraph を使用してみてください (重みの追加に関する 2 番目の質問への回答として):

WeightedGraph<String, DefaultEdge> g = new SimpleWeightedGraph<String, DefaultEdge>(DefaultEdge.class);

String odp = "ODP";
String cck = "CCK";
String mfe = "MFE";

g.addVertex(odp);
g.addVertex(cck);
g.addVertex(mfe);

DefaultEdge e1 = g.addEdge(odp, cck);
DefaultEdge e1 = g.addEdge(odp, mfe);

g.setEdgeWeight(e1, 10);
g.setEdgeWeight(e2, 4);
于 2010-03-13T06:42:22.653 に答える
0

アーロンによって提供されたコードで使用する代わりに、DefaultEdge実際に使用する必要がありますDefaultWeightedEdge

于 2010-03-13T11:21:02.150 に答える