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(...);