No caso de gráficos não rotulados, o problema do isomorfismo do gráfico pode ser resolvido por vários algoritmos que apresentam um desempenho muito bom na prática. Ou seja, embora o pior caso de tempo de execução seja exponencial, geralmente se tem um tempo de execução polinomial.
Eu esperava que a situação fosse semelhante no caso de gráficos rotulados. No entanto, tenho muita dificuldade em encontrar qualquer referência que proponha um algoritmo "praticamente eficiente".
Observação: aqui, exigimos que o isomorfismo preserve os rótulos. Ou seja, um isomorfismo entre dois termos finitos de álgebra de autômato / processo implicaria que os autômatos / termos são essencialmente "iguais à renomeação dos nós".
A única referência que encontrei foi a da Wikipedia que afirma que o problema de isomorfismo dos gráficos rotulados pode ser polinomialmente reduzido ao dos gráficos comuns. O artigo subjacente, no entanto, é mais sobre teoria da complexidade do que algoritmos práticos.
Estou faltando alguma coisa, ou será que realmente não existem algoritmos "heurísticos" eficientes para decidir se dois gráficos rotulados são isomórficos?
Qualquer dica ou referência seria ótimo.
Respostas:
Você pode estar interessado neste artigo:
Aidan Hogan: Skolemising Nós em branco enquanto preserva o isomorfismo. WWW 2015: 430-440
Possui um algoritmo (baseado no Nauty) para testar o isomorfismo dos gráficos RDF, que são essencialmente gráficos rotulados direcionados que podem conter rótulos fixos. O algoritmo leva em consideração os rótulos para reduzir o espaço de pesquisa.
Se você pode representar seu gráfico rotulado como um gráfico RDF, tente usar o pacote de software "
blabel
" associado para testar o isomorfismo.fonte
Descobri que o algoritmo pertence à categoria dos algoritmos de dimensão k de Weisfeiler-Lehman e falha com gráficos regulares. Para mais aqui:
http://dabacon.org/pontiff/?p=4148
A postagem original segue:
Anos atrás, criei um algoritmo simples e flexível para exatamente esse problema (isomorfismo de gráfico com rótulos).
Chamei-o de "Powerhash" e, para criar o algoritmo, foram necessários dois insights. O primeiro é o algoritmo de gráfico de iteração de energia, também usado no PageRank. A segunda é a capacidade de substituir a função de etapa interna da iteração de energia por qualquer coisa que desejarmos. Substituí-lo por uma função que faz o seguinte em cada iteração e para cada nó:
Na primeira etapa, o hash de um nó é afetado por seus vizinhos diretos. Na segunda etapa, o hash de um nó é afetado pela vizinhança a dois passos dele. Na nésima etapa, o hash de um nó será afetado pelos N-saltos da vizinhança ao seu redor. Portanto, você só precisa continuar executando as etapas do Powerhash para N = graph_radius. No final, o hash do nó do centro do gráfico será afetado por todo o gráfico.
Para produzir o hash final, classifique os hashes do nó da etapa final e concatene-os juntos. Depois disso, você pode comparar os hashes finais para descobrir se dois gráficos são isomórficos. Se você tiver rótulos, adicione-os (na primeira iteração) nos hashes internos que você calcula para cada nó.
Para mais informações, veja meu post aqui:
https://plus.google.com/114866592715069940152/posts/fmBFhjhQcZF
O algoritmo acima foi implementado dentro do banco de dados relacional funcional "madIS". Você pode encontrar o código fonte do algoritmo aqui:
https://github.com/madgik/madis/blob/master/src/functions/aggregate/graph.py
fonte