如何使用Jung 2在图中标记边缘的概率

时间:2010-12-13 14:26:56

标签: java jung

我是Java和Jung的新手。我正在编写一个程序,我需要在事件发生的边缘添加概率(意味着数据将从第一个节点流向另一个节点的事件的概率)。我有点困惑,Max-Flow会为我做这个伎俩,或者我是否需要使用其他选项,或者在Jung内没有选择,在这种情况下我是否需要自己编写?在这方面的任何帮助将不胜感激。

的问候, waqas

3 个答案:

答案 0 :(得分:1)

您是否打算设置边权重来表示某些事件的概率? Max-Flow算法将使用您为每个边分配的“容量”来查找从源顶点到接收器顶点的最大流量路径。你究竟想在这做什么?

答案 1 :(得分:1)

我不太确定你的最终目标是什么,所以我会尽力帮忙。

您可以通过定义自定义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”等形式。

我将很快在my blog上发布详细的教程和代码,这样你就可以看到这个空间,如果你将花费大量时间在你正在进行的任何项目上。

答案 2 :(得分:1)

看看你打电话 setEdgeLabelTransformer 的方式,你需要传递一个新的Transformer(),就像我在代码段中所做的那样编号为2

当你传递一个新的 ToStringLabeller()时,你告诉观众使用边缘对象的toString()方法进行标记。你需要传递一个自定义的变换器,只需更正你的代码看起来像我的,你会没事的。