Problema del conjunto de cobertura
# Problema del conjunto de cobertura

El problema del Set Covering, también conocido por sus siglas SCP es un problema clásico en combinatoria, ciencias de la computación y teoría de la complejidad computacional. Es un problema que ha llevado al desarrollo de técnicas fundamentales para el campo de los algoritmos de aproximación. También es uno de los problemas de la Lista de 21 problemas NP-completos de Karp cuya NP-completitud fue demostrada en 1972.
Dado un conjunto de elementos $\{1,2,...,m\}$ (llamado universo) y $n$ conjuntos cuya unión comprende el universo, el problema del conjunto de cobertura consiste en identificar el menor número de conjuntos cuya unión aun contiene todos los elementos del universo. Por ejemplo, sea $U=\{1,2,3,4,5\}$ y los conjuntos $S=\{\{1,2,3\},\{2,4\},\{3,4\},\{4,5\}\}$. Claramente, la unión de todos los conjuntos de $S$ contiene todos los elementos de $U$. Sin embargo, podemos cubrir todos los elementos con el siguiente conjunto de elementos, con menor número de elementos: $\{\{1,2,3\},\{4,5\}\}$.

# Problema del conjunto de cobertura
## Definición formal

Formalmente, se puede definir un problema de cobertura de conjuntos de la siguiente forma: Sea el universo ${\mathcal {U}}$ y la familia ${\mathcal {S}}$ de subconjuntos de ${\mathcal {U}}$, una cobertura es una subfamilia ${\mathcal {C}}\subseteq {\mathcal {S}}$ de conjuntos cuya unión es ${\mathcal {U}}$.

# Problema del conjunto de cobertura
## Definición formal
### Problema de decisión de cobertura de conjuntos

En el problema de decisión de cobertura de conjuntos, la entrada es un par $({\mathcal {U}},{\mathcal {S}})$ y un entero $k$ y la pregunta es si existe un conjunto de cobertura de tamaño $k$ o menos.
Esta versión es un problema NP-completo.

# Problema del conjunto de cobertura
## Definición formal
### Problema de optimización de cobertura de conjuntos

En el problema de optimización de cobertura de conjuntos, la entrada es un par $({\mathcal {U}},{\mathcal {S}})$ y la tarea es encontrar un conjunto de cobertura que use los menos conjuntos posibles.
Esta versión es un problema NP-hard.

# Problema del conjunto de cobertura
## Formulación con programación lineal entera

El problema de cobertura de conjuntos se puede formular como la siguiente programación lineal de enteros (ILP por su nombre en inglés).
| minimizar | $\sum _{S\in {\mathcal {S}}}c(S)\cdot x_{S}$ | | (minimizar el coste total) |
| cumpliendo | $\sum _{S\colon e\in S}x_{S}\geqslant 1$ | para todo $e\in {\mathcal {U}}$ | (cubriendo todos los elementos del universo) |
| | $x_{S}\in \{0,1\}$ | para todo $S\in {\mathcal {S}}$. | (todo conjunto, esté o no en conjunto de cobertura) |
Esta ILP pertenece a la clase más general de ILPs para problemas de cobertura. La diferencia de integralidad de esta ILP es, como máximo, $\scriptstyle \log n$, por lo tanto su relajación ofrece un algoritmo de aproximación de factor $\scriptstyle \log n$ para el problema de cobertura mínima de conjuntos (donde $\scriptstyle n$ es el tamaño del universo).

# Problema del conjunto de cobertura
## Algoritmo voraz

El algoritmo voraz para cobertura de conjuntos elige conjuntos de acuerdo a una regla: en cada paso, elegir el conjunto que tiene el mayor número de elementos no elegidos. Se puede demostrar que este algoritmo consigue un ratio de aproximación de $H(s)$, donde $s$ es el tamaño del conjunto a cubrir y $H(n)$ es el $n$-esimo número armónico:
    $H(n)=\sum _{k=1}^{n}{\frac {1}{k}}\leq \ln {n}+1$
Hay un ejemplo estándar donde el algoritmo voraz obtiene un ratio de aproximación de $\log _{2}(n)/2$. El universo consta de $n=2^{(k+1)}-2$ elementos. El sistema de conjuntos consiste en $k$ pares de conjuntos disjuntos $S_{1},\ldots ,S_{k}$ con tamaños $2,4,8,\ldots ,2^{k}$ respectivamente, así como dos conjuntos disjuntos adicionales $T_{0},T_{2}$, cada uno de los cuales contiene la mitad de los elementos de cada $S_{i}$. Con estas entradas, el algoritmo voraz coge los conjuntos $S_{k},\ldots ,S_{1}$, en ese orden, mientras que la solución óptima consistiría en escoger solamente $T_{0}$ y $T_{1}$.
Un ejemplo de estas entradas para $k=3$ se puede observar en la figura de la derecha.
Estos resultados tan poco cercanos a la solución óptima muestran que el algoritmo voraz es esencialmente el mejor algoritmo de aproximación en tiempo polinómico para el problema de cobertura de conjuntos, entre supuestos de complejidad plausible.

# Problema del conjunto de cobertura
## Sistemas de baja frecuencia

Si cada elemento se encuentra en $f$ conjuntos como máximo, se puede encontrar una solución en tiempo polinómico que se aproxime al óptimo con dentro de un factor f usando relajación de programación lineal.

# Problema del conjunto de cobertura
## Resultados poco óptimos

Lund y Yannakakis (1994) demostraron que el problema de cobertura de conjuntos no puede aproximarse en tiempo polinómico dentro de un factor de ${\tfrac {1}{2}}\log _{2}{n}\approx 0.72\ln {n}$, a menos que NP tenga algoritmos de tiempo cuasi-polinómico. Feige (1998) mejoró este límite a ${\bigl1-o(1){\bigr )}\cdot \ln {n}$ bajo las mismas condiciones, que prácticamente coincide con el ratio de aproximación del algoritmo voraz.Raz y Safra (1997) estableció la frontera inferior de $c\cdot \ln {n}$, donde $c$ es una constante, asumiendo que P$\not =$NP. Un resultado similar, pero con mayor valor de $c$ fue recientemente probado por Alon, Moshkovitz y Safra (2006).

# Problema del conjunto de cobertura
## Ejemplo

Una estación de bomberos tiene la capacidad de cubrir las emergencias tanto de su comuna como de las comunas adyacentes a ella, por ejemplo una estación construida en la comuna 1 (Figura 1) podrá cubrir las emergencias de todo su vecindario, es decir, de la comuna 1, comuna 2, comuna 3 y comuna 5. Se necesitan construir tantas estaciones de bomberos como sea necesario para cubrir todas las comunas ante posibles emergencias, cuidando que todas las comunas estén cubiertas por al menos una estación (una o más), minimizando el número de estaciones construidas.

# Problema del conjunto de cobertura
## Ejemplo
### Modelo matemático

Sea:
$x_{i}={\begin{cases}1&{\mbox{se construye estación en la comuna i}}\\0&{\mbox{en otro caso}}\end{cases}}$
podemos formular el problema de la siguiente forma:
$Min\sum _{i=1}^{12}x_{i}$
cumpliendo las siguientes restricciones:
$x_{1}+x_{2}+x_{3}+x_{5}\geq 1$
$x_{2}+x_{1}+x_{5}\geq 1$
$x_{3}+x_{1}+x_{4}+x_{5}+x_{6}+x_{7}+x_{8}\geq 1$
$x_{4}+x_{3}+x_{5}+x_{6}+x_{11}\geq 1$
$x_{5}+x_{1}+x_{2}+x_{3}+x_{4}+x_{10}+x_{11}\geq 1$
$x_{6}+x_{3}+x_{4}+x_{8}+x_{11}\geq 1$
$x_{7}+x_{3}+x_{8}+x_{12}\geq 1$
$x_{8}+x_{3}+x_{6}+x_{7}+x_{9}+x_{11}+x_{12}\geq 1$
$x_{9}+x_{8}+x_{10}+x_{11}+x_{12}\geq 1$
$x_{10}+x_{5}+x_{9}+x_{11}\geq 1$
$x_{11}+x_{4}+x_{5}+x_{6}+x_{8}+x_{9}+x_{10}\geq 1$
$x_{12}+x_{7}+x_{8}+x_{9}\geq 1$

# Problema del conjunto de cobertura
## Ejemplo
### Solución

Una solución para este problema sería construir estaciones en las comunas 5 y 8. Con un total de 2 estaciones construidas se lograría cubrir las necesidades de todas las comunas del problema.