从大约 1,024 个节点的无向​​图中提取所有唯一的、完整的子图的最佳算法是什么?

问题描述

对于我作为一名实际程序员的明显数学缺陷,我很抱歉地问这个问题。自从我在高中代数中表现出色,然后在更高的代数中失败以来,已经有 40 多年了。 “NP 完全”和“NP 难”问题的概念一直难以掌握,但我尝试过。我什至购买并研究了似乎是此类问题的原始指南,Computers and Intractability: A Guide to the Theory of NP-Completeness Michael R. Garey 和 David S. Johnson。

https://goodreads.com/book/show/284369.Computers_and_Intractability/

尽管如此。希望问题本身足够清楚。到目前为止,对于从任何提取所有唯一的、完整的子图(其中所有不同的节点(顶点)相互连接(在唯一的边上))的特定问题,最好的公开可用的蛮力算法(具有高效的分支修剪)是什么?随机无向图?也就是说,该算法应该能够首先提取最大的唯一完整子图,无论可能有多少,然后按该顺序提取所有较小的唯一完整子图(根据定义,我认为) 不被任何更大的唯一、完整的子图所包含,从而避免非唯一(隐含)结果的重复产生。

哎呀,像那样用清晰的英语拼写出来让我有点头疼。尽管如此,我们还是希望这种描述足够简单明了。一个标准的 C/C++/(甚至 Python)库来为这个功能提供合理的计算资源,比如带有 64GB/128GB DRAM 的 Ryzen 5 3600 盒子会很棒,特别是如果可以在 1,024 个节点内完成对它的完整分析一两天,但我会非常感谢我能得到的。

如果网络上的某个地方有一个常见问题解答或文章,用英语涵盖了这个主题,非数学家也能理解,那就更好了!

编辑: 不可否认,以下论文中的语言有点超出我的理解,但是对于你们这些计算数学家来说,您能否确认它实际上确实解决了核心问题本身?如果是这样,我可以开始英勇地理解这个“bron-Kerbosch”算法,并相信它是正确的路径。 -_-

生成所有极大团和计算实验的最坏情况时间复杂度”作者:Etsuji Tomita、Akira Tanaka 和 Haruhisa Takahashi

(电子通信大学,信息与通信工程系,Chofugaoka 1-5-1,Chofu,Tokyo 182-8585,Japan) (Toyota Techno Service Corporation,Imae 1-21,Hanamotocho,Toyota,Aichi 470–0334,Japan)

https://snap.stanford.edu/class/cs224w-readings/tomita06cliques.pdf

解决方法

是的,Bron——Kerbosch 就是你想要的。 NetworkX 中有一个实现,Wikipedia 上有一些可读的伪代码(如果你知道你的集合运算符的话),还有一个 Python implementation,你可以通过搜索发现更多。