Алгоритм изоморфизма графов

Возможный дубликат:
Изоморфизм графов

Есть ли хорошие известные эвристики для изоморфизма графов. Если кто-то знает это, сообщите мне также любой хороший и простой для понимания алгоритм изоморфизма графов.


person Abdul Samad    schedule 15.11.2011    source источник
comment
Вы смотрели здесь: en.wikipedia.org/wiki/Graph_isomorphism_problem?   -  person yasouser    schedule 15.11.2011
comment
Брендан Маккей — автор nauty, современного программа для изоморфизма графов. В этой его статье объясняются некоторые идеи.   -  person Per    schedule 15.11.2011
comment
Изоморфизм графов можно проверить, рассматривая два графа как один граф и проверяя наличие симметрий/автоморфизмов. Это можно сделать с помощью saucy быстрее, чем с помощью nauty. Отказ от ответственности: я соавтор saucy.   -  person Igor Markov    schedule 26.01.2012


Ответы (1)


Простой, но эффективный способ проверки изоморфизма между графами, которые не имеют патологически однородной структуры, состоит в том, чтобы выбрать инвариант узла, вычислить значение инварианта для всех узлов, а затем выполнить поиск (сначала в глубину) фактического изоморфизма. только каждое соединение узлов, которые имеют одинаковое значение для инварианта узла. Идея инварианта узла состоит в том, что это объект (обычно число или последовательность чисел), который вычисляется для узлов таким образом, который полностью не зависит от представления графа; т. е. инвариантен относительно выбора формы представления.

Например, количество соседей узла является инвариантом, но порядок, в котором ваша программа перебирает соседей узла, не зависит от представления (структур данных).

Обычно инварианты узла вычисляются итеративно, например. этот простой инвариант I[n], где n — узел, а I[n] — 32-битное целое число без знака:

for every node in graph:
  I[node] = count_neighbors(node)
for i = 0 .. N: # N is a constant, number of iterations
  for every node in graph:
    I'[node] = (I[node] << 13 | I[node] >> 19) ^ 0xff00ff00
    for every node' in neighbors(node):
      I'[node] += I[node']
  for every node in graph:
    I[node] = I'[node]

Эти типы инвариантов на практике отличают большинство узлов друг от друга в неоднородных графах, что на практике ускоряет этап поиска.

person Antti Huima    schedule 16.11.2011
comment
Я получил вашу идею для расчета степени графа, и я тоже думал о чем-то подобном, но как только мы вычислили степень и отклонили граф, если один граф не совместим с другим, то что после этого, какие шаги вы делаете объясняя использование DFS, не могли бы вы подробно рассказать об этом, а также о том, что делает псевдокод после строки 4. Спасибо. - person Abdul Samad; 16.11.2011
comment
Псевдокод, по сути, вычисляет хеш-значение для узлов; это инвариант. Вещи с битовыми сдвигами и XOR — это просто способ сделать инвариант менее ложным столкновением. Поиск DFS для фактического поиска изоморфизма отсутствует, правда... это была бы еще одна большая куча псевдокода :) - person Antti Huima; 16.11.2011