В случае немаркированных графов проблема изоморфизма графов может быть решена с помощью ряда алгоритмов, которые очень хорошо работают на практике. То есть, хотя наихудшее время выполнения является экспоненциальным, обычно оно имеет полиномиальное время выполнения.
Я надеялся, что ситуация аналогична в случае помеченных графов. Однако мне действительно трудно найти какую-либо ссылку, которая предлагает «практически эффективный» алгоритм.
Замечание: Здесь мы требуем, чтобы изоморфизм сохранил метки. То есть изоморфизм между двумя конечными членами алгебры автоматов / процессов будет означать, что автоматы / члены по существу "равны переименованию узлов".
Единственная ссылка, которую я нашел, была в Википедии, в которой говорится, что проблема изоморфизма помеченных графов может быть полиномиально сведена к проблеме обычных графов. Основная статья, однако, больше касается теории сложности, чем практических алгоритмов.
Я что-то упускаю, или это действительно так, что нет эффективных «эвристических» алгоритмов, чтобы решить, изоморфны ли два помеченных графа?
Любой намек или ссылка будет здорово.
источник
Ответы:
Вас может заинтересовать эта статья:
Эйдан Хоган: сколемизация пустых узлов при сохранении изоморфизма. WWW 2015: 430-440
Он имеет алгоритм (основанный на Nauty) для проверки изоморфизма RDF-графов, которые по существу являются ориентированными помеченными графами, которые могут содержать фиксированные метки. Алгоритм учитывает метки, чтобы сузить пространство поиска.
Если вы можете представить свой входной помеченный граф как RDF-график, вы можете попробовать использовать соответствующий программный пакет "
blabel
" для проверки изоморфизма.источник
Я обнаружил, что алгоритм относится к категории алгоритмов Вейсфейлера-Лемана k-размерности, и он не работает с регулярными графами. Для больше здесь:
http://dabacon.org/pontiff/?p=4148
Оригинальный пост следует:
Несколько лет назад я создал простой и гибкий алгоритм именно для этой задачи (изоморфизм графов с метками).
Я назвал его «Powerhash», и для создания алгоритма потребовалось две идеи. Первый - это алгоритм степенного итерационного графа, также используемый в PageRank. Второе - это возможность заменить внутришаговую функцию степенной итерации на что угодно. Я заменил его функцией, которая выполняет следующие действия для каждой итерации и для каждого узла:
На первом этапе на хеш узла влияют его прямые соседи. На втором шаге на хеш узла влияет соседство в 2 шагах от него. На N-м шаге на хеш узла будут влиять соседние N-прыжки вокруг него. Так что вам нужно только продолжать запускать Powerhash для шагов N = graph_radius. В конце концов, хэш центра графа будет затронут всем графом.
Чтобы получить окончательный хэш, отсортируйте хеши узла последнего шага и объедините их вместе. После этого вы можете сравнить последние хеши, чтобы определить, являются ли два графа изоморфными. Если у вас есть метки, то добавьте их (на первой итерации) во внутренние хэши, которые вы вычисляете для каждого узла.
Подробнее об этом вы можете посмотреть в моем посте здесь:
https://plus.google.com/114866592715069940152/posts/fmBFhjhQcZF
Вышеприведенный алгоритм был реализован внутри функциональной реляционной базы данных "madIS". Вы можете найти исходный код алгоритма здесь:
https://github.com/madgik/madis/blob/master/src/functions/aggregate/graph.py
источник