Articulo de referencia

Reducción (complejidad)

Ejemplo de una reducción del problema de satisfacibilidad booleana ( A ∨ B ) ∧ (¬ A ∨ ¬ B ∨ ¬ C ) ∧ (¬ A ∨ B ∨ C ) a un problema de cobertura de vértices . Los vértices azules f...

Ejemplo de una reducción del problema de satisfacibilidad booleana ( AB ) ∧ (¬ A ∨ ¬ B ∨ ¬ C ) ∧ (¬ ABC ) a un problema de cobertura de vértices . Los vértices azules forman una cobertura de vértices mínima, y ​​los vértices azules en el óvalo gris corresponden a una asignación de verdad satisfactoria para la fórmula original.

En la teoría de la computabilidad y la teoría de la complejidad computacional , una reducción es un algoritmo para transformar un problema en otro. Una reducción suficientemente eficiente de un problema a otro puede utilizarse para demostrar que el segundo problema es al menos tan difícil como el primero.

Intuitivamente, el problema A es reducible al problema B si un algoritmo para resolver el problema B de manera eficiente (si existe) también puede usarse como subrutina para resolver el problema A de manera eficiente. Cuando esto es cierto, resolver A no puede ser más difícil que resolver B. "Más difícil" significa tener una estimación más alta de los recursos computacionales requeridos en un contexto dado (por ejemplo, mayor complejidad temporal , mayor requerimiento de memoria, necesidad de núcleos de procesador adicionales para una solución paralela en comparación con una solución de un solo hilo, etc.). La existencia de una reducción de A a B puede escribirse en la notación abreviada Am B , generalmente con un subíndice en ≤ para indicar el tipo de reducción que se está utilizando (m  : reducción de muchos a uno , p  : reducción polinómica ).

La estructura matemática generada en un conjunto de problemas por reducciones de un tipo particular generalmente forma un preorden , cuyas clases de equivalencia pueden usarse para definir grados de insolubilidad y clases de complejidad .

Introducción

Hay dos situaciones principales en las que necesitamos usar reducciones:

  • En primer lugar, nos encontramos intentando resolver un problema similar a uno que ya hemos resuelto. En estos casos, una forma rápida de resolver el nuevo problema suele ser transformar cada instancia del nuevo problema en instancias del problema anterior, resolverlas utilizando nuestra solución existente y, finalmente, usarlas para obtener la solución final. Este es quizás el uso más evidente de las reducciones.
  • Segundo: supongamos que tenemos un problema que hemos demostrado que es difícil de resolver, y tenemos un nuevo problema similar. Podríamos sospechar que también es difícil de resolver. Argumentamos por contradicción : supongamos que el nuevo problema es fácil de resolver. Entonces, si podemos demostrar que cada instancia del problema anterior se puede resolver fácilmente transformándola en instancias del nuevo problema y resolviendo estas últimas, tenemos una contradicción. Esto demuestra que el nuevo problema también es difícil.

Un ejemplo muy sencillo de reducción es la que se da entre la multiplicación y la elevación al cuadrado . Supongamos que lo único que sabemos hacer es sumar, restar, elevar al cuadrado y dividir por dos. Podemos usar este conocimiento, combinado con la siguiente fórmula, para obtener el producto de dos números cualesquiera:

a×b=((a+b)2a2b2)2{\displaystyle a\times b={\frac {\left(\left(a+b\right)^{2}-a^{2}-b^{2}\right)}{2}}}

También tenemos una reducción en la dirección opuesta; obviamente, si podemos multiplicar dos números, podemos elevar un número al cuadrado. Esto parece implicar que estos dos problemas son igualmente difíciles. Este tipo de reducción corresponde a la reducción de Turing .

Sin embargo, la reducción se vuelve mucho más difícil si agregamos la restricción de que solo podemos usar la función de elevar al cuadrado una vez, y solo al final. En este caso, incluso si se nos permite usar todas las operaciones aritméticas básicas, incluida la multiplicación, no existe reducción en general, porque para obtener el resultado deseado como un cuadrado primero tenemos que calcular su raíz cuadrada , y esta raíz cuadrada podría ser un número irracional como2{\displaystyle {\sqrt {2}}}que no se puede construir mediante operaciones aritméticas sobre números racionales. Sin embargo, en la dirección opuesta, ciertamente podemos elevar al cuadrado un número con una sola multiplicación, solo al final. Usando esta forma limitada de reducción, hemos demostrado el resultado no sorprendente de que la multiplicación es, en general, más difícil que elevar al cuadrado. Esto corresponde a la reducción de muchos a uno .

Propiedades

La reducibilidad es un preordenamiento , es decir, una relación reflexiva y transitiva , en P ( N ) × P ( N ), donde P ( N ) es el conjunto potencia de los números naturales .

Tipos y aplicaciones de reducciones

Como se describe en el ejemplo anterior, en la teoría de la complejidad computacional se utilizan dos tipos principales de reducciones: la reducción muchos a uno y la reducción de Turing . Las reducciones muchos a uno asignan instancias de un problema a instancias de otro; las reducciones de Turing calculan la solución de un problema, asumiendo que el otro es fácil de resolver. La reducción muchos a uno es un tipo más robusto de reducción de Turing y resulta más eficaz para clasificar problemas en distintas clases de complejidad. Sin embargo, las mayores restricciones que imponen las reducciones muchos a uno dificultan su búsqueda.

Un problema se considera completo para una clase de complejidad si todos los problemas de la clase se reducen a ese problema y, además, pertenece a la propia clase. En este sentido, el problema representa la clase, ya que cualquier solución al mismo, en combinación con las reducciones, puede utilizarse para resolver todos los problemas de la clase.

Sin embargo, para que sean útiles, las reducciones deben ser fáciles . Por ejemplo, es perfectamente posible reducir un problema NP-completo difícil de resolver, como el problema de satisfacibilidad booleana , a un problema trivial, como determinar si un número es igual a cero, haciendo que la máquina de reducción lo resuelva en tiempo exponencial y genere cero solo si existe una solución. Sin embargo, esto no resulta muy útil, ya que, aunque podamos resolver el nuevo problema, realizar la reducción es igual de difícil que resolver el problema original. Del mismo modo, una reducción que calcula una función no computable puede reducir un problema indecidible a uno decidible. Como señala Michael Sipser en Introducción a la Teoría de la Computación : «La reducción debe ser fácil, en relación con la complejidad de los problemas típicos de la clase [...] Si la reducción en sí misma fuera difícil de calcular, una solución fácil al problema completo no necesariamente produciría una solución fácil a los problemas que la reducen».

Por lo tanto, la noción apropiada de reducción depende de la clase de complejidad que se esté estudiando. Al estudiar la clase de complejidad NP y muchas clases más difíciles, como la jerarquía polinómica , se utilizan reducciones en tiempo polinomial . Al estudiar clases dentro de P, como NC y NL , se utilizan reducciones en espacio logarítmico . Las reducciones también se utilizan en la teoría de la computabilidad para determinar si los problemas son o no resolubles por máquinas; en este caso, las reducciones se limitan a funciones computables (para reducciones de muchos a uno) o a máquinas oráculo (para reducciones de Turing).

En el caso de problemas de optimización (maximización o minimización), solemos pensar en términos de reducciones que preservan la aproximación . Supongamos que tenemos dos problemas de optimización tales que las instancias de un problema se pueden mapear a instancias del otro, de manera que las soluciones casi óptimas para las instancias del segundo problema se pueden transformar de nuevo para producir soluciones casi óptimas para el primero. De esta forma, si tenemos un algoritmo de optimización (o algoritmo de aproximación ) que encuentra soluciones casi óptimas (u óptimas) para instancias del problema B , y una reducción eficiente que preserva la aproximación del problema A al problema B , por composición obtenemos un algoritmo de optimización que produce soluciones casi óptimas para instancias del problema A. Las reducciones que preservan la aproximación se utilizan a menudo para demostrar la dificultad de los resultados de aproximación: si algún problema de optimización A es difícil de aproximar (bajo alguna suposición de complejidad) dentro de un factor mejor que α para algún α , y hay una reducción que preserva la aproximación β del problema A al problema B , podemos concluir que el problema B es difícil de aproximar dentro del factor α / β .

Ejemplos

Ejemplo detallado

El siguiente ejemplo muestra cómo usar la reducción del problema de la parada para demostrar que un lenguaje es indecidible. Supongamos que H ( M , w ) es el problema de determinar si una máquina de Turing M dada se detiene (aceptando o rechazando) con la cadena de entrada w . Se sabe que este lenguaje es indecidible. Supongamos que E ( M ) es el problema de determinar si el lenguaje que acepta una máquina de Turing M dada es vacío (es decir, si M acepta alguna cadena). Demostramos que E es indecidible mediante una reducción de H.

Para obtener una contradicción, supongamos que R es un decisor para E. Usaremos esto para producir un decisor S para H (que sabemos que no existe). Dada la entrada M y w (una máquina de Turing y alguna cadena de entrada), definimos S ( M , w ) con el siguiente comportamiento: S crea una máquina de Turing N que acepta solo si la cadena de entrada a N es w y M se detiene con la entrada w , y no se detiene en caso contrario. El decisor S ahora puede evaluar R ( N ) para comprobar si el lenguaje aceptado por N es vacío. Si R acepta N , entonces el lenguaje aceptado por N es vacío, por lo que en particular M no se detiene con la entrada w , por lo que S puede rechazar. Si R rechaza N , entonces el lenguaje aceptado por N no es vacío, por lo que M sí se detiene con la entrada w , por lo que S puede aceptar. Por lo tanto, si tuviéramos un decisor R para E , podríamos producir un decisor S para el problema de parada H ( M , w ) para cualquier máquina M y entrada w . Puesto que sabemos que tal S no puede existir, se deduce que el lenguaje E también es indecidible.

Véase también

Referencias