Je voudrais énumérer tous les graphiques non dirigés de taille , mais je n'ai besoin que d'une instance de chaque classe d'isomorphisme . En d'autres termes, je veux énumérer tous les graphes non isomorphes (non dirigés) sur sommets. Comment puis-je faire ceci?
Plus précisément, je veux un algorithme qui va générer une séquence de graphes non orientés , avec la propriété suivante: pour chaque graphe non orienté sur sommets, il existe un indice tel que est isomorphe à . J'aimerais que l'algorithme soit aussi efficace que possible; en d'autres termes, la métrique qui m'intéresse est le temps d'exécution pour générer et parcourir cette liste de graphiques. Un objectif secondaire est que ce serait bien si l'algorithme n'est pas trop complexe à implémenter. G n i G G i
Notez que j'ai besoin d'avoir au moins un graphique de chaque classe d'isomorphisme, mais c'est OK si l'algorithme produit plus d'une instance. En particulier, c'est OK si la séquence de sortie comprend deux graphiques isomorphes, si cela aide à trouver plus facilement un tel algorithme ou permet des algorithmes plus efficaces, tant qu'il couvre tous les graphiques possibles.
Mon application est la suivante: j'ai un programme que je souhaite tester sur tous les graphes de taille . Je sais que si deux graphiques sont isomorphes, mon programme se comportera de la même façon sur les deux (il sera soit correct sur les deux, soit incorrect sur les deux), il suffit donc d'énumérer au moins un représentant de chaque classe d'isomorphisme, puis de tester le programme sur ces entrées. Dans mon application, est assez petit.n
Quelques algorithmes candidats que j'ai envisagés:
Je pourrais énumérer toutes les matrices d'adjacence possibles, c'est-à-dire toutes les matrices symétriques 0 ou 1 qui ont tous les 0 sur les diagonales. Cependant, cela nécessite l'énumération de matrices . Beaucoup de ces matrices représenteront des graphes isomorphes, donc cela semble gaspiller beaucoup d'efforts.2 n ( n - 1 ) / 2
Je pourrais énumérer toutes les matrices d'adjacence possibles, et pour chacune, tester si elle est isomorphe à l'un des graphiques que j'ai précédemment produits; s'il n'est pas isomorphe à quoi que ce soit de sortie avant, sortez-le. Cela raccourcirait considérablement la liste de sortie, mais cela nécessite toujours au moins étapes de calcul (même si nous supposons que la vérification de l'isomorphisme du graphique est super rapide), donc ce n'est pas beaucoup mieux en ma métrique.
Il est possible d'énumérer un sous-ensemble de matrices d'adjacence. En particulier, si est un graphe sur sommets , sans perte de généralité je peux supposer que les sommets sont disposés de telle sorte que . En d'autres termes, chaque graphique est isomorphe à un où les sommets sont disposés par ordre de degré non décroissant. Il suffit donc d'énumérer uniquement les matrices d'adjacence qui ont cette propriété. Je ne sais pas exactement combien il y a de telles matrices d'adjacence, mais elles sont beaucoup moins de , et elles peuvent être énumérées avec beaucoup moins deétapes de calcul. Cependant, cela laisse encore beaucoup de redondance: de nombreuses classes d'isomorphisme seront encore couvertes plusieurs fois, donc je doute que ce soit optimal.
Pouvons-nous faire mieux? Si je comprends bien, il y a environclasses d'équivalence des graphes non isomorphes. Pouvons-nous trouver un algorithme dont le temps d'exécution est meilleur que les algorithmes ci-dessus? Jusqu'où pouvons-nous nous rapprocher duborne inférieure? Je m'intéresse principalement à la tractabilité pour les petits (disons, ou environ; assez petit pour que l'on puisse vraisemblablement exécuter un tel algorithme jusqu'à son terme), pas tellement à propos des asymptotiques pour les grands .
Connexe: Construire des matrices binaires inéquivalentes (bien que malheureusement on ne semble pas avoir reçu de réponse valide).