Réponses:
La meilleure façon (en termes de paresse) est d'utiliser l'outil librement disponible Sage qui a le meilleur support pour la théorie des graphes.
Exemple
sage: G = graphs.PetersenGraph()
sage: G.has_homomorphism_to(graphs.CycleGraph(5))
False
sage: G.has_homomorphism_to(graphs.CompleteGraph(5))
{0: 0, 1: 1, 2: 0, 3: 1, 4: 2, 5: 1, 6: 0, 7: 2, 8: 2, 9: 1}
Une approche consisterait à utiliser un solveur SAT.
L' introduction d' une variable booléenne pour chaque sommet de et chaque sommet de . L'intuition est que sera vrai si l'homomorphisme mappe . (Bien sûr, si vous avez un ensemble de candidats plus petit des sommets pourrait mapper - peut - être rétréci vers le bas en utilisant des considérations de degré ou d' autres critères locaux - alors vous pouvez réduire le nombre de variables booléennes en conséquence Ce type de pré - traitement peut améliorer la. l'efficacité de cette approche de manière significative.)
Ensuite, ajoutez deux types de clauses / contraintes:
Ajoutez quelques clauses pour exiger que ce mappage forme un homomorphisme de graphe. En particulier, pour chaque arête , ajoutez la contrainte
(Vous pouvez le convertir en 3CNF en utilisant la transformation Tseitin standard.)
Ajouter des clauses d'exiger que chaque sommet de correspond exactement à un sommet de . Il existe un certain nombre de méthodes standard pour coder cette contrainte. Une façon simple est, pour chaque sommet , d'ajouter la clause
et la clause
Ensuite, vous pouvez utiliser n'importe quel solveur SAT standard. Je ne sais pas dans quelle mesure cela fonctionnera dans la pratique, mais vous pouvez essayer et voir comment cela fonctionne.
Dans la littérature de recherche, le problème de l'homomorphisme des graphes a été étudié de manière approfondie pour les graphes avec des propriétés spéciales (par exemple, où est une clique, où a une largeur d'arbre limitée, etc.). Si vous savez quelque chose de spécial sur la structure de vos graphiques, il peut être possible de trouver de meilleurs algorithmes pour votre problème. Pour les graphiques généraux, ce problème est connu pour être NP-difficile.