JGraphT 导出加权图并导入它

JGraphT exporting a weighted graph And importing it

我正在寻找一种方法来导出带有加权边的图形。

我有一个带有加权边的简单有向图。

SimpleDirectedWeightedGraph<Integer, DefaultWeightedEdge> exGraph =
                new SimpleDirectedWeightedGraph<>(vSupplier, SupplierUtil.createDefaultWeightedEdgeSupplier());

这是我的图表。我为它生成一些顶点和边。

我试过点导出器:

    DOTExporter<Integer, DefaultWeightedEdge> dotExporter = new DOTExporter<>();
    Writer writer = new StringWriter();
    dotExporter.exportGraph(exGraph,writer);
    FileWriter fw = new FileWriter("ex2.dot");
    fw.write(writer.toString());
    fw.close();

但是我无法导出权重。

有人可以告诉我如何先导出再导入吗?

谢谢!

不同的图形格式以不同的方式支持边权重。就个人而言,我发现 DIMACS 图形格式是导出加权图形最简单的格式。这种图形格式只是将图形写入文件:

<edge_source> <edge_target> <edge_weight>

下面是一个使用 DIMACS export/import 加权图的完整示例:

Graph<Integer, DefaultWeightedEdge> graph=new SimpleWeightedGraph<>(DefaultWeightedEdge.class);
Graphs.addAllVertices(graph,Arrays.asList(1,2,3,4));
Graphs.addEdge(graph,1,2, 10);
Graphs.addEdge(graph,2,3, 11);
Graphs.addEdge(graph,3,4, 12);
Graphs.addEdge(graph,4,1, 13);

//Example of exporting a weighted graph in DIMACS format
DIMACSExporter<Integer, DefaultWeightedEdge> dimacsExporter=new DIMACSExporter<>();
//Enable exporting of weights in the DIMACS exporter
dimacsExporter.setParameter(DIMACSExporter.Parameter.EXPORT_EDGE_WEIGHTS, true);
//Export the graph
dimacsExporter.exportGraph(graph, new File("DIMACSgraph.txt"));

//Now import the graph
Graph<Integer, DefaultWeightedEdge> importGraph = new SimpleWeightedGraph<>(SupplierUtil.createIntegerSupplier(), SupplierUtil.createDefaultWeightedEdgeSupplier());
DIMACSImporter<Integer, DefaultWeightedEdge> dimacsImporter=new DIMACSImporter<>();
dimacsImporter.importGraph(importGraph, new File("DIMACSgraph.txt"));
System.out.println("Imported DIMACS graph: "+importGraph);
System.out.println("Edge weights: ");
for(DefaultWeightedEdge edge : importGraph.edgeSet())
    System.out.println("Edge: "+edge+" weight: "+importGraph.getEdgeWeight(edge));

导出期间创建的文件包含以下内容:

c
c SOURCE: Generated using the JGraphT library
c
p edge 4 4
e 1 2 10.0
e 2 3 11.0
e 3 4 12.0
e 4 1 13.0

以上代码的输出:

Imported DIMACS graph: ([0, 1, 2, 3], [{0,1}, {1,2}, {2,3}, {3,0}])
Edge weights: 
Edge: (0 : 1) weight: 10.0
Edge: (1 : 2) weight: 11.0
Edge: (2 : 3) weight: 12.0
Edge: (3 : 0) weight: 13.0

显然,要导入 weighted graph,您要导入的图形必须是加权类型,即 graph.getType().isWeighted() 必须 return 为真。

您也可以像原来那样使用 DOT 文件格式。使用这种格式,您必须将边权重导出为边 属性 。有关详细信息,请参阅他们的 DOT file format documentation