У меня проблема с реализацией алгоритма VF2. Кажется, во многих случаях все работает отлично, однако есть проблема, которую я не могу решить.
Алгоритм не работает на примере ниже. В этом примере мы сравниваем два идентичных графика (см. изображение ниже). Начальная вершина равна 0. Множество P, вычисляемое внутри s0, хранит мощность всех пар вершин.
Ниже приведен псевдокод, включенный в публикации о VF2, на которых я основывал свою реализацию.
Комментарии справа от /* описывают, как я понимаю код:
Я не уверен, что создание набора P() допустимо, как описано ниже. Наборы мощности пар повторяются в лексикографическом порядке по первому, а затем по второму значению пары.
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)}) - даже если графы изоморфны.
Что я здесь делаю неправильно?