Я хотів би перерахувати всі непрямі графіки розміром , але мені потрібен лише один примірник кожного класу ізоморфізму . Іншими словами, я хочу перерахувати всі неізоморфні (непрямі) графіки на n вершинах. Як я можу це зробити?
Точніше, я хочу алгоритм, який генерує послідовність непрямих графіків із таким властивістю: для кожного непрямого графа G на n вершинах існує індекс i такий, що G ізоморфний до Г i . Я хотів би, щоб алгоритм був максимально ефективним; Іншими словами, метрика, яку я хвилюю, - це час роботи для створення та повторення через цей список графіків. Вторинна мета - це було б непогано, якби алгоритм був не надто складним для реалізації.
Зауважте, що мені потрібно мати принаймні один графік з кожного класу ізоморфізму, але це нормально, якщо алгоритм створює більше одного екземпляра. Зокрема, це нормально, якщо вихідна послідовність включає два ізоморфних графіки, якщо це допомагає полегшити пошук такого алгоритму або дозволяє більш ефективні алгоритми, якщо вони охоплюють усі можливі графіки.
Моя заявка така: У мене є програма, яку я хочу перевірити на всіх графіках розміру . Я знаю, що якщо два графіки є ізоморфними, моя програма буде поводитись однаково на обох (вона буде або правильною для обох, або неправильною для обох), тому достатньо перерахувати хоча б одного представника з кожного класу ізоморфізму, а потім перевірити тест програма на цих входах. У моєму застосуванні п досить невеликий.
Я розглянув кілька алгоритмів-кандидатів:
Я міг би перерахувати всі можливі матриці суміжності, тобто всі симетричні 0-або-1 матриць, які мають всі 0 на діагоналях. Однак для цього потрібно перерахувати 2 n ( n - 1 ) / 2 матриць. Багато з цих матриць представлятимуть ізоморфні графіки, тому, здається, це витрачає багато зусиль.
Я міг би перерахувати всі можливі матриці суміжності, і для кожної перевірити, чи це ізоморфна будь-якому з графіків, які я раніше вивів; якщо воно не є ізоморфним до чогось раніше, виведіть його. Це значно скоротить список вихідних даних, але він все одно потребує принаймні етапи обчислення (навіть якщо вважати, що перевірка ізоморфізму графіка є надшвидкою), тому за моєю метрикою це не набагато краще.
Можна перерахувати підмножину матриць суміжності. Зокрема, якщо - графік на n вершинах V = { v 1 , … , v n } , без втрати загальності я можу припустити, що вершини розташовані так, що deg v 1 ≤ deg v 2 ≤ ⋯ ≤ deg v n. Іншими словами, кожен графік ізоморфний такому, де вершини розташовані в порядку зменшення ступеня. Отже, досить перерахувати лише матриці суміжності, які мають цю властивість. Я точно не знаю, скільки таких матриць суміжності є, але це набагато менше , і їх можна перерахувати набагато менше 2 n ( n - 1 ) / 2 кроків обчислення. Однак це все ще залишає багато надмірності: багато класів ізоморфізму все ще будуть охоплені багато разів, тому я сумніваюся, що це оптимально.
Чи можемо ми зробити краще? Якщо я правильно розумію, є приблизно класи еквівалентності неізоморфних графіків. Чи можемо ми знайти алгоритм, час роботи якого кращий за вищезазначені? Як близько ми можемо дістатися до ~ 2 п ( п - 1 ) / 2 / п ! нижня межа? Я переймаюся передусім тяговістю для малих n (скажімо, n = 5 або n = 8або так; достатньо малий, щоб можна було правдоподібно запустити такий алгоритм до завершення), не стільки про асимптотику для великих .
Пов’язано: Побудова нееквівалентних двійкових матриць (хоча, на жаль, на одну, здається, не отримали дійсної відповіді).