如何找到两个图的最大公共子图?

时间:2013-02-01 10:11:39

标签: algorithm graph-algorithm

我需要帮助才能找到图算法

我正在研究与距离函数相关的以下等式

d (g1, g2)   = 1-       │mcs(g1,g2) │  /
             │g1│+│g2│-│mcs (g1, g2) │

哪里

  • d (g1,g2):是基于最大公共子图的距离函数
  • g1, g2是两张图。
  • mcs (g1,g2):是两个图g1,g2的最大公共子图 其中mcs是最大的图形(通过一些涉及数字的度量) 两个主题图中包含的节点和边缘。
  • │g1│:共同诱导子图g1的基数
  • │g2│:共同诱导子图g2的基数

我的问题:如何计算MCS? 我搜索了互联网,但大多数算法都很复杂,任何人都知道从哪里可以得到一个简单的算法来编写matlab中的这个方程。

4 个答案:

答案 0 :(得分:4)

问题是NP-Complete 1

Clique Problem 2 的减少。给定一个Clique问题实例 - 图表G=(V,E),创建一个完整的clique G'=(V,E'),使E' = {(u,v) | u != v, for each u,v in V)

最大团问题的解决方案是针对G和G'的最大子图问题的解决方案。由于集团问题是NP-Hard,这个问题也是如此。

因此,没有已知的多项式解决方案来解决这个问题。

如果您正在寻找精确的算法,可以尝试exhaustive search方法和/或branch & bound方法来解决它。对不起消息感到抱歉,但至少你知道不要寻找(可能)不存在的东西(当然除非P=NP


编辑:指出暴力解决问题的方法:
您可以检查所有可能的子集,并检查它是否是可行的解决方案。
伪码:

findMCS(vertices,G1,G2,currentSubset):
  if vertices is empty: //base clause, no more candidates to check
      if isCommonSubgraph(G1,G2,currentSubset):
         return clone(currentSubset)
      else:
         return {}
  v <- vertices.pop() //take a look at the first element
  cand1 <- findMCS(vertices,G1,G2,currentSubset) //find MCS if it is NOT in the subset
  currentSubset.append(v)
  if isCommonSubgrah(G1,G2,currentSubset): //find MCS if it is in the subset
     cand2 <- findMCS(vertices,G1,G2,currentSubset)
  currentSubset.remvoe(v) //clean up environment before getting back from recursive call
  return (|cand1| > |cand2| ? cand1 : cand2) //return the maximal subset from all candidates

上面的复杂性是O(2^n)(检查所有可能的子集),并使用:findMCS(G1.vertices, G1, G2, [])调用它(其中[]是一个空列表)。

注意:

  • isCommonSubgrah(G1,G2,currentSubset)是一种易于计算的方法,当且仅当currentSubset是G1和G2的公共子图时才会回答真实。
  • | CAND1 |和| cand2 |是这些列表的大小。

(1)假设最大子图是U中的子集V,以便u1,u2 U中的每个(u1,u2)都在{{1} } {当且仅当E1(u1,u2)中时(直观地说,在两个图中共享完全相同边的顶点的最大子集)

(2)Clique问题:给定E2G=(V,E)找到最大子集U的实例,以便V中的每个u1,u2:{{ 1}}或U位于u1 = u2

答案 1 :(得分:1)

James J. McGregor提出的回溯搜索算法可用于识别两个图之间的MCS。

答案 2 :(得分:0)

你甚至无法检查一个图是否是另一个图的子图,它是已知为NP完全的subgraph isomorphism problem。因此,您无法找到最大子图,因为您无法检查同构属性(在多项式时间内)。

答案 3 :(得分:0)

主要问题是找到原始图中节点之间的对应关系(实质上是顶点的重新编号)。例如,如果我们在图 g1 中有节点 p ,而在图 g2 中有节点 q ,其中 p q 是等价的,我们想将它们映射到公共子图 c 中的节点 s

Clique问题如此困难的原因在于,无需检查不同图中的两个节点是否实际引用同一节点,我们必须尝试所有可能的节点对组合并检查每对节点是否相同一致并代表“最佳”的对应关系。

由于这些图中的节点代表地理位置,我们应该能够提出合理的距离度量,告诉我们一个图中的节点与另一个图中的任何节点相同的可能性。由于两个节点的GPS坐标可能不相同,我们需要根据问题做出一些假设。

  • 如果我们有一个数据点所在区域的地图,表示为图形 m ,我们可以重新编号或重命名 g1 g2 对应于 m 中最接近的等价物。
  • 距离(原始图形与 m 之间或 g1 g2 之间的点之间)可以是欧几里德距离或曼哈顿距离,取决于对图表更有意义的内容。
  • 您必须小心确定两个节点之间的距离,并且仍然被认为是等效的。太小,你不会得到任何比赛;太大了,你的整个图表可以压缩成一个节点。
  • 原始图中的两个或多个节点都可以映射到 c 中的同一节点。例如,如果相对于节点之间的距离频繁更新位置数据。
  • 相反,如果更新频率相对于距离较低,则原始图中的一对连续节点之间的边缘也可以映射到包含多个边的路径。因此,您必须弄清楚将这些中间节点引入公共图表或将整个路径视为单个边缘是否有意义。

一旦你对节点进行了重新编号,就可以使用Jens建议的方法来找到重新编号的图形的交集。这一切都很一般,因为我没有很多关于你的具体问题的细节,但希望它足以让你开始。