1. VF2算法
1.1 基本定义和整体流程
- 原文An Improved Algorithm for Matching Large Graphs。
- VF算法能够解决有向/无向,有标签/无标签,图同构问题。原文中的符号和VF3算法不同,这里对某些符号采用了更为广泛地符号定义。
- 给定两个图 G 1 = ( V 1 , E 1 ) G_1=(V_1,E_1) G1=(V1,E1), G 2 = ( V 2 , E 2 ) G_2=(V_2,E_2) G2=(V2,E2)和一个映射 M ⊂ V 1 × V 2 M \subset V_1 \times V_2 M⊂V1×V2, 当且仅当 M M M是一个双射且对应边也是双射时, G 1 G_1 G1和 G 2 G_2 G2称为同构。
- 作者采用了一种称为State Space Representation (SSR)的方法判断同构。假设当前状态为 s s s,则 M ( s ) M(s) M(s)表示 M M M中与状态 s s s相关的映射的集合。则 M 1 ( s ) M_1(s) M1(s)表示 M ( s ) M(s) M(s)中属于 V 1 V_1 V1中的点构成的集合,同理 M 2 ( s ) M_2(s) M2(s)。 E 1 ( s ) E_1(s) E1(s)表示 E 1 E_1 E1中连接 M 1 ( s ) M_1(s) M1(s)中点的边,同理 E 2 ( s ) E_2(s) E2(s)。
- 通过 M 1 ( s ) M_1(s) M1(s)和 E 1 ( s ) E_1(s) E1(s)我们可以得到 G 1 G_1 G1的子图 G 1 ( s ) G_1(s) G1(s),同理 G 2 ( s ) G_2(s) G2(s)。
- 算法整体流程如下图所示
其中 F ( s , n , m ) F(s,n,m) F(s,n,m)是一个布尔函数,也称为feasibility function。该函数的返回值如果是true,则表明将边 ( n , m ) (n,m) (n,m)加入到当前状态 s s s( s s s状态表示当前的部分映射 M ( s ) M(s) M(s)是满足同构的)后,新状态 s ∗ s^* s∗的部分映射 M ( s ∗ ) M(s^*) M(s∗)仍然满足同构。因此最终的状态可能是 G 1 G_1 G1与 G 2 G_2 G2同构或者两个图的子图同构。返回值为false,则表明 ( n , m ) (n,m) (n,m)不应该加入到当前状态,能够起到剪枝的作用。
1.2 P ( s ) P(s) P(s)的定义
- 给定一个图 G G G和图中的一个点 n n n,我们定义 P r e d ( G , n ) Pred(G,n) Pred(G,n)为 G G G中 n n n的入度邻居节点构成的集合( n n n的前继集合),定义 S u c c ( G , n ) Succ(G,n) Succ(G,n)为 G G G中 n n n的出度邻居节点构成的集合( n n n的后继集合)。
- 我们定义out-terminal集合 T 1 o u t ( s ) T^{out}_1(s) T1out(s)为 G 1 G_1 G1中不属于 M 1 ( s ) M_1(s) M1(s)但属于 M 1 ( s ) M_1(s) M1(s)中节点的后继节点构成的集合。定义in-terminal集合 T 1 i n ( s ) T^{in}_1(s) T1in(s)为不属于 M 1 ( s ) M_1(s) M1(s)但属于 M 1 ( s ) M_1(s) M1(s)中节点的前继节点构成的集合。同理定义 T 2 o u t ( s ) T^{out}_2(s) T2out(s)和 T 2 i n ( s ) T^{in}_2(s) T2in(s)。
- P ( s ) P(s) P(s)采用如下的方式构造:
(1)如果 T 1 o u t ( s ) T^{out}_1(s) T1out(s)和 T 2 o u t ( s ) T^{out}_2(s) T2out(s)都不为空,
P ( s ) = T 1 o u t ( s ) × { m i n T 2 o u t ( s ) } P(s)=T^{out}_1(s) \times \{min\ T^{out}_2(s)\} P(s)=T1out(s)×{ min T2out(s)}
m i n T 2 o u t ( s ) min\ T^{out}_2(s) min T2out(s)表示 T 2 o u t ( s ) T^{out}_2(s) T2out(s)中具有最小label的节点(任意一个排序方法均可)。
(2)如果 T 1 o u t ( s ) T^{out}_1(s) T1out(s)和 T 2 o u t ( s ) T^{out}_2(s) T2out(s)都为空,且 T 1 i n ( s ) T^{in}_1(s) T1in(s)和 T 2 i n ( s ) T^{in}_2(s) T2in(s)均不为空,
P ( s ) = T 1 i n ( s ) × { m i n T 2 i n ( s ) } P(s)=T^{in}_1(s) \times \{min\ T^{in}_2(s)\} P(s)=T1in(s)×{ min T2in(s)}
(3)如果四个terminal集合都是空的,
P ( s ) = ( V 1 − M 1 ( s ) ) × { m i n ( V 2 − M 2 ( s ) ) } P(s)=(V_1-M_1(s)) \times \{min\ (V_2-M_2(s))\} P(s)=(V1−M1(s))×{ min (V2−M2(s))} - 当出现只有一个in-terminal集合或者只有一个out-terminal集合为空的时候,可以证明状态 s s s不可能构造出最终的同构,因此状态 s s s不需要再继续分析。同时 P ( s ) P(s) P(s)的定义可以保证同一个状态不会被访问两次。
1.3 F ( s , n , m ) F(s,n,m) F(s,n,m)的定义
为了判断 F ( s , n , m ) F(s,n,m) F(s,n,m),算法需要检查所有与 n , m n,