自定义边缘与jgrapht

时间:2014-06-24 10:26:25

标签: java jgrapht

我想定义自定义边

public class Connection extends DefaultWeightedEdge

但是当我尝试使用super()时,可能吗?创建图形时我应该为EdgeFactory使用什么?

new SimpleWeightedGraph<Sensor, Connection>(EdgeFactory.class);

这会足够吗?或者我应该创建一个扩展EdgeFactory的新类?

2 个答案:

答案 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类的hashCodeConnection方法,因为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%正确,但我的想法是指出正确的方向:-)