Enumera tutti i grafici non isomorfi di una certa dimensione


30

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?nn

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 iG1,G2,,GkGniGGi

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.nnn

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 ) / 2n×n2n(n1)/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.2n(n1)/2

  • È 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 1deg v 2deg v n 2 n ( n - 1 ) / 2 2 n ( n - 1 ) / 2GnV={v1,,vn}degv1degv2degvn2n(n1)/22n(n1)/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 n2n(n1)/2/n!2n(n1)/2/n!nn=5n=8n

Correlati: Costruzione di matrici binarie non equivalenti (anche se purtroppo non sembra aver ricevuto una risposta valida).


1
Dopotutto, anche il numero di grafici di dimensioni fino all'isomorfismo è sconosciuto, quindi penso sia improbabile che esista un algoritmo (non-forza bruta). Per quanto riguarda i tuoi algoritmi candidati, tieni presente che non conosciamo un algoritmo a tempo polinomiale per il controllo dell'isomorfismo del grafico (afaik), quindi qualsiasi algoritmo che dovrebbe essere eseguito in dovrebbe evitare di dover controllare l'isomorfismo (spesso / stupidamente). (Inoltre, .)O ( | output | ) | uscita | = Ω ( n | classi | )nO(|output|)|output|=Ω(n|classes|)
Raffaello

@Raphael, (1) So che non conosciamo il numero esatto di grafici di dimensioni fino all'isomorfismo, ma questo problema non richiede necessariamente di saperlo (ad es. A causa del fatto che sto bene con le ripetizioni). Non so perché ciò implicherebbe che è improbabile che esista un algoritmo migliore di quello che ho dato. (2) Sì, so che non esiste un algoritmo tempo polinomiale noto per l'isomorfismo grafico, ma qui parleremo di valori di come , quindi gli algoritmi esistenti saranno probabilmente veloci - e comunque, ho solo menzionato quell'algoritmo candidato a rifiutarlo, quindi è discutibile comunque. n n = 6nnn=6
DW

Per al massimo 6, credo che dopo aver scelto il numero di vertici e il numero di spigoli e ordinato le etichette dei vertici in modo non decrescente per grado come suggerisci, allora ci saranno pochissime classi di isomorfismi possibili. A questo punto potrebbe diventare possibile ordinare i casi rimanenti mediante un controllo di isomorfismo a forza bruta usando ad esempio NAUTY o BLISS. n
Simon,

Risposte:


19

Probabilmente il modo più semplice per elencare tutti i grafici non isomorfi per piccoli conteggi di vertici è scaricarli dalla collezione di Brendan McKay . L'algoritmo di enumerazione è descritto nel documento di McKay [1] e funziona estendendo non isomorfi di dimensione n-1 in tutti i modi possibili e verificando se il nuovo vertice era canonico. È implementato come gengnel correttore di isomorfismi grafici di McKay nauty.

[1]: BD McKay, Applicazioni di una tecnica per l'enumerazione etichettata , Congressus Numerantium, 40 (1983) 207-221.


Ho un problema. Sto prendendo un grafico delle dimensioni n-1e lo estendo di un vertice in tutti i modi possibili, come hai detto. Quindi controllo se il vertice ha un'etichetta canonica, diciamo 1(vertice canonico ?!). Tuttavia, cosa succede se il grafico è solo isomorfo rispetto alla forma canonica e il vertice ha un'etichetta diversa? Ho provato a controllare gli automorfismi per vedere se il vertice con etichetta 1è nella stessa orbita, ma poi finisco con il grafico due volte nella mia lista. Il documento non mi aiuta davvero. Inoltre, il codice sorgente di geng è illeggibile a causa di tutte quelle ottimizzazioni binarie e quasi nessun commento.
Alex,

1
@Alex Volete sicuramente la versione del controllo che determina se il nuovo vertice è nella stessa orbita di 1. Potreste fare un esempio in cui questo produce due grafici isomorfi? Forse questo sarebbe meglio come una nuova domanda.
David Eisenstat,

Ok, grazie mille! Immagino che in quel caso "l'estensione in tutti i modi possibili" debba in qualche modo considerare gli automorfismi del grafico con i n-1vertici? ad es. n = 3 e il mio grafico precedente era P2. Quindi i due casi in cui unisco il terzo vertice a uno dei vertici precedenti risulteranno ovviamente nello stesso grafico P3. Potresti spiegare rapidamente come "estendere correttamente in tutti i modi possibili" o dovrei fare questo come un'altra domanda? (Inoltre, a volte sono confuso su ciò che accade, poiché il mio programma deve trovare non isomorfismi di un tipo speciale di grafico, il che rende le cose un po 'più complicate)
Alex

@Alex Sì, sembra che l'estensione stessa debba essere canonica. Probabilmente merita una nuova domanda, dal momento che non ricordo come funziona dalla parte superiore della mia testa.
David Eisenstat,

1
Home page di Nauty
Guy Coder

4

Propongo un miglioramento alla tua terza idea: riempire la matrice di adiacenza riga per riga, tenendo traccia dei vertici che sono equivalenti per quanto riguarda il grado e l'adiacenza ai vertici precedentemente riempiti. Quindi inizialmente le classi di equivalenza saranno costituite da tutti i nodi con lo stesso grado.
Quando un vertice appena riempito è adiacente solo ad alcuni dei nodi equivalenti, qualsiasi scelta porta a rappresentanti delle stesse classi di isomorfismo. Quindi consideriamo solo l'assegnazione, in cui il vertice attualmente riempito è adiacente ai vertici equivalenti con il numero più alto (e dividere la classe di equivalenza in due per il processo rimanente).

Penso (ma non ho provato a provare) che questo approccio copre tutti gli isomorfismi per . Per grafici più grandi, potremmo ottenere isomorfismi in base al fatto che in un sottografo con bordi e (e nessun altro), abbiamo due gruppi equivalenti di vertici, ma che non è seguito da l'approccio. (Potrebbe ovviamente essere esteso, ma dubito che valga la pena, se miri solo a )( 1 , 2 ) ( 3 , 4 ) n = 6n<6
(1,2)(3,4)n=6

Un'implementazione ingenua di questo algoritmo si verificherà in vicoli ciechi, in cui si scopre che la matrice di adiacenza non può essere riempita in base al set di gradi dato e ai compiti precedenti. Potrebbe valere la pena di rilevare / filtrare questi in anticipo. Qualche idea:

  • Se la somma dei gradi è dispari, non formeranno mai un grafico
  • Riempi immediatamente le voci per i vertici che devono essere collegati a tutti / nessuno dei vertici rimanenti.

3

Questi documenti potrebbero essere di interesse.

"Sulla rappresentazione concisa dei grafici", Gyorgy Turan, Discrete Applied Mathematics, Volume 8, Issue 3, July 1984, pp. 289-294 http://www.sciencedirect.com/science/article/pii/0166218X84901264

"Rappresentazione succinta di grafici generali senza etichetta", Moni Naor, Discrete Applied Mathematics, Volume 28, Numero 3, settembre 1990, pp. 303-307 http://www.sciencedirect.com/science/article/pii/0166218X9090011Z

Presentano funzioni di codifica e decodifica per la codifica di un grafico con etichetta di vertice in modo che due di questi grafici si associno alla stessa parola di codice se e solo se uno risulta dal permutare le etichette di vertice dell'altro.

Inoltre è dimostrato che le funzioni di codifica e decodifica sono efficienti.

Il primo documento tratta i grafici planari. Nel secondo documento, la restrizione di planarità è stata rimossa.

EDIT: questo documento potrebbe anche essere rilevante:

Isomorfismo grafico nel tempo quasi polinomiale, Laszlo Babai, Università di Chicago, Preprint su arXiv, 9 dicembre 2015 http://arxiv.org/pdf/1512.03547v1.pdf

L'annuncio di Babai del suo risultato ha fatto notizia: https://www.sciencenews.org/article/new-algorithm-cracks-graph-problem

Ma forse mi sbaglio a confondere la domanda dei PO con questi tre documenti? L'OP desidera enumerare i grafici non isomorfi, ma può comunque essere utile disporre di metodi efficienti per determinare quando due grafici SONO isomorfi?


Apprezzo il pensiero, ma temo non sto chiedendo come determinare se due grafici sono isomorfi. Sto davvero chiedendo come enumerare i grafici non isomorfi. Descrivere gli algoritmi per verificare se due grafici sono isomorfi non mi aiuta davvero, temo, grazie per averci provato!
DW

Turan e Naor (nei documenti che menziono sopra) costruiscono funzioni del tipo che descrivi, cioè che mappano un grafico in un rappresentante canonico della classe di equivalenza a cui appartiene quel grafico. Se potessi elencare quei rappresentanti canonici, allora sembrerebbe che risolveresti il ​​tuo problema.
Simon,

Babai ha ritirato l'affermazione di runtime quasipolinomiale . Apparentemente si è verificato un errore nell'analisi.
Raffaello

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.