Я хотел бы перечислить все неориентированные графы размера , но мне нужен только один экземпляр каждого класса изоморфизма . Другими словами, я хочу перечислить все неизоморфные (неориентированные) графы по n вершинам. Как я могу это сделать?
Точнее, я хочу алгоритм, который будет генерировать последовательность неориентированных графов со следующим свойством: для каждого неориентированного графа G на n вершинах существует индекс i такой, что G изоморфна для G я . Я хотел бы, чтобы алгоритм был максимально эффективным; другими словами, метрика, которая меня интересует, - это время выполнения для генерации и перебора этого списка графиков. Вторичная цель состоит в том, чтобы было бы неплохо, если бы алгоритм не был слишком сложным для реализации.
Обратите внимание, что мне нужно иметь хотя бы один граф из каждого класса изоморфизма, но это нормально, если алгоритм выдает более одного экземпляра. В частности, это нормально, если выходная последовательность включает в себя два изоморфных графика, если это помогает упростить поиск такого алгоритма или позволяет использовать более эффективные алгоритмы, если они охватывают все возможные графы.
Моя заявка выглядит следующим образом: у меня есть программа, которую я хочу протестировать на всех графиках размера . Я знаю, что если два графа изоморфны, моя программа будет вести себя одинаково на обоих (она будет либо правильной на обоих, либо неправильной на обоих), поэтому достаточно перечислить хотя бы одного представителя от каждого класса изоморфизма, а затем проверить программа на этих входах. В моем приложении n довольно мало.
Некоторые возможные алгоритмы, которые я рассмотрел:
Я мог бы перечислить все возможные матрицы смежности, т. Е. Все симметричные матрицы 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 шагов вычисление. Тем не менее, это все еще оставляет много избыточности: многие классы изоморфизма будут по-прежнему покрываться много раз, поэтому я сомневаюсь, что это оптимально.
Связанный: Построение неэквивалентных двоичных матриц (хотя, к сожалению, кажется, что никто не получил правильный ответ).