Gostaria de enumerar todos os gráficos não direcionados de tamanho , mas preciso apenas de uma instância de cada classe de isomorfismo . Em outras palavras, quero enumerar todos os gráficos não isomórficos (não direcionados) em vértices. Como posso fazer isso?
Mais precisamente, eu quero um algoritmo que gere uma sequência de gráficos não direcionados , com a seguinte propriedade: para todo gráfico não direcionado em vértices, existe um índice tal que seja isomórfico para . Eu gostaria que o algoritmo fosse o mais eficiente possível; em outras palavras, a métrica com a qual me preocupo é o tempo de execução para gerar e iterar nesta lista de gráficos. Um objetivo secundário é que seria bom se o algoritmo não fosse muito complexo para implementar.
Observe que eu preciso ter pelo menos um gráfico de cada classe de isomorfismo, mas tudo bem se o algoritmo produzir mais de uma instância. Em particular, não há problema se a sequência de saída incluir dois gráficos isomórficos, se isso facilitar a localização de um algoritmo ou permitir algoritmos mais eficientes, desde que abranja todos os gráficos possíveis.
Minha aplicação é a seguinte: Eu tenho um programa que quero testar em todos os gráficos de tamanho . Sei que se dois gráficos são isomórficos, meu programa se comportará da mesma maneira em ambos (será correto em ambos ou incorreto em ambos), portanto, basta enumerar pelo menos um representante de cada classe de isomorfismo e testar o programa sobre essas entradas. Na minha aplicação, é bastante pequeno.
Alguns algoritmos candidatos que considerei:
Eu poderia enumerar todas as matrizes de adjacência possíveis, ou seja, todas as matrizes simétricas 0-ou-1 que possuem todos os 0 nas diagonais. No entanto, isso requer enumerar matrizes. Muitas dessas matrizes representam gráficos isomórficos, então isso parece estar desperdiçando muito esforço.
Eu poderia enumerar todas as matrizes de adjacência possíveis e, para cada uma delas, testar se é isomórfica para qualquer um dos gráficos que eu produzi anteriormente; se não for isomórfico para qualquer saída anterior, faça a saída. Isso reduziria muito a lista de saída, mas ainda requer pelo menos etapas de cálculo (mesmo se assumirmos que a verificação do isomorfismo do gráfico é super rápida), por isso não é muito melhor minha métrica.
É possível enumerar um subconjunto de matrizes de adjacência. Em particular, se é um gráfico nos vértices , sem perda de generalidade, posso assumir que os vértices estão organizados de modo que . Em outras palavras, todo gráfico é isomórfico para um onde os vértices são organizados em ordem de grau não decrescente. Portanto, basta enumerar apenas as matrizes de adjacência que possuem essa propriedade. Não sei exatamente quantas matrizes de adjacência existem, mas são muito menos que , e elas podem ser enumeradas com muito menos quen V = { v 1 , … , v n } deg v 1 ≤ deg v 2 ≤ ⋯ ≤ deg v n 2 n ( n - 1 ) / 2 2 n ( n - 1 ) / 2etapas de computação. No entanto, isso ainda deixa muita redundância: muitas classes de isomorfismo ainda serão abordadas muitas vezes, então duvido que isso seja ótimo.
Podemos fazer melhor? Se bem entendi, existem aproximadamenteclasses de equivalência de gráficos não isomórficos. Podemos encontrar um algoritmo cujo tempo de execução seja melhor que os algoritmos acima? Quão perto podemos chegar alimite inferior? Preocupo-me principalmente com a rastreabilidade de pequeno (digamos, ou ou mais; pequeno o suficiente para que seja possível executar tal algoritmo até a conclusão), e não tanto com os assintóticos para grande .
Relacionado: Construindo matrizes binárias desigual (embora, infelizmente, não pareça ter recebido uma resposta válida).