[英]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.