Dans le cas des graphes non étiquetés, le problème d'isomorphisme des graphes peut être résolu par un certain nombre d'algorithmes qui fonctionnent très bien en pratique. Autrement dit, bien que le pire des temps d'exécution soit exponentiel, on a généralement un temps d'exécution polynomial.
J'espérais que la situation est similaire dans le cas des graphiques étiquetés. Cependant, j'ai vraiment du mal à trouver une référence qui propose un algorithme "pratiquement efficace".
Remarque: Ici, nous exigeons que l'isomorphisme préserve les étiquettes. C'est-à-dire qu'un isomorphisme entre deux termes finis d'automate / algèbre de processus impliquerait que les automates / termes sont essentiellement "égaux jusqu'au renommage des nœuds".
La seule référence que j'ai trouvée était celle de Wikipedia qui stipule que le problème d'isomorphisme des graphiques étiquetés peut être polynomialement réduit à celui des graphiques ordinaires. Cependant, l'article sous-jacent concerne davantage la théorie de la complexité que les algorithmes pratiques.
Il me manque quelque chose, ou est-ce vraiment le cas qu'il n'y a pas d'algorithmes "heuristiques" efficaces pour décider si deux graphes étiquetés sont isomorphes?
Tout indice ou référence serait formidable.
Réponses:
Vous pourriez être intéressé par cet article:
Aidan Hogan: Skolémiser des nœuds vides tout en préservant l'isomorphisme. WWW 2015: 430-440
Il dispose d'un algorithme (basé sur Nauty) pour tester l'isomorphisme des graphes RDF, qui sont essentiellement des graphes étiquetés dirigés qui peuvent contenir des étiquettes fixes. L'algorithme prend en compte les étiquettes pour réduire l'espace de recherche.
Si vous pouvez représenter votre graphe étiqueté en entrée comme un graphe RDF, vous pouvez essayer d'utiliser le progiciel associé "
blabel
" pour tester l'isomorphisme.la source
J'ai découvert que l'algorithme appartient à la catégorie des algorithmes de Weisfeiler-Lehman de dimension k, et il échoue avec les graphiques réguliers. Pour en savoir plus ici:
http://dabacon.org/pontiff/?p=4148
Le message d'origine suit:
Il y a des années, j'ai créé un algorithme simple et flexible pour exactement ce problème (isomorphisme graphique avec étiquettes).
Je l'ai nommé "Powerhash", et pour créer l'algorithme, il a fallu deux idées. Le premier est l'algorithme de graphique d'itération de puissance, également utilisé dans PageRank. La seconde est la possibilité de remplacer la fonction d'étape interne de l'itération de puissance par tout ce que nous voulons. Je l'ai remplacé par une fonction qui fait ce qui suit à chaque itération et pour chaque nœud:
Lors de la première étape, le hachage d'un nœud est affecté par ses voisins directs. À la deuxième étape, le hachage d'un nœud est affecté par le voisinage à 2 sauts de lui. À la Nème étape, le hachage d'un nœud sera affecté par les N-sauts de voisinage qui l'entourent. Il vous suffit donc de continuer à exécuter Powerhash pour N = étapes graph_radius. Au final, le hachage du nœud central du graphe aura été affecté par l'ensemble du graphe.
Pour produire le hachage final, triez les hachages de nœuds de l'étape finale et concaténez-les ensemble. Après cela, vous pouvez comparer les hachages finaux pour savoir si deux graphiques sont isomorphes. Si vous avez des étiquettes, ajoutez-les (lors de la première itération) dans les hachages internes que vous calculez pour chaque nœud.
Pour en savoir plus, vous pouvez consulter mon article ici:
https://plus.google.com/114866592715069940152/posts/fmBFhjhQcZF
L'algorithme ci-dessus a été implémenté dans la base de données relationnelle fonctionnelle "madIS". Vous pouvez trouver le code source de l'algorithme ici:
https://github.com/madgik/madis/blob/master/src/functions/aggregate/graph.py
la source