1

私はJavaとJungにかなり慣れていません。イベント発生のエッジに確率を追加する必要があるプログラムを作成しています(データが最初のノードから他のノードに流れるイベントの確率を意味します)。Max-Flow がこのトリックを実行してくれるのか、それとも他のオプションを使用する必要があるのか​​、Jung 内で実行するオプションがないのか、少し混乱しています。その場合、自分で書く必要がありますか? この点で何か助けていただければ幸いです。

よろしく、ワカス

4

3 に答える 3

1

特定のイベントの確率を表すためにエッジの重みを設定するつもりですか?Max-Flowアルゴリズムは、各エッジに割り当てた「容量」を使用して、ソース頂点からシンク頂点への最大フローのパスを見つけます。ここで正確に何をしようとしていますか?

于 2010-12-23T17:16:57.333 に答える
1

あなたの最終的な目的が何なのかよくわからないので、できる限りお手伝いします。

カスタム Edge および Edge Factory クラスを定義することで、最初に確率を表すことができます。私がしたことは:

0. 輸入品:

org.apache.commons.collections15.Factory をインポートします。

1. カスタム クラスを追加します。カスタム エッジ クラスは次のようになります。

public static class MyEdge {

    プライベート int フロー。
    プライベート int 容量;

    プライベート文字列名;
    プライベート int eIndex;

    public MyEdge(String name, int eIndex) {
        this.name = 名前;
        this.eIndex = eIndex;
    }

    public int getCapacity() {
        this.capacity を返します。
    }

    public void setCapacity(int edgeCapacity) {
        this.capacity = edgeCapacity;
    }

    public int getFlow() {
        this.flow を返します。
    }

    public void setFlow(int edgeFlow) {
        this.flow = edgeFlow;
    }

    パブリック文字列 toString() {
        this.name を返します。
    }

}

カスタム エッジ ファクトリは、キャンバス上にエッジをグラフィカルに描画するたびに実際にエッジを作成するもので、次のようになります。

public static class MyEdgeFactory は Factory を実装します {

    プライベート静的 int defaultFlow = 0;
    プライベート静的 int defaultCapacity = 0;
    プライベート int edgeCount;

    プライベート MyEdgeFactory() {            

    }

    public MyEdge create() {
        文字列名 = "E" + edgeCount;
        MyEdge e = new MyEdge(name, edgeCount);
        エッジカウント++;
        e.setFlow(defaultFlow);
        e.setCapacity(defaultCapacity);
        eを返します。
    }    

}

2. ビジュアライゼーション ビューアにエッジ ラベルの表示方法を指示します。グラフと VisualizationViewer オブジェクト (vv) を作成する場所にこれを追加する必要があります。

vv.getRenderContext().setEdgeLabelTransformer(新しいトランスフォーマー() {
    public String transform(MyEdge e) {
        return (e.toString() + " " + e.getFlow() + "/" + e.getCapacity());
    }
});

エッジを作成するたびに、そのラベルは「E0 0/0」、「E1 0/0」などの形式になります。

近日中に詳細なチュートリアルとコードをブログに投稿する予定ですので、取り組んでいるプロジェクトにかなりの時間を費やす予定がある場合は、そのスペースをご覧ください。

于 2010-12-26T20:12:27.070 に答える
1

setEdgeLabelTransformerを呼び出す方法を見てください。番号 2 のコード スニペットで行ったように、新しい Transformer()を渡す必要があります。

新しいToStringLabeller()を渡すと、ビューアーにエッジ オブジェクトの toString() メソッドを使用してラベルを付けるように指示します。代わりにカスタム Transformer を渡す必要があります。コードを私のように修正するだけで問題ありません。

于 2011-01-07T02:56:54.517 に答える