我想定义自定义边
public class Connection extends DefaultWeightedEdge
但是当我尝试使用super()
时,可能吗?创建图形时我应该为EdgeFactory使用什么?
new SimpleWeightedGraph<Sensor, Connection>(EdgeFactory.class);
这会足够吗?或者我应该创建一个扩展EdgeFactory
的新类?
答案 0 :(得分:6)
您不需要子类DefaultWeightedEdge
来创建自定义边缘,以下也可以。我目前正在使用JGraphT的0.9.0版本。
班级定义:
public class Connection {
// class implementation
// define all constructors and methods you need
}
图表创建:
SimpleWeightedGraph<Sensor, Connection> graph;
graph = new SimpleWeightedGraph<Sensor, Connection>(Connection.class);
添加自定义边缘并设置重量:
Sensor v1 = // sensor instance
Sensor v2 = // another sensor instance
graph.addVertex(v1);
graph.addVertex(v2);
Connection connection = new Connection(/* ... */);
graph.addEdge(v1, v2, connection);
graph.setEdgeWeight(connection, 10.0);
同时考虑实施equals
类的hashCode
和Connection
方法,因为JGraphT自0.8.4版开始依赖于这些方法,请参阅EqualsAndHashCode文章。本文还提供了DefaultWeightedEdge
子类的示例。
答案 1 :(得分:1)
这有助于您创建自定义边缘吗?
此特定示例来自JGrapht内部文档。在代码库中搜索StoerWagnerMinimumCut算法。
我们走了。
这里的想法是给图形的边缘赋予一些权重,因此需要操纵默认权重。
final WeightedGraph<Set<V>, DefaultWeightedEdge> workingGraph;
....
workingGraph =
new SimpleWeightedGraph<Set<V>, DefaultWeightedEdge>(
DefaultWeightedEdge.class);
list = ....
workingGraph.addVertex(list);
....
//让我们现在操纵边缘权重
DefaultWeightedEdge eNew = workingGraph.getEdge(someSourcEdge, someTargetEdge);
if (eNew == null) {
eNew = workingGraph.addEdge(someSourcEdge, someTargetEdge);
workingGraph.setEdgeWeight(eNew, graph.getEdgeWeight(e));
} else {
workingGraph.setEdgeWeight(
eNew,
workingGraph.getEdgeWeight(eNew) + graph.getEdgeWeight(e));
我希望您可以使用该示例并使用它来创建自定义边缘。
PS :
我的答案我不是100%正确,但我的想法是指出正确的方向:-)