Chciałbym wyliczyć wszystkie niekierowane wykresy wielkości , ale potrzebuję tylko jednego wystąpienia każdej klasy izomorfizmu . Innymi słowy, chcę wyliczyć wszystkie nieizomorficzne (niekierowane) wykresy na wierzchołkach. W jaki sposób mogę to zrobić?
Dokładniej, chcę algorytmu, który wygeneruje sekwencję niekierowanych wykresów , z następującą właściwością: dla każdego niekierowanego wykresu na wierzchołkach istnieje indeks taki, że jest izomorficzny do . Chciałbym, aby algorytm był tak wydajny, jak to możliwe; innymi słowy, miarą, na której mi zależy, jest czas działania do wygenerowania i iteracji po tej liście wykresów. Drugi cel polega na tym, że byłoby miło, gdyby algorytm nie był zbyt skomplikowany do wdrożenia.
Zauważ, że muszę mieć co najmniej jeden wykres z każdej klasy izomorfizmu, ale jest OK, jeśli algorytm wytwarza więcej niż jedną instancję. W szczególności jest OK, jeśli sekwencja wyjściowa zawiera dwa wykresy izomorficzne, jeśli pomaga to w znalezieniu takiego algorytmu lub umożliwia wydajniejsze algorytmy, o ile obejmują wszystkie możliwe wykresy.
Moja aplikacja jest następująca: Mam program, który chcę przetestować na wszystkich wykresach wielkości . Wiem, że jeśli dwa wykresy są izomorficzne, mój program będzie działał tak samo na obu (będzie albo poprawny na obu, albo niepoprawny na obu), więc wystarczy wyliczyć przynajmniej jednego przedstawiciela z każdej klasy izomorficznej, a następnie przetestować program na tych wejściach. W mojej aplikacji jest dość małe.n
Niektóre algorytmy kandydujące, które rozważałem:
Mógłbym wyliczyć wszystkie możliwe macierze przylegania, tj. Wszystkie macierze symetryczne 0-lub-1, które mają wszystkie zera na przekątnych. Wymaga to jednak wyliczenia macierzy. Wiele z tych matryc będzie reprezentować grafy izomorficzne, więc wygląda na to, że marnuje dużo wysiłku.
Mógłbym wyliczyć wszystkie możliwe macierze przylegania i dla każdej przetestować, czy jest on izomorficzny na którymkolwiek z wcześniej wygenerowanych wykresów; jeśli nie jest izomorficzny w stosunku do jakichkolwiek danych wyjściowych, wyślij go. To znacznie skróciłoby listę wyjściową, ale nadal wymaga co najmniej kroków obliczeniowych (nawet jeśli założymy, że sprawdzenie izomorfizmu wykresu jest super szybkie), więc według mojej metryki nie jest dużo lepsze.
Możliwe jest wyliczenie podzbioru macierzy przylegania. W szczególności, jeśli jest wykresem n wierzchołków V = { v 1 , … , v n } , bez utraty ogólności, mogę założyć, że wierzchołki są ułożone w taki sposób, że deg v 1 ≤ deg v 2 ≤ ⋯ ≤ deg v n. Innymi słowy, każdy wykres jest izomorficzny do tego, w którym wierzchołki są ułożone w kolejności nie malejącej. Wystarczy więc wyliczyć tylko macierze przyległości, które mają tę właściwość. Nie wiem dokładnie, ile jest takich macierzy przylegania, ale jest ich znacznie mniej niż i można je policzyć o wiele mniej niż 2 n ( n - 1 ) / 2 kroków obliczenie. Jednak nadal pozostawia to wiele nadmiarowości: wiele klas izomorfizmu będzie nadal objętych wiele razy, więc wątpię, aby było to optymalne.
Czy możemy zrobić lepiej? Jeśli dobrze rozumiem, jest około klasy równoważności grafów nieizomorficznych. Czy możemy znaleźć algorytm, którego czas działania jest lepszy niż powyższe algorytmy? Jak blisko możemy dojść do ∼ 2 n ( n - 1 ) / 2 / n ! Dolna granica? Dbam przede wszystkim o podatność na małe n (powiedzmy n = 5 lub n = 8)lub tak; wystarczająco małe, aby można było uruchomić taki algorytm do końca), nie tyle o asymptotykach dla dużego .
Powiązane: Konstruowanie nierównych macierzy binarnych (choć niestety wydaje się, że nie otrzymano prawidłowej odpowiedzi).