- Mauricio Mahmud Sánchez C412
- Raúl Beltrán Gómez C412
Kevin ha sido puesto al frente de la comisión de la facultad que elegirá las fechas de las pruebas de los k cursos que se dan en la facultad.
Cada curso tiene una cantidad de pruebas determinadas que quiere poner, y propone para esto, por ejemplo, los días { 17, 34, 65 y 87 } del curso escolar, si vemos a este como una sucesión de días en los que se imparten clases. Para mostrarse flexibles, los cursos a veces elaboran más de una propuesta incluso.
Por un problema de desorganización las propuestas se regaron y ahora no se sabe que curso propuso que propuesta, pero ya Kevin esta cansado de tanta gestión. Kevin quiere elegir k propuestas que ninguna quiera poner pruebas el mismo día que las otras, así supone que todo el mundo estará contento, ayude a Kevin.
El problema de Set Packing (Empaquetamiento de conjuntos) es un problema NP-Completo y se puede describir formalmente de la siguiente manera:
Dado un conjunto universal
Reduzcamos el problema set packing al nuestro.
- Se toma el conjunto universal
$U$ como el conjunto de días del curso, osea se remplaza cada elemento del conjunto$U$ por un día del curso donde no existen dos elementos de$U$ asignados al mismo día. - Cada uno de los subconjuntos se toman como una propuesta existente.
- Se toma
$k$ como las propuestas a elegir.
Esta reducción se puede hacer de manera lineal, ya que solo habría que sustituir por numeros los elementos.
Una vez resuelto el problema dado, se tiene (si existen), el conjunto de tamaño
Por lo anterior expuesto si el problema dado tiene una complejidad polinomial podríamos resolver el problema Set Packing en tiempo polinomial, lo cual conocemos que no es posible ya que este es NP-Completo. Luego el problema dado, si existe una solucion determinista a este, tiene que ser no polinomial.
Por cada uno de los subconjuntos dados se va a comprobar que la interseccion sea nula con un conjunto acumulado (inicialmente en el conjunto vacío), cada vez que se evalue si un subconjunto tiene intersección nula con el conjunto acumulado se va a unir a este formando parte de el de ser cierto, esto se va hacer recursivamente hasta que se llegue a que se han unido k subconjuntos al conjunto acumulado, de no lograrse llegar a los k subconjuntos unidos, el problema no tiene solución.
La complejidad de recorrer los n subconjuntos por cada entrada recursiva seria en total
La heurística que utilizamos en nuestra solución fue darle un orden de selección al backtrack, de tal forma que en caso de existir, en un gran número de casos, la solución del ejercicio sea encontrada más rápido. Para ello en cada iteración del backtrack se entra en orden de: ¿Cuál es la propuesta que menos cantidad de intersecciones posee?, y se entra recursivamente en esta. Esta selección de heurística está dada en gran medida por un proceso de simulación de casos random, donde se compara la respuesta de solo ir iterando por la propuesta de menor intersección en cada paso, con la solución del backtrack, obteniedo en estos casos más de un 99.9% de asertación. Esta heurística está basada en las heurísticas greedy utilizadas en técnicas de búsqueda local para la solución del problema NP-Completo “Maximal independent set”.
El problema “Maximal independent set” consiste en hallar el conjunto independiente máximo de un grafo. Nótese que en nuestro caso sería el equivalente a hallar el conjunto independiente de tamaño
Sea
- En caso que no exista un conjunto independiente de tamaño
$k$ , entonces el back-track se ejecutará hasta el final buscando una solución que no existe y pasara por todas las combinaciones posibles. - En caso que el grafo de divida en
$Kn$ por un lado(un subgrafo completo), cada uno de los vértices de$Kn$ esté conectado a un conjunto independiente de tamaño$a$ , llamémoslo$A$ , y por otro lado existan vértices conectados al conjunto$A$ , de tal forma que estos vértices tengan menor degree que los vértices de$A$ . Nótese que en$A$ cada vertice tendrá como degree$n+x$ , donde$x$ es la cantidad de nodos conectados a$A$ que no pertenecen a$Kn$ . Si usamos a los vértices conectados a$A$ en la solución entonces los vértices de$A$ no pueden existir a la misma. Luego la solución puede ser$A$ como conjunto independiente pero en las primeras iteraciones del back-track este no será priorizado. En casos como este y similares, el algoritmo también puede recorrer todas las iteraciones de su complejidad. En el siguiente ejemplo podemos ver un caso donde el conjunto solución sera lo último que se tendrá en cuenta:
En este caso los vértices de la izquierda están conectados a los $5$ vertices de $A$, los vértices de $A$ están conectados a todos los vértices de $K20$, $A$ tiene cardinalidad $5$, ademas los vértices de $A$ están conectados a todos los vértices de $K30$. Siguiendo la idea planteada cada vértice de $A$ tendría $degree = 52$, cada vértice de $K20$ tendría $degree = 24$, cada vértice de K30 tendría degree de $34$, cada vértice a la izquierda tendría $degree = 5$. Luego en el orden de prioridades, los vertices que pertenecen a $A$ serían los últimos en revisarse y el algoritmo se recorreria completo para un $k = 5$.