Algorithm 图的独立集的算法?

Algorithm 图的独立集的算法?,algorithm,graph-theory,Algorithm,Graph Theory,有没有一个算法可以找到一个有向图的所有独立集? 据我所知,一个独立的集合表示由不相邻的节点组成的集合 所以对于这个例子,我有{1}{2}{1,3} 因此,如何才能找到所有这些,我正在考虑一些递归的东西,但我真的不知道算法,如果有人能给我指出正确的方向,我将不胜感激 谢谢大家!发现独立集的典型方法是考虑图的补码。图的补集定义为具有相同顶点集和一对顶点之间的边的图,当且仅当它们之间在原始图中没有边时。图中的一个独立集对应于补语中的一个团。找到所有的派系在复杂性上是指数级的,所以你不能提高蛮力太多。我

有没有一个算法可以找到一个有向图的所有独立集? 据我所知,一个独立的集合表示由不相邻的节点组成的集合

所以对于这个例子,我有{1}{2}{1,3} 因此,如何才能找到所有这些,我正在考虑一些递归的东西,但我真的不知道算法,如果有人能给我指出正确的方向,我将不胜感激


谢谢大家! < P>发现独立集的典型方法是考虑图的补码。图的补集定义为具有相同顶点集和一对顶点之间的边的图,当且仅当它们之间在原始图中没有边时。图中的一个独立集对应于补语中的一个团。找到所有的派系在复杂性上是指数级的,所以你不能提高蛮力太多。我仍然相信,考虑到图的补码可能会使问题更容易处理。

除了补码和查找派系之外,我还可以考虑“图着色”,您以某种方式为顶点着色,使相邻的两个顶点没有相同的颜色(您可以使用非常简单的启发式算法,如SL=最小的最后一个),然后选择每种颜色中的顶点作为子集(作为最大独立子集)


唯一的问题是,给图形着色的方法可能太多了。您必须保留所有找到的(最大)独立集,并继续前进,直到获得足够的集

除了补色和查找派系之外,我还可以考虑“图着色”,以某种方式为顶点着色,使相邻的两个顶点没有相同的颜色(可以使用非常简单的启发式算法,如SL=最小最后一个),然后选择每种颜色中的顶点作为子集(作为最大独立子集)


唯一的问题是,给图形着色的方法可能太多了。您必须保留所有找到的(最大)独立集,并继续前进,直到获得足够的集

Bron–Kerbosch算法通常用于此问题,请参阅,以获取描述和伪代码,这些代码可以转化为可用程序而不会出现太多问题。在最坏的情况下,输出的大小是顶点数的指数,但蛮力始终是指数的,而如果输出是多项式的,BK将是多项式的。换句话说,如果你知道输出是合理的,那么BK将在合理的时间内生产它。这是一个活跃的研究领域,还有许多其他算法可以根据图形的类型和大小以不同的效率完成相同的工作。在多个领域都有应用,特别是遗传学。

Bron–Kerbosch算法通常用于此问题,请参阅,以获取可转化为可用程序而不会产生太多问题的描述和伪代码。在最坏的情况下,输出的大小是顶点数的指数,但蛮力始终是指数的,而如果输出是多项式的,BK将是多项式的。换句话说,如果你知道输出是合理的,那么BK将在合理的时间内生产它。这是一个活跃的研究领域,还有许多其他算法可以根据图形的类型和大小以不同的效率完成相同的工作。有几个方面的应用,特别是遗传学。

好主意,但问题是我需要所有的集合,我找不到所有的团的算法,只有最大的团,还有其他想法吗?这个想法是一样的,你只是不优化。正如我在回答中提到的,这个问题的解决方案是指数型的,所以几乎所有的解决方案都应该尽可能好。如果你找到了所有的最大团,你就找到了所有的团。你也可以试着找到所有的循环,然后检查它是否也是团。这可能是指数型的(看起来不可避免)好主意,但问题是我想要所有的集合,我找不到一个适用于所有团的算法,只适用于最大团,还有其他想法吗?想法是一样的,你只是不优化。正如我在回答中提到的,这个问题的解决方案是指数型的,所以几乎所有的解决方案都应该尽可能好。如果你找到了所有的最大团,你就找到了所有的团。你也可以试着找到所有的循环,然后检查它是否也是团。它可能是指数型的(看起来不可避免)嗯,维基说“Bron–Kerbosch算法不是一个输出敏感算法”,那么你从哪里得到“如果输出是多项式,BK将是多项式”的说法呢?你是对的,在最坏的情况下,BK不是输出敏感的,还有其他算法是这样的。虽然BK在实践中表现不错,特别是如果你实现了文章中讨论的优化,而且它相对容易实现。嗯,维基说“Bron–Kerbosch算法不是一个输出敏感算法”,那么你从哪里得到“如果输出是多项式,BK将是多项式”的说法呢?你是对的,在最坏的情况下,BK对输出不敏感,还有其他算法是敏感的。不过,BK在实践中确实表现良好,特别是如果您实现了本文中讨论的优化,并且它相对容易实现。