【问题标题】:Is there any simple example to explain ullmann algorithm有没有简单的例子来解释乌尔曼算法
【发布时间】:2013-07-03 00:58:52
【问题描述】:

我是学习图论的大一新生。我现在正在学习(子)图同构。有两个重要的算法:乌尔曼算法vf2

我读过 Ullmann 的论文:子图同构的算法。我也google了一下,google给了我很多应用,但是我看不懂算法的过程。

你能给我一个简单的解释吗?

【问题讨论】:

    标签: subgraph isomorphism


    【解决方案1】:

    This answer 到一个相关问题给出了 Ullmann 算法的源代码。

    These slides举个例子,但是在幻灯片“Ullmann’s Algorithm V2”上只提到了算法的主要成分,没有例子。

    所以我将在下面举一个例子。我们想知道 GB 是否有一个与 GA 同构的子图。也就是说,我们将尝试将 GA 的顶点映射到 GB 的顶点,以便将 GA 的边映射到 GB 的边上。

    请注意,原始论文和幻灯片都使用称为 M 的矩阵,但代码没有。这是因为矩阵代表的可能与代码中的 possible_assignments[i] 相同。如果第 i 个顶点可以映射到 GB 的第 j 个顶点,则 M[i][j] 正好为 1。对于GB的顶点集,我将使用candidate(u)等,其中可以映射GB的顶点u。

    第一个观察结果是 GA 的一个顶点只能映射到 GB 的一个顶点,其度数至少相同。所以最初,candidate(u) = Candidates(v) = {a,b,e,f,g},candidate(w) = {f}和z的candidates都是GB的顶点。

    现在是我们第一次执行“refine M”过程,这是 Ullmann 算法的主要成分。也就是说,我们检查只要 GB 的顶点 x 是 GA 的顶点 y 的候选者,那么 y 的每个邻居在 x 的邻居中至少有一个候选者。如果此检查失败,则我们从 y 的候选者中删除 x。我们会检查这些删除,直到无法进一步删除为止。

    例如,h 是 z 的候选者之一。然而,w 是 z 的邻居,但 h 的邻居(即 g)没有一个在 cadidates(w)={f} 中。因此我们永远无法将 z 映射到 h,因为边 {w,z} 将映射到非边。所以我们可以安全地从候选(z)中删除 h。细化的结果是:candidate(u) = Candidates(v) = Candidates(z) = {a,e,g} and Candidates(w) = {f}。

    现在我们开始回溯。

    我们首先尝试将 u 映射到 a。也就是说,我们设置 Candidate(u) = {a} 并从其他候选集中删除 a。 Refine 发现 e 和 g 都不是 a 的邻居,因此我们从候选 (v) 中删除 e 和 g。这使得 Candidate(v) 为空,所以我们从这个分支返回;撤消对候选人所做的更改。

    现在,我们尝试将 u 映射到 e。同样,候选人(v)最终将是空的。

    最后,我们尝试将 u 映射到 g,结果相同。

    我们得出结论,GA 不是 GB 的子图。无需尝试所有 8*7*6*5 的作业。

    我忘记了 Ullmann 最初是按度数降序对 GA 的顶点进行排序的。但这不会有太大的不同——我们只会首先发现 w 只能映射到 f,然后我们会继续在 u 上进行分支,得到的结果与我们得到的完全相同。

    【讨论】:

    • 很好的解释!你知道运行时间可能是多少吗?
    • 令 nA 和 nB 分别为 GA 和 GB 的顶点数。在最坏的情况下,我们可能需要回溯几乎所有可能的分配,而且它们的数量成倍增加;确切的数字是 nB*(nB-1)*...*(nB-nA+1)=nB!/(nB-nA)!。在最好的情况下,GB 的任何一个顶点都不会对 GA 的第一个顶点有足够高的度数,因此总时间将与输入的大小成线性关系。可以找到一些对实际速度的估计,例如在 P Foggia、C Sansone 和 M Vento 的论文“图同构的五种算法的性能比较”中。
    猜你喜欢
    • 2012-10-25
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2012-06-15
    • 2020-03-19
    • 1970-01-01
    相关资源
    最近更新 更多