Respuestas:
La mejor manera (en términos de pereza) es utilizar la herramienta Sage, disponible gratuitamente, que tiene el mejor soporte para la teoría de grafos.
Ejemplo
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}
Un enfoque sería utilizar un solucionador SAT.
Introducir una variable booleana para cada vértice desde y cada vértice desde . La intuición es que será cierto si los mapas de homomorfismo . (Por supuesto, si tiene un conjunto de vértices candidato más pequeño quepodría correlacionarse, quizás reducirse utilizando consideraciones de grado u otros criterios locales, y luego puede reducir el número de variables booleanas en consecuencia. Este tipo de preprocesamiento podría mejorar significativamente la eficiencia de este enfoque).
A continuación, agregue dos tipos de cláusulas / restricciones:
Agregue algunas cláusulas para exigir que este mapeo forme un homomorfismo gráfico. En particular, para cada borde, agregue la restricción
(Puede convertir esto a 3CNF usando la transformación estándar de Tseitin).
Agregue algunas cláusulas para exigir que cada vértice desde asigna exactamente a un vértice desde . Existen varios métodos estándar para codificar esta restricción. Una forma simple es, para cada vértice, agregue la cláusula
y la cláusula
Luego, puede usar cualquier solucionador SAT estándar. No sé qué tan bien funcionará en la práctica, pero podrías intentarlo y ver cómo funciona.
En la literatura de investigación, el problema del homomorfismo gráfico se ha estudiado ampliamente para gráficos con propiedades especiales (por ejemplo, donde es una camarilla ha acotado el ancho del árbol, y así sucesivamente). Si sabe algo especial sobre la estructura de sus gráficos, puede ser posible encontrar mejores algoritmos para su problema. Para gráficos generales, se sabe que este problema es NP-hard.