Vorrei enumerare tutti i grafici non indirizzati di dimensione , ma ho bisogno solo di un'istanza di ogni classe di isomorfismo . In altre parole, voglio enumerare tutti i grafici non isomorfi (non indirizzati) su vertici. Come posso fare questo?
Più precisamente, voglio un algoritmo che generi una sequenza di grafici non indirizzati , con la seguente proprietà: per ogni grafico non orientato su vertici, esiste un indice tale che è isomorfo a . Vorrei che l'algoritmo fosse il più efficiente possibile; in altre parole, la metrica a cui tengo è il tempo di esecuzione per generare e scorrere questo elenco di grafici. Un obiettivo secondario è che sarebbe bello se l'algoritmo non fosse troppo complesso da implementare. G n i G G i
Nota che devo avere almeno un grafico per ogni classe di isomorfismo, ma va bene se l'algoritmo produce più di un'istanza. In particolare, va bene se la sequenza di output include due grafici isomorfi, se questo aiuta a trovare più facilmente un tale algoritmo o consente algoritmi più efficienti, purché copra tutti i grafici possibili.
La mia applicazione è la seguente: ho un programma che voglio testare su tutti i grafici di dimensione . So che se due grafici sono isomorfi, il mio programma si comporterà lo stesso su entrambi (sarà corretto su entrambi o errato su entrambi), quindi è sufficiente enumerare almeno un rappresentante per ogni classe di isomorfismo e quindi testare il programma su quegli ingressi. Nella mia applicazione, è abbastanza piccolo.n
Alcuni algoritmi candidati che ho considerato:
Potrei enumerare tutte le possibili matrici di adiacenza, cioè tutte le matrici simmetriche 0-o-1 che hanno tutti gli 0 sulle diagonali. Tuttavia, ciò richiede l'enumerazione delle matrici . Molte di queste matrici rappresenteranno grafici isomorfi, quindi sembra che stia sprecando molto sforzo.2 n ( n - 1 ) / 2
Potrei enumerare tutte le possibili matrici di adiacenza e, per ciascuna, verificare se è isomorfa a uno dei grafici che ho precedentemente prodotto; se non è isomorfo a qualsiasi output precedente, emetterlo. Ciò ridurrebbe notevolmente l'elenco di output, ma richiede comunque almeno passaggi di calcolo (anche se ipotizziamo che il controllo dell'isomorfismo del grafico sia superveloce), quindi non è molto meglio di la mia metrica.
È possibile enumerare un sottoinsieme di matrici di adiacenza. In particolare, se è un grafico su vertici , senza perdita di generalità, posso presumere che i vertici siano disposti in modo tale che . In altre parole, ogni grafico è isomorfo rispetto a uno in cui i vertici sono disposti in ordine decrescente. Quindi, è sufficiente elencare solo le matrici di adiacenza che hanno questa proprietà. Non so esattamente quante matrici di adiacenza esistano, ma sono molte meno di e possono essere enumerate con molto meno din V = { v 1 , … , v n } deg v 1 ≤ deg v 2 ≤ ⋯ ≤ deg v n 2 n ( n - 1 ) / 2 2 n ( n - 1 ) / 2fasi di calcolo. Tuttavia, questo lascia ancora molta ridondanza: molte classi di isomorfismo saranno ancora coperte molte volte, quindi dubito che sia ottimale.
Possiamo fare di meglio? Se ho capito bene, ci sono circaclassi di equivalenza di grafici non isomorfi. Possiamo trovare un algoritmo il cui tempo di esecuzione è migliore degli algoritmi di cui sopra? Quanto possiamo avvicinarci alimite inferiore? Mi interessa principalmente la tracciabilità per piccoli (diciamo, o o giù di lì; abbastanza piccolo da poter plausibilmente eseguire un tale algoritmo fino al completamento), non tanto sugli asintotici per grandi .∼ 2 n ( n - 1 ) / 2 / n ! n n = 5 n = 8 n
Correlati: Costruzione di matrici binarie non equivalenti (anche se purtroppo non sembra aver ricevuto una risposta valida).