Java 使用jgrapht创建带有簇的图

Java 使用jgrapht创建带有簇的图,java,jgrapht,Java,Jgrapht,有没有办法使用jgrapht创建带有集群的图形? 带有两个簇“进程1”和“进程2”的示例图: 预期的点文件内容: digraph G { subgraph cluster_0 { style=filled; color=lightgrey; node [style=filled,color=white]; a0 -> a1 -> a2 -> a3; label = "process #1"; } subgraph cluster_1 { node [style=filled

有没有办法使用jgrapht创建带有集群的图形? 带有两个簇“进程1”和“进程2”的示例图:

预期的点文件内容:

digraph G {
subgraph cluster_0 {
style=filled;
color=lightgrey;
node [style=filled,color=white];
a0 -> a1 -> a2 -> a3;
label = "process #1";
}

subgraph cluster_1 {
node [style=filled];
b0 -> b1 -> b2 -> b3;
label = "process #2";
color=blue
}
start -> a0;
start -> b0;
a1 -> b3;
b2 -> a3;
a3 -> a0;
a3 -> end;
b3 -> end;

start [shape=Mdiamond];
end [shape=Msquare];
}

你的图形设计有点奇怪。当我直观地查看您的图时,我看到一个基本图和两个群集的节点组。当我查看您的点文件时,我看到两个子图,以及一个“外部”图,它表示子图中的特定节点。请注意,子图不是簇

你的问题似乎有两个部分:(1)你能用jgrapht创建一个带有簇的图吗?(2)你能在你的例子中创建点文件吗。答案是:(1)是,(2)不是,至少不是现成的,因为
dotporter
不支持“子图”

有几种不同的方法可以创建集群图

  • 创建带有边和顶点的常规图形,并维护一个单独的
    列表
    ,以存储集群。您可以使用
    AsSubgraph
    类来可视化特定集群所诱导的子图
  • JGraphT支持任何类型的顶点。所以顶点也可以是图!您可以创建一个图,其中每个顶点本身就是一个图;这些顶点之间的边表示这些特殊顶点之间的关系。我们在
    BlockCutpointGraph
    实现中做了类似的事情
  • 如果您想以与示例点文件类似的方式导出图形,则必须做一些工作。您可以实现自己的自定义DOTExporter,也可以修改现有的DOTExporter。也许一个简单的选择(不是最干净的)是按照以下思路做一些事情:

  • 创建具有顶点和边的常规图形(在您的情况下,图形中的所有节点和圆弧)
  • 创建诱导子图集群(在您的示例中,一个子图用于process1,另一个子图用于Process2)。为此,您可以使用
    AsSubgraph
  • 创建一个不包含集群内部任何弧的图。为此,可以使用
    MaskSubgraph
  • 使用
    dotporter
    类导出在步骤(2)和(3)中创建的图形
  • 作为最后一步,您必须将导出的图形合并到单个文件中。我将使用步骤(3)中的图形作为“基本”图形,并使用
    子图形
    键插入其他图形
  • 以您的例子:

  • 步骤(3)中的基础图:
  • 步骤(2)中的一个诱导子图:
  • 在这里,您必须将
    有向图
    替换为
    子图
    ,并将此图插入基本图中,以获得:

    digraph G {
      subgraph cluster_0 {
        style=filled;
        color=lightgrey;
        node [style=filled,color=white];
        a0 -> a1 -> a2 -> a3;
        label = "process #1";
      }
    
      start -> a0;
      start -> b0;
      a1 -> b3;
      b2 -> a3;
      a3 -> a0;
      a3 -> end;
      b3 -> end;
    
      start [shape=Mdiamond];
      end [shape=Msquare];
    }
    

    显然,您必须对其余的集群重复此操作。

    能否为AsSubgraph类提供语法和示例代码。我尝试了以下代码:
    DirectedGraph g=new DefaultDirectedGraph(DefaultEdge.Class);AsSubgraph subgraph=new AsSubgraph(g);
    ,但我遇到了如下错误:线程“main”java.lang.NoSuchMethodError中的“异常”:org.jgrapht.Graph.getType()Lorg/jgrapht/GraphType;位于org.jgrapht.GraphTests.requirectedRunDirected(GraphTests.java:645)“看看这个类。它包含各种示例。如果没有进一步的细节或完整的错误消息,很难提出任何建议。然而,这似乎与最初关于集群的问题无关。”。。
        digraph cluster_0 {
            style=filled;
            color=lightgrey;
            node [style=filled,color=white];
            a0 -> a1 -> a2 -> a3;
            label = "process #1";
        }
    
    digraph G {
      subgraph cluster_0 {
        style=filled;
        color=lightgrey;
        node [style=filled,color=white];
        a0 -> a1 -> a2 -> a3;
        label = "process #1";
      }
    
      start -> a0;
      start -> b0;
      a1 -> b3;
      b2 -> a3;
      a3 -> a0;
      a3 -> end;
      b3 -> end;
    
      start [shape=Mdiamond];
      end [shape=Msquare];
    }