Me gustaría enumerar todos los gráficos no dirigidos de tamaño , pero solo necesito una instancia de cada clase de isomorfismo . En otras palabras, quiero enumerar todos los gráficos no isomorfos (no dirigidos) en vértices. ¿Cómo puedo hacer esto?
Más precisamente, quiero un algoritmo que genere una secuencia de gráficos no dirigidos , con la siguiente propiedad: por cada gráfico no dirigido en vértices, existe un índice tal que es isomorfo a . Me gustaría que el algoritmo sea lo más eficiente posible; en otras palabras, la métrica que me interesa es el tiempo de ejecución para generar e iterar a través de esta lista de gráficos. Un objetivo secundario es que sería bueno si el algoritmo no es demasiado complejo de implementar.
Tenga en cuenta que necesito tener al menos un gráfico de cada clase de isomorfismo, pero está bien si el algoritmo produce más de una instancia. En particular, está bien si la secuencia de salida incluye dos gráficos isomórficos, si esto ayuda a facilitar la búsqueda de dicho algoritmo o permite algoritmos más eficientes, siempre que cubra todos los gráficos posibles.
Mi aplicación es la siguiente: tengo un programa que quiero probar en todos los gráficos de tamaño . Sé que si dos gráficos son isomorfos, mi programa se comportará igual en ambos (será correcto en ambos o incorrecto en ambos), por lo que es suficiente enumerar al menos un representante de cada clase de isomorfismo, y luego probar el programa en esas entradas. En mi aplicación, es bastante pequeño.
Algunos algoritmos candidatos que he considerado:
Podría enumerar todas las matrices de adyacencia posibles, es decir, todas las matrices simétricas 0-o-1 que tienen todos los 0 en las diagonales. Sin embargo, esto requiere enumerar matrices. Muchas de esas matrices representarán gráficos isomórficos, por lo que parece que está desperdiciando mucho esfuerzo.
Podría enumerar todas las matrices de adyacencia posibles y, para cada una, probar si es isomorfo a cualquiera de los gráficos que he generado anteriormente; si no es isomorfo a nada de lo que se haya emitido anteriormente, imprímalo. Esto acortaría enormemente la lista de resultados, pero aún requiere al menos pasos de cálculo (incluso si suponemos que la verificación del isomorfismo del gráfico es súper rápida), por lo que no es mucho mejor según mi métrica.
Es posible enumerar un subconjunto de matrices de adyacencia. En particular, si es un gráfico en n vértices V = { v 1 , ... , v n } , sin pérdida de generalidad, puedo suponer que los vértices están dispuestos de modo que deg v 1 ≤ deg v 2 ≤ ⋯ ≤ deg v n. En otras palabras, cada gráfico es isomorfo a uno donde los vértices están dispuestos en orden de grado no decreciente. Por lo tanto, es suficiente enumerar solo las matrices de adyacencia que tienen esta propiedad. No sé exactamente cuántas matrices de adyacencia hay, pero son muchas menos de , y se pueden enumerar con mucho menos de 2 n ( n - 1 ) / 2 pasos de cálculo. Sin embargo, esto todavía deja mucha redundancia: muchas clases de isomorfismo se cubrirán muchas veces, por lo que dudo que esto sea óptimo.
¿Podemos hacerlo mejor? Si entiendo correctamente, ¡hay aproximadamente Clases de equivalencia de gráficos no isomórficos. ¿Podemos encontrar un algoritmo cuyo tiempo de ejecución sea mejor que los algoritmos anteriores? ¡Cuán cerca podemos llegar a ∼ 2 n ( n - 1 ) / 2 / n ! ¿límite inferior? Me preocupo principalmente por la capacidad de seguimiento para n pequeña (por ejemplo, n = 5 o n = 8más o menos; lo suficientemente pequeño como para que se pueda ejecutar un algoritmo de este tipo hasta su finalización), no tanto sobre los asintóticos para grande .
Relacionado: Construir matrices binarias no equivalentes (aunque desafortunadamente esa no parece haber recibido una respuesta válida).