繁体   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