Respostas:
A melhor maneira (em termos de preguiça) é usar a ferramenta Sage, disponível gratuitamente, que tem o melhor suporte para a teoria dos grafos.
Exemplo
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}
Uma abordagem seria usar um solucionador SAT.
Introduzir uma variável booleana para cada vértice a partir de e cada vértice de . A intuição é que será verdadeira se o homomorfismo mapeia . (Claro, se você tem um conjunto candidato menor de vértices que poderia mapear para - talvez reduzida usando considerações grau ou outros critérios locais - então você pode reduzir o número de variáveis booleanas conformidade Este tipo de pré-processamento pode melhorar a. eficiência dessa abordagem significativamente.)
Em seguida, adicione dois tipos de cláusulas / restrições:
Adicione algumas cláusulas para exigir que esse mapeamento forme um homomorfismo de gráfico. Em particular, para cada aresta , adicione a restrição
(Você pode converter isso em 3CNF usando a transformação Tseitin padrão.)
Adicionar algumas cláusulas que exigem que cada vértice da mapeia para exatamente um vértice de . Existem vários métodos padrão para codificar essa restrição. Uma maneira simples é, para cada vértice , adicione a cláusula
e a cláusula
Em seguida, você pode usar qualquer solucionador SAT padrão. Não sei até que ponto isso funcionará na prática, mas você pode tentar e ver como funciona.
Na literatura de pesquisa, o problema do homomorfismo dos grafos tem sido estudado extensivamente para gráficos com propriedades especiais (por exemplo, onde é um clique, onde limita a largura da árvore e assim por diante). Se você conhece algo especial sobre a estrutura de seus gráficos, pode ser possível encontrar algoritmos melhores para o seu problema. Para gráficos gerais, esse problema é conhecido como NP-hard.