Atlasingeniería

Diseño de algoritmosComplejidad computacionalTema 2

Reducciones entre problemas

Traducir un problema a otro es la herramienta con la que se demuestra dificultad y, dada vuelta, la que permite resolver algo nuevo con un algoritmo que ya existe.

Para este tema conviene tener claro:P, NP y qué significa NP-completo

Una reducción es traducir: convertir las instancias de un problema en instancias de otro, de modo que la respuesta se conserve. Suena burocrático y es la técnica con la que se demuestra que algo es NP-completo y, al mismo tiempo, la forma más rentable de resolver un problema nuevo.

Qué es reducir, exactamente

Reducir AA a BB es dar una transformación en tiempo polinomial que lleva cada instancia de AA a una de BB con la misma respuesta. Se escribe ApBA \le_p B y se lee: AA no es más difícil que BB.

La dirección es la parte que más se confunde. Si ApBA \le_p B y BB es fácil, entonces AA es fácil. Contrapuesto: si AA es difícil, entonces BB es difícil. La flecha va del problema conocido al problema del que se quiere hablar.

Tenemos SAT, que se sabe NP-completo, y un problema X del que queremos hablar.

1 / 6
Las dos flechas se pueden dibujar y prueban cosas opuestas. La que sirve para decir «X es difícil» va del problema conocido hacia X: si resolver X resolviera también algo que nadie sabe resolver rápido, X no puede ser fácil. Al revés no prueba nada, y es el error que más aparece en un parcial.

Antes de seguir, predecí

Reducís A a B y sabés que A es indecidible. ¿Qué concluís sobre B?

Los dos pasos de una prueba de NP-completitud

Para probar que un problema XX es NP-completo hacen falta dos pasos. Primero, verificar que XX está en NP: describir el certificado y cómo se chequea en tiempo polinomial. Ese paso se olvida seguido y sin él la demostración no cierra.

Segundo, elegir un problema NP-completo conocido y reducirlo a XX. No al revés: reducir XX a SAT no prueba nada sobre la dificultad de XX, sólo que no es peor que SAT.

De 3-SAT a conjunto independiente

Un ejemplo concreto: de 3-SAT a conjunto independiente. Por cada cláusula de tres literales se arma un triángulo de tres vértices, y se conectan entre sí todos los pares de vértices que representan un literal y su negación.

Existe un conjunto independiente de tamaño igual a la cantidad de cláusulas si y sólo si la fórmula es satisfacible: elegir un vértice por triángulo equivale a elegir qué literal hacer verdadero en cada cláusula, y las aristas entre opuestos impiden asignaciones contradictorias. La construcción es polinomial y la equivalencia se prueba en las dos direcciones.

Las tres obligaciones de toda reducción

Toda reducción tiene tres obligaciones. Que la transformación sea polinomial; que una respuesta afirmativa del original dé una afirmativa del traducido; y la vuelta, que una afirmativa del traducido implique una del original.

La tercera es donde fallan las demostraciones apuradas. Es fácil traducir hacia adelante y no darse cuenta de que el problema traducido admite soluciones que no corresponden a ninguna solución del original.

Dada vuelta, es una herramienta de ingeniería

Dada vuelta, la reducción es una herramienta de ingeniería. En vez de escribir un algoritmo para un problema nuevo, se lo traduce a uno con resolvedores maduros: SAT, programación lineal entera, flujo máximo.

Programar horarios, asignar turnos o verificar configuraciones se modelan como SAT y se resuelven con herramientas que llevan décadas de optimización. Escribir la traducción suele ser más rápido y más confiable que escribir el algoritmo propio, aunque el modelo tape parte de la estructura del problema.

El mismo mecanismo en computabilidad

La idea excede a NP. En computabilidad se usa el mismo mecanismo para probar que un problema es indecidible: reduciendo el problema de la parada a él. Si se pudiera resolver, se resolvería la parada, que ya se sabe imposible.

Cambia la clase de recursos y el problema base; la forma del argumento es idéntica.

La reducción como herramienta de todos los días

Tu problemaSe reduce aQué ganás
Asignar personas a turnosflujo de costo mínimosolución exacta en tiempo polinomial
Ordenar tareas con dependenciasorden topológicoun algoritmo lineal y detección de ciclos
Elegir versiones de paquetes compatiblesSATun resolvedor que ya existe y es muy bueno
Agrupar registros que comparten camposcomponentes conexasunion-find, casi lineal
Armar horarios sin superposicióncoloreo de grafossaber que es NP-difícil y elegir heurística
La tercera fila es la más práctica de todas: expresar el problema en un formato estándar y dejar que un resolvedor maduro lo resuelva suele ser mejor que escribir un algoritmo propio.

La reducción se enseña como herramienta teórica —para probar que algo es difícil— y en el trabajo se usa al revés, para resolver: si tu problema se puede expresar como uno conocido, heredás todos sus algoritmos, sus bibliotecas y sus décadas de optimización.

Más a fondo · formalKarp, Cook, y por qué importa la diferencia

Hay dos nociones de reducción y conviene no mezclarlas.

Una reducción de Karp, o de muchos a uno, transforma una instancia de AA en una de BB y devuelve la respuesta tal cual. Es la que se usa para definir NP-completitud, y es más restrictiva: sólo se puede llamar una vez al resolvedor de BB y no se puede negar la respuesta.

Una reducción de Cook, o de Turing, permite usar el resolvedor de BB como subrutina las veces que haga falta y combinar los resultados. Es más flexible y es la que se usa en la práctica: casi todas las reducciones útiles en el trabajo son de Cook.

La diferencia importa en un punto fino: con reducciones de Cook, NP y co-NP se vuelven indistinguibles, y por eso la teoría usa las de Karp para poder hablar de esa distinción. Para resolver problemas, la de Cook es la que sirve; para clasificar, la de Karp.

Cierre

Una reducción traduce instancias conservando la respuesta. Para demostrar dificultad se reduce lo conocido-difícil al problema nuevo, nunca al revés, y se prueban las dos direcciones. Para resolver, se reduce lo nuevo a un problema con buenos resolvedores.

Autoevaluación

¿Lo entendiste?

A ≤p B y B es fácil. ¿Qué se concluye?
Para probar que X es NP-completo, ¿qué reducción hay que hacer?
¿Qué paso se olvida seguido en una demostración de NP-completitud?
En la reducción de 3-SAT a conjunto independiente, ¿qué representan las aristas entre un literal y su negación?