VF2算法 - 实现

时间:2013-11-09 21:56:02

标签: algorithm graph subgraph isomorphism

我的VF2算法实现有问题。在许多情况下,一切似乎都很完美,但是有一个问题我无法解决。

该算法不适用于以下示例。在这个例子中,我们比较两个相同的图(见下图)。起始顶点为0。 在s0内计算的集合P存储所有顶点对的powerset。

graph http://i41.tinypic.com/2bqiw6.png

下面是关于VF2的出版物中包含的伪代码,我的实现基于该代码。

http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=B51AD0DAEDF60D6C8AB589A39A570257?doi=10.1.1.101.5342&rep=rep1&type=pdf

http://www.icst.pku.edu.cn/intro/leizou/teaching/2012-autumn/papers/part2/VF2%20A%20%28sub%29Graph%20Isomorphism%20Algorithm%20For%20Matching%20Large%20Graphs.pdf

/ *右侧的评论描述了我理解代码的方式:

我不确定创建P()集是否有效,如下所述。成对的Powersets按字典顺序通过第一个然后第二个值迭代。

PROCEDURE Match(s)
  INPUT: an intermediate state s; the initial state s0 has M(s0)=empty
  OUTPUT: the mappings between the two graphs
  IF M(s) covers all the nodes of G2 THEN
    OUTPUT M(s)
  ELSE
    Compute the set P(s) of the pairs candidate for inclusion in M(s)
    /*by powerset of all succesors from already matched M(s) if not empty or
    /*predestors to already matched M(s) if not empty
    /*or all possible not included vertices in M(s)
    FOREACH (n, m)∈ P(s)
      IF F(s, n, m) THEN
    Compute the state s ́ obtained by adding (n, m) to M(s)
    /*add n to M1(s), exclude from T1(s)
    /*add m to M2(s), exclude from T2(s)
    /*M1(s) is now M1(s'), other structures belong to s' too
    CALL Match(s′)
      END IF
    END FOREACH
    Restore data structures
    /*Return all structures as from before foreach
  END IF
END PROCEDURE

当算法进入s4时,当从函数中退出时,它会丢失有关良好顶点匹配的信息。 它导致搜索子图同构({(0,0),(1,1),(2,2),(5,3),(6,4)}) - 即使图是同构的。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

我想要知道你的问题“我在这里做错了什么”,有必要在这里包含你的一些代码。您是否根据论文中提供的伪代码自行重新实现了代码?或者你是在一些图形处理软件包的帮助下进行匹配的?

对我来说,我没有时间去挖掘细节,但我也使用图形,所以我尝试使用networkx(Python包)和Boost 1.55.0库(非常广泛的C ++ lib for graph)。您的示例和具有1000个节点的图形的另一个示例,1500个边缘返回正确的匹配(将图形与自身匹配的简单情况)。

import networkx as nx
G1 = nx.Graph()
G2 = nx.Graph()

G1.clear()
G2.clear()

G1.add_nodes_from(range(0,7))
G2.add_nodes_from(range(0,7))
G1.add_edges_from([(0,1), (1,2), (2,3), (3,4), (2,5), (5,6)])
G2.add_edges_from([(0,1), (1,2), (2,3), (3,4), (2,5), (5,6)])

from networkx.algorithms import isomorphism
GM = isomorphism.GraphMatcher(G2,G1)
print GM.is_isomorphic()
GM.mapping

缺货[39]: {0:0,1:1,2:2,3:3,4:4,5:5,6:6}