Java 生成所有可能的有向无环图

Java 生成所有可能的有向无环图,java,graph,directed-acyclic-graphs,Java,Graph,Directed Acyclic Graphs,我正在尝试枚举所有可能的带有n顶点的DAG。我知道有很多,我假设n非常小(3到5)。我想知道是否有办法列举它们。我的初始解决方案是通过边数m创建它们。考虑具有0边的结构,然后是具有1…等边的结构。m=0或m=n(n-1)/2的情况是很好的研究(分别为1和n!)。但是,我不清楚有多少DAG是1的。对于生成图形的问题,应该有DFS解决方案,例如: graph(g) { // g is current graph; start with an empty graph find set V of

我正在尝试枚举所有可能的带有
n
顶点的DAG。我知道有很多,我假设
n
非常小(3到5)。我想知道是否有办法列举它们。我的初始解决方案是通过边数
m
创建它们。考虑具有0边的结构,然后是具有1…等边的结构。
m=0
m=n(n-1)/2
的情况是很好的研究(分别为1和
n!
)。但是,我不清楚有多少DAG是
1的。对于生成图形的问题,应该有DFS解决方案,例如:

graph(g) {  // g is current graph; start with an empty graph
  find set V of vertices in g
  if V is not empty
    emit g
  for every v in V {
    find set V' of vertices not in g
    for every v' in V' {
      g' = g with new edge from v to v'
      graph(g')
    }
  }
}

因为无向图只是一组边,如果我理解你的第二个问题,你需要生成所有可能的边集的代码。是这样吗

void getAllEdgeSets(List<Edge> currentEdges, List<Edge> remainingEdges) {
    if (remainingEdges.isEmpty()) {
        processSet(currentEdges);
    } else {
        Edge edge = remainingEdges.remove(0);
        getAllEdgeSets(currentEdges, remainingEdges);
        currentEdges.add(edge);
        getAllEdgeSets(currentEdges, remainingEdges);
        currentEdges.remove(edge);
    }
}
您还可以将其转换为流的源,以便可以边走边处理(可能是并行处理):


下层选民:请给我一些建议,让它更具体些!这听起来更像是一个数学问题而不是一个编码问题。@很可能这是一个编码问题。不管有多少个DAG,问题是如何在代码中生成它们。图论是数学的一个分支……它似乎排除了所有包含两条边到同一个顶点的图形。在发布相同的想法之前,我盯着它看了一会儿,但我确信自己不是这样。初始条件有一个bug(需要一个起始边缘)。谢谢。我正在实现类似的功能。是的,目标是得到0到n(n-1)/2之间每m有m条边的所有无向图。每m有(n选择m)个无向图。您的代码输出了其中的一个子集(测试它的(0,1)(0,2)(1,2),它表示n=3的所有无向边)。再次感谢。将其更改为“定向边”也应该很简单。Edge类需要一个源顶点和目标顶点,然后在两个方向上生成所有边的方法。还要注意的是,如果只是要过滤掉循环图,这是非常低效的。您可以将其更改为仅过滤那些在递归之前不会导致循环的剩余项。
getAllEdgeSets(Collections.EMPTY_LIST, edges);
streamAllGraphs(5).filter(Graph::isAcyclic).forEach(...);