子图枚举的高效算法

Posted

技术标签:

【中文标题】子图枚举的高效算法【英文标题】:Efficient Algorithm for subgraph enumeration 【发布时间】:2015-04-30 13:40:43 【问题描述】:

我搜索了有关子图枚举的相关问题。但是,它们不符合我的要求(*)。 (如果我误解了什么,请告诉我。)

是否有一种有效的算法或工具可用于枚举无向父图的所有“连接且未标记”的子图。

在我的例子中,父图是一个 Internet 拓扑,因此节点的数量可能很大。我想枚举父图的所有连接的未标记模式(即子图)。

(*) 我搜索了Efficiently find all connected subgraphs 和Subgraph enumeration,但它们都分别针对顶点标记的诱导子图和完整子图。但我想要的只是连接的未标记子图。

【问题讨论】:

如果父图是顶点标记的(并且我知道的所有计算机表示都是隐式顶点标记的),并且您只想生成不同的未标记子图,那么您需要解决多次出现 NP-完全子图同构问题。 (如果您从包含某个图的两个副本的父图开始,很容易看到这一点:对于第一个副本的任何子图,当您考虑第二个副本的子图时,如何避免再次生成该子图?) @j_random_hacker - 这个问题中的“未标记子图”要求是由于我的目标图是 Internet 拓扑的子网(即网络图)。与其他针对化学结构的问题相比[注],我的问题可能是一个“未标记”的子图枚举问题,因为互联网上的任何节点都被认为是相同的,我只对它们的模式感兴趣。 【注】子图枚举link @j_random_hacker - 正如你刚才提到的,我知道可能不存在有效的算法,因为无法避免重复子图同构测试。但是,我仍然想知道是否有任何想法可以解决这个问题。如果您有任何评论,我们将不胜感激。 【参考方案1】:

一个可能有用的主题名称是“频繁子图挖掘”,这似乎是一个名称。这方面有各种各样的工具和算法,当然,它们可能无法完全满足您的需求。

正如您链接中两个问题的答案中所指出的那样,大图的子图数量可能非常大。假设您确实想列出它们,而不仅仅是计算它们,那么这可能需要很长时间。

编辑:OP指出这里的输入是一个大图,而不是一组较小的图,这不适用于标准图挖掘

我仍然认为一般方法可以在这里工作。用于挖掘的输入图集是数据图的子图的某个子集。但是这个子图集是你首先想要的!

假设你选择一个你想要的子图大小(比如说 6 个顶点),然后你随机选择父节点中的起始顶点(互联网拓扑)并“生长”这些种子,在每个增长步骤中剔除那些不匹配。然后重复不同大小的子图。

当然,这是一个概率算法,但它可以给你一些想法。

【讨论】:

我之前也搜索过这个话题。在我看来,该问题涉及包含许多图形的图形集。并且频繁子图挖掘算法可以在整个图数据集的支持最小的情况下列出频繁出现的图。如果我故意使用“频繁子图挖掘”工具[注意]来解决这个问题(数据集只有一个图,它是父图并且最小支持= 1),我只能得到程序异常结束(我认为可能是内存溢出引起的。)。 [注] gSpanlink @TaylorFang 嗯,我明白你的意思。如果没有将图挖掘应用到网络拓扑或单个大型图输入,我仍然会感到惊讶。例如,在化学反应网络(如代谢网络)中的模式发现方面有积极的研究。 非常感谢您的帮助。让我试着用我的话来实现你的想法。在每次迭代中,随机挑选种子并通过添加共享相同端点(即种子)的边来增长,并同时通过同构测试修剪那些不匹配的边。当种子的大小达到 first-pick-size 时,将其放入子图集中。通过增加first-pick-size,可以找到大部分子图。 @TaylorFang 是的,听起来不错。这种“增长”方法相当普遍,应该在其他地方很好地描述——当然除了在多个输入图的上下文中。只访问一次(一定大小的)所有子图可能会出现问题,如果两个子图开始重叠该怎么办(尽管这对您来说可能不是问题)。

以上是关于子图枚举的高效算法的主要内容,如果未能解决你的问题,请参考以下文章

高效算法求解数独

DeepFlow高效的光流匹配算法(下)

怎样高效快速的掌握数据结构与算法?

算法如何设计--高效的大数据匹配算法

高效学习排序算法

这两种算法中的一种高效算法