У меня есть коллекция из 15M (Million) DAG (собственно направленных ациклических графов - направленных гиперкубов), которые я хотел бы удалить изоморфизмы из. Каков общий алгоритм для этого? Каждый график довольно мал: гиберкуб размерности N, где N от 3 до 6 (на данный момент), в результате чего для случая N = 6 вычисляются графики по 64 узла.
Используя networkx и python, я реализовал его так, как это работает для небольших наборов, таких как 300 000 (Thousand), просто отлично (работает через несколько дней).
def isIsomorphicDuplicate(hcL, hc):
"""checks if hc is an isomorphism of any of the hc in hcL
Returns True if hcL contains an isomorphism of hc
Returns False if it is not found"""
#for each cube in hcL, check if hc could be isomorphic
#if it could be isomorphic, then check if it is
#if it is isomorphic, then return True
#if all comparisons have been made already, then it is not an isomorphism and return False
for saved_hc in hcL:
if nx.faster_could_be_isomorphic(saved_hc, hc):
if nx.fast_could_be_isomorphic(saved_hc, hc):
if nx.is_isomorphic(saved_hc, hc):
return True
return False
Одним из лучших способов сделать это было бы преобразование каждого графика в его каноническое упорядочение, сортировку коллекции, а затем удаление дубликатов. Это исключает проверку каждого из 15M-графиков в бинарном is_isomophic() тесте, я считаю, что приведенная выше реализация - это что-то вроде O (N! N) (не учитывая изоморфное время), тогда как чистое преобразование всех в каноническое упорядочение и сортировку должно выполняться O (N) для преобразования + O (log (N) N) для поиска + O (N) для удаления дубликатов. O (N! N) → O (log (N) N)
Я нашел эту статью о канонической маркировке графа, но ее очень сложно описать математическими уравнениями, а не псевдокодом: "Алгоритм Labical Graph Labeling McKay" - http://www.math.unl.edu/~aradcliffe1/Papers/Canonical.pdf
TL;DR: У меня есть невероятно большое количество графиков для проверки посредством проверки бинарного изоморфизма. Я считаю, что общий путь это делается через каноническое упорядочение. Существуют ли какие-либо упакованные алгоритмы или опубликованные простые для реализации алгоритмов (т.е. Имеют псевдокод)?