簡體   English   中英

如何使用Jung 2在圖中用概率標記邊緣

[英]How to label edges with probabilities in graph using Jung 2

我是Java和Jung的新手。 我正在編寫一個程序,需要在事件發生的邊緣上添加概率(即數據將從第一個節點流到另一個節點的事件的概率)。 我有點困惑,Max-Flow會幫我這個忙嗎,還是我需要使用其他選項,或者在Jung內沒有其他選擇,在這種情況下,我需要自己編寫嗎? 在這方面的任何幫助將不勝感激。

問候,瓦卡斯

您是否打算設置邊緣權重來表示某些事件的概率? 最大流量算法將使用您分配給每個邊的“容量”來查找從源頂點到宿頂點的最大流量的路徑。 您到底想在這里做什么?

我不太確定您的最終目標是什么,所以我會盡力幫助您。

首先可以通過定義自定義Edge和Edge Factory類來表示概率。 我所做的是:

0.進口:

import org.apache.commons.collections15.Factory;

1.添加自定義類。 他們自定義的邊緣類可能類似於:

public static class MyEdge {

    private int flow;
    private int capacity;

    private String name;
    private int eIndex;

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

    public int getCapacity() {
        return this.capacity;
    }

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

    public int getFlow() {
        return this.flow;
    }

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

    public String toString() {
        return this.name;
    }

}

每次在畫布上以圖形方式繪制邊緣時,自定義邊緣工廠實際上就是創建邊緣的過程,它看起來像:

public static class MyEdgeFactory implements Factory {

    private static int defaultFlow = 0;
    private static int defaultCapacity = 0;
    private int edgeCount;

    private MyEdgeFactory() {            

    }

    public MyEdge create() {
        String name = "E" + edgeCount;
        MyEdge e = new MyEdge(name, edgeCount);
        edgeCount++;
        e.setFlow(defaultFlow);
        e.setCapacity(defaultCapacity);
        return e;
    }    

}

2.告訴可視化查看器如何顯示邊緣標簽; 您需要將其添加到要創建圖形和VisualizationViewer對象(vv)的位置:

vv.getRenderContext().setEdgeLabelTransformer(new Transformer() {
    public String transform(MyEdge e) {
        return (e.toString() + " " + e.getFlow() + "/" + e.getCapacity());
    }
});

現在,每次創建邊時,其標簽的形式將為“ E0 0/0”,“ E1 0/0”,依此類推。

我將很快在我的博客上發布詳細的教程和代碼,因此,如果您要花大量時間在正在進行的任何項目上,那么您可以關注這個空間。

看一下您調用setEdgeLabelTransformer的方式,您需要將其傳遞給新的Transformer() ,就像我在編號為2的代碼段中所做的那樣。

當您傳遞新的ToStringLabeller()時 ,您是在告訴查看者使用邊緣對象的toString()方法進行標記。 您需要傳遞一個自定義的Transformer,只需更正您的代碼使其看起來像我的代碼就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM