Una de las asignaciones en mi clase de algoritmos es diseñar un algoritmo de búsqueda exhaustivo para resolver el problema de camarilla. Es decir, dado un gráfico de tamaño n, se supone que el algoritmo determina si hay una sub-gráfica completa del tamaño k. Creo que he obtenido la respuesta, pero no puedo evitar pensar que se puede mejorar. Esto es lo que tengo:Diseño de algoritmo de problema de camarilla
Versión 1
entrada: Un gráfico representado por una matriz A [0, ... n -1], el tamaño k del subgrafo de encontrar.
salida: Verdadero si existe un subgrafo, False en caso contrario
Algoritmo (en pseudocódigo pitón-like):
def clique(A, k):
P = A x A x A //Cartesian product
for tuple in P:
if connected(tuple):
return true
return false
def connected(tuple):
unconnected = tuple
for vertex in tuple:
for test_vertex in unconnected:
if vertex is linked to test_vertex:
remove test_vertex from unconnected
if unconnected is empty:
return true
else:
return false
Version 2
entrada: una adyacencia matriz de tamaño n por n, y k el tamaño del subgrafo para encontrar
salida: Todos los subgrafos completos en A del tamaà ± o k.
Algoritmo (esta vez en pseudocódigo funcional/Python):
//Base case: return all vertices in a list since each
//one is a 1-clique
def clique(A, 1):
S = new list
for i in range(0 to n-1):
add i to S
return S
//Get a tuple representing all the cliques where
//k = k - 1, then find any cliques for k
def clique(A,k):
C = clique(A, k-1)
S = new list
for tuple in C:
for i in range(0 to n-1):
//make sure the ith vertex is linked to each
//vertex in tuple
for j in tuple:
if A[i,j] != 1:
break
//This means that vertex i makes a clique
if j is the last element:
newtuple = (i | tuple) //make a new tuple with i added
add newtuple to S
//Return the list of k-cliques
return S
¿Alguien tiene alguna idea, comentario o sugerencia? Esto incluye errores que podría haber pasado por alto, así como formas de hacerlo más legible (no estoy acostumbrado a usar mucho pseudocódigo).
Versión 3
Afortunadamente, hablé con mi profesor antes de enviar la tarea. Cuando le mostré el pseudo-código que había escrito, me sonrió y me dijo que hice manera demasiado trabajo. Por un lado, no tuve que enviar pseudo-código; Solo tenía que demostrar que entendí el problema. Y dos, él era queriendo la solución de fuerza bruta. Así que lo que ha entregado la veía algo como esto:
entrada: Un grafo G = (V, E), el tamaño de la camarilla de encontrar k
salida: Verdadero si una camarilla existe, falso en caso contrario
Algoritmo:
- Encuentre el producto cartesiano V k.
- Para cada tupla del resultado, compruebe si cada vértice está conectado entre sí. Si todos están conectados, devuelva verdadero y salga.
- Devuelve falso y sale.
ACTUALIZACIÓN: Se agregó la segunda versión. Creo que esto está mejorando, aunque no he agregado ninguna programación dinámica elegante (que yo sepa).
ACTUALIZACIÓN 2: Se agregaron más comentarios y documentación para hacer que la versión 2 sea más legible. Esta será probablemente la versión que entregue hoy. Gracias por la ayuda de todos! Desearía poder aceptar más de una respuesta, pero acepté la respuesta de la persona que me ayudó más. Les dejaré saber lo que piensa mi profesor.
Quiere decir * completo * subgrafo de tamaño k ¿verdad? Además, creo que k no se usa en tu pseudocódigo. –
Sí, tiene razón en ambos aspectos. :-) –
@Jason: Hay n vértices correctos, es decir, A [1, ..., n]? –