【问题标题】:What's the best algorithm for extracting all unique, complete subgraphs from an undirected graph of perhaps 1,024 nodes?从可能有 1,024 个节点的无向​​图中提取所有唯一的完整子图的最佳算法是什么?
【发布时间】:2021-01-28 03:52:44
【问题描述】:

对于我作为一名实用程序员的明显数学缺陷,我向这个问题表示歉意。自从我在高中代数上取得好成绩,然后在任何更高的科目上都失败了,已经有 40 多年了。 “NP-complete”和“NP-hard”问题的概念一直很难掌握,但我尝试过。我什至购买并研究了似乎是此类问题的原始指南,Computers and Intractability: A Guide to the Theory of NP-Completeness,Michael R. Garey 和 David S. Johnson。 /p>

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

【问题讨论】:

  • 您好@owlsupport,欢迎来到 Stack Overflow!我可以很快确认您链接的论文是一个好方法。它提供了一种算法来查找所有最大团(它们是完整的子图,如您所愿,未被更大的子图包含),并且在最坏情况下在已证明的最佳渐近时间内这样做。但是,您的图表可能不是最坏的情况,在这种情况下,可能会有更新更快的方法。您能否提供有关图表的更多信息?具体来说,边的数量可能非常重要,因为稀疏图更容易解决这个问题。
  • 如果有问题的图表不是敏感信息,您也可以考虑简单地将图表上传到某个地方。
  • 非常感谢您,ADdV!那篇论文看起来越来越有趣了!其中复杂的含义开始渗入我的认知视野。稀疏图具有适当的剪枝启发式方法对有限的计算资源施加的负载要小得多,这是完全有道理的。老实说,我更感兴趣的是了解如何自己为经典集团问题的较小实例编写这样的代码(如上述论文中所见)。这将为解决某些现实问题的更复杂的数据集铺平道路。
  • 顺便说一句,1,024 个节点的数字反映了对此类实际问题可能规模的粗略估计。我之所以选择这个数字,部分原因是它足够大,足以引起人们对由此产生的强大数据集的限制——如果我没记错的话,最多 1,024 个节点的最大集团可以或多或少有效地表示为比特适合 128 字节 DRAM 或硬盘存储的数组,不计算开销。

标签: algorithm graph-theory graph-algorithm np-complete clique-problem


【解决方案1】:

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

【讨论】:

  • 啊,谢谢!仅仅知道正确的道路是非常有帮助的。已经有一段时间了,但是集合运算符正在慢慢地回到我的记忆中。我将检查您无疑是出色的 Python 实现! ^_^
  • @owlsupport 我忘了一个实际上是最大派系,但它通过枚举所有带有修剪的最大派系来工作,所以你可以扔掉修剪部分(或使用其他人的;这不完全是复杂的算法)
  • 谢谢你,David Eisenstat — 我认为这些术语对我来说也很清楚。最大集团(或集团)是(是)所有最大集团的子集,是吗?可以对最大团(或团)感到满意并停止进一步处理,或者继续添加修剪以避免唤起现有最大团的子集,是吗?当然希望我最后做对了。 ^_^
  • @owlsupport 是的。
  • 顺便说一句,作为一个可以说是无关紧要的,我一直在考虑所谓的“NP-complete”问题的本质。我认为应用于无向图的集团问题是说明性的,从而显示了提取所有最大集团的欺骗性概念简单性。是的,具有 2,048 个顶点的无向图包含的顶点数仅是具有 1,024 个顶点的无向图的两倍,但由此产生的可能连接边会导致计算复杂性的组合爆炸。因此,“P=NP”是否是一个非常有趣的问题。 :-)
猜你喜欢
  • 1970-01-01
  • 2012-08-07
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
相关资源
最近更新 更多