我对 Java 和 Jung 还很陌生。我正在编写一个程序,我需要在事件发生的边缘添加概率(表示数据将从第一个节点流向其他节点的事件概率)。我有点困惑 Max-Flow 会为我解决问题,还是我需要使用其他选项,或者在 Jung 中没有选项可以做到这一点,在这种情况下,我需要自己编写吗?在这方面的任何帮助将不胜感激。
问候, 瓦卡斯
看看你调用setEdgeLabelTransformer的方式,你需要传递一个新的 Transformer(),就像我在编号为 2 的代码片段中所做的那样。
当您传递一个新的ToStringLabeller()时,您是在告诉查看器使用边缘对象的 toString() 方法进行标记。您需要传递一个自定义 Transformer,只需将您的代码更正为看起来像我的代码,您就会没事的。
您是否打算设置边缘权重来表示某些事件的概率?Max-Flow 算法将使用您分配给每条边的“容量”来查找从源顶点到汇顶点的最大流量路径。你到底想在这里做什么?
我不太确定你的最终目标是什么,所以我会尽力提供帮助。
您可以首先通过定义自定义 Edge 和 Edge Factory 类来表示概率。我所做的是:
0. 进口:
导入 org.apache.commons.collections15.Factory;
1. 添加您的自定义类。他们自定义的边缘类可能类似于:
公共静态类 MyEdge { 私人int流; 私人内部能力; 私有字符串名称; 私人国际电子索引; 公共 MyEdge(字符串名称,int eIndex){ this.name = 名称; this.eIndex = eIndex; } 公共int getCapacity(){ 返回这个容量; } 公共无效 setCapacity(int edgeCapacity){ this.capacity = edgeCapacity; } 公共 int getFlow() { 返回 this.flow; } 公共无效setFlow(int edgeFlow){ this.flow = edgeFlow; } 公共字符串 toString() { 返回这个名称; } }
自定义边缘工厂是每次在画布上以图形方式绘制边缘时实际创建的边缘,它可能看起来像:
公共静态类 MyEdgeFactory 实现工厂 { 私有静态int defaultFlow = 0; 私有静态int defaultCapacity = 0; 私有int edgeCount; 私人 MyEdgeFactory() { } 公共MyEdge创建(){ 字符串名称 = "E" + edgeCount; MyEdge e = new MyEdge(name, edgeCount); 边缘计数++; e.setFlow(defaultFlow); e.setCapacity(defaultCapacity); 返回 e; } }
2. 告诉您的可视化查看器如何显示边缘标签;您需要在创建图形和 VisualizationViewer 对象 (vv) 的任何位置添加它:
vv.getRenderContext().setEdgeLabelTransformer(new Transformer() { 公共字符串变换(MyEdge e){ 返回 (e.toString() + " " + e.getFlow() + "/" + e.getCapacity()); } });
现在每次创建边时,它的标签将采用“E0 0/0”、“E1 0/0”等形式。
我很快就会在我的博客上发布详细的教程和代码,这样如果你打算在你正在从事的任何项目上花费大量时间,你就可以观看该空间。