17
Completitud NP Teoría de la complejidad Computacional y Clases de Problemas computables 2014 Anaitis Garcia 13-1009 Mortimer Echavarria 13-1001 2/24/2014

Teoría de la Complejidad Computacional y Completitud NP

Embed Size (px)

DESCRIPTION

Artículo acerca de la teoria de complejidad y las clases de problemas decidibles: P, NP, centrandose en NP-Completo.

Citation preview

Completitud NP Teoría de la complejidad Computacional y Clases de Problemas computables

2014

Anaitis Garcia 13-1009 Mortimer Echavarria 13-1001

2/24/2014

Universidad Iberoamericana

Mortimer Echavarría Mariñez 13-1001

Anaitis Cabrera García 13-1009

Lenguajes Formales y Estructura de Autómatas.

Profesor: Doc. Ing. Rina Familia

Articulo Científico: Completitud NP

24/02/2014

Santo Domingo, R.D

Resumen Ejecutivo

La teoría de la complejidad computacional estudia cuales recursos son

requeridos para resolver un problema como son el tiempo y el espacio. Por otro y lado

la teoría de la computabilidad se interesa en expresar los problemas como procesos

algorítmicos sin tener en cuenta cuales recursos son necesarios para resolver el

problema dado.

Los problemas de decisión pueden ser clasificados en conjuntos de complejidad

comparable los cuales son llamados clases de complejidad. Entre estas podemos

mencionar: L, NL, P, P-Completo, NP, NP-Completo, NP-Duro.

La clase de complejidad P es el conjunto de problemas de decisión que pueden

ser resueltos en una maquina determinista en tiempo polinomio lo cual responde por

instinto a problemas que puedan ser resueltos en el peor de sus casos.

Un algoritmo de tiempo polinomial tiene una complejidad tal que para el tamaño

de la entrada del problema existe un polinomio capaz de resolverlo. Esto quiere decir

que si por ejemplo, a un viajero le toma 10 minutos hacer un viaje de una ciudad a otra

en un recorrido de 10 ciudades, para 20 ciudades le tomara 20 minutos, para 30

ciudades 30 minutos, etc.

La clase de complejidad NP es el conjunto de los problemas de decisión que

pueden ser resueltos por una maquina no determinista en tiempo polinomio. En esta

clase se encuentran muchos problemas que se desean resolver en la práctica lo cual

incluye el problema de factibilidad booleana y el problema del viajante, el camino

hamiltoniano para recorrer todos los vértices una sola vez. La pregunta P=NP, la cual

busca responder si P y NP son iguales motivan la introducción de conceptos de “duro”

y “Completo” , así como también el concepto de intratabilidad que define los problemas

que pueden ser resueltos en teoría pero no en la práctica.

Introducción

En nuestra vida cotidiana cuando se observa un problema buscamos una

solución a través de un método. Este método normalmente se documenta para posibles

problemas futuros que puedan aparecer y/o evolucionar. En informática tenemos dos

componentes esenciales para la resolución de un problema: Primero está el algoritmo,

la base, el conjunto de métodos y/o pasos para resolver el problema y en segundo

lugar está el programa, el elemento codificado que se encuentra en el computador en el

cual esta expresado el algoritmo. Dichos componentes son muy importantes, pero se

debe destacar la importancia del algoritmo, pues este es lo que mueve el programa.

De forma práctica, estos programas que ejecutamos consumen recursos físicos,

esencialmente tiempo y espacio, por ello debemos tomar en cuenta la eficiencia del

algoritmo empleado, cual es el mejor camino hacia la solución? Es efectivo? Ocupa

mucho espacio? Más adelante se responderán preguntas acerca de este tema, que

más bien se refiere a una rama de la computación: La teoría de la complejidad

computacional.

Un problema de complejidad computacional tiene un tamaño X por la cantidad

de datos, esta incógnita puede tener un nivel de complejidad para resolverse

dependiendo la cantidad de datos que se tengan a mano. Pero, cabe destacar que no

todos los problemas tienen una solución posible o no todos tienen una solución óptima,

para entender esto, se estudiaran los conceptos de teoría de complejidad y sus clases,

tales como P, NP, etc.

Teoría de la Computación (Computabilidad)

La ciencia de la computación es el cuerpo sistematizado del conocimiento

relativo al cálculo. Sus principios base se remontan al diseño de algoritmos realizados

por Euclides, al uso de la complejidad asintótica, y a la deducibilidad por parte de los

antiguos babilonios.

La ciencia de la computación descansa sobre dos pilares fundamentales: Los

criterios fundamentales subyacentes al cálculo que dieron como resultado la existencia

de funciones probablemente no calculables o computables, en segundo lugar están, las

técnicas de ingeniería para la creación de sistemas de computación basados en

técnicas de diseño de algoritmos.

Brookshear (1993) dice que:

“un proceso computacional también llamado proceso algorítmico o algoritmo, es vital para la ciencia de la computación, puesto que un programa o computador no puede ejecutar un problema que no tenga una solución algorítmica. Así, cualquier limitación de las capacidades de los procesos computacionales constituye también una limitación de las capacidades la computadora.”

Según Grimaldi (1997):

“evaluar cuán eficiente es un algoritmo, tiene mucho que evaluar la complejidad intrínseca del mismo. En 1935, el matemático y lógico inglés Alan Mathison Turing (1912- 1954 ) se interesó en el problema de decisión de Hilbert, el cual preguntaba si podía existir un método general aplicable a cualquier enunciado, para poder determinar si este es verdadero. El enfoque de Turing lo llevó a plantear lo que hoy en día se conoce como la máquina de Turing.”

El tema de computabilidad tiene mucho que ver con la búsqueda de estructuras

que son necesarias en un lenguaje de programación, de tal forma que se asegure que

un lenguaje escrito en un lenguaje de programación X, pueda resolver cualquier

problema que tenga solución algorítmica.

Teoría de complejidad computacional

Es la rama de la ciencias de la computación ( Teoría de la computación) la cual

estudia de manera teórica, la complejidad inherente a la resolución de un problema

computable, así como, la optimización de recursos requeridos durante la ejecución de

un algoritmo para resolver un problema.

Dicho de manera simple, estudia los recursos que necesita utilizar un

computador para el cálculo de la solución de un problema.

Un cálculo resulta complejo si es difícil de realizar, en base a esto podemos

definir la complejidad de un problema X como la cantidad de recursos que se necesitan

para resolver dicho problema. Así, un cálculo difícil requerirá más recursos que una de

menor de dificultad menor.

Comúnmente, el análisis se basa en dos aspectos:

1) Tiempo: Se utiliza una aproximación al número y al tipo de pasos que ejecuta un

algoritmo X para resolver un problema computable.

2) Memoria: Un estimado de la cantidad de memoria utilizada para resolver un

problema computable.

Estos no son los únicos aspectos que pueden ser tomados en cuenta, se

pueden analizar de igual forma otros parámetros, como por ejemplo la cantidad de

procesadores necesarios para resolver el problema de forma eficiente (Procesamiento

en paralelo).

Un algoritmo que resuelve un problema pero que tarda mucho en hacerlo,

difícilmente será de mucha utilidad. Igualmente un algoritmo que necesite un gigabyte

de memoria para ser ejecutado, probablemente no será utilizado, a pesar de que

resuelve el problema.

Es importante resaltar que la teoría de la complejidad computacional, difiere de

la teoría de la computación en que esta nos proporciona información acerca de los

límites de la resolución algorítmica de los problema, introduciendo el concepto de

“computar” para mostrar que problemas son decidibles con distintos tipos de maquinas,

y diferentes modelos computacionales formales, mientras que la primera nos

proporciona estrategias de la medida de complejidad de cada proceso algorítmico

necesario para resolver un problema computable.

La teoría de la complejidad computacional responde a la siguiente pregunta:

Que hace a algunos problemas computacionalmente difíciles (o extremadamente

difíciles) y a otros problemas sencillos?

De tal suerte que esta teoría tiene como finalidad proporcionar mecanismos y

herramientas capaces de describir y analizar la complejidad innata de un algoritmo y la

complejidad intrínseca de un problema computable.

La complejidad intrínseca de un algoritmo, puede ser expresada como una

función del tamaño de la entrada del problema N.

Esto muestra la razón de crecimiento de los recursos con respecto a N:

● Razón del tiempo de ejecución temporal (Temporal) : T (n)

● Razón del espacio de almacenamiento requerido (Espacial) : S (n).

Si un cálculo requiere más tiempo que otro decimos que es más complejo y lo

llamamos complejidad temporal. Si un cálculo, por otro lado, requiere más espacio de

almacenamiento que otro problema, entonces decimos que es más complejo, pero esta

vez hablamos de complejidad espacial.

Es muy obvio, que el tiempo que se requiere para efectuar un cálculo en un

computador moderno es menor que el que se necesitaba para hacer el mismo en un

computador de años atrás, y es seguro que el tiempo para realizarlo en una máquina

de las próximas generaciones será menor.

Clases de problemas

El estudio de los problemas computacionales conduce a la clasificación de los

problemas en dos grandes clases: los problemas con solución y los problemas sin

solución. Los problemas solucionables, requieren una cantidad considerable de

recursos como memoria y espacio de almacenamiento. El análisis requerido para

estimar cual es el uso de recursos de un algoritmo es una cuestión teórica y necesita

un marco formal.

Los problemas cuya solución es una solución con orden de complejidad lineal

son problemas que son resueltos en un tiempo que está relacionado linealmente con su

tamaño. Hoy día, la gran mayoría de algoritmos que son resueltos por las maquinas

tienen como máximo o límite una complejidad o costo computacional polinómico, lo

cual expresa que la relación entre el tiempo de ejecución y el tamaño del problema es

polinómica. Estos son los problemas agrupados en la clase P (Polynomial-Time).

Se considera que un problema es P cuando este se puede resolver en tiempo

“polinomial” o sea cuando existe un algoritmo con una fórmula de base polinómica que

lo pueda resolver.

La clase P clasifica los problemas de decisión que una MT Determinista puede

resolver en un tiempo polinómico.

• Los problemas de complejidad polinómica son tratables, es decir en la practica se

pueden resolverse en tiempo razonable.

• La mayoría de los problemas corrientes (ordenación, búsqueda...) pertenecen a esta

clase.

Problemas para los cuales se ha encontrado algoritmos polinomiales.

Ordenamiento, búsqueda, caminos más cortos, componentes fuertes.

Circuito Euleriano

Multiplicación de Matrices.

Los problemas cuya relación entre el tiempo de ejecución y el tamaño del problema

no es polinomial, cuyo costo computacional no es polinomial están agrupados en la

clase NP (Non-Deterministic Polynomial-time). Esta clase contiene aquellos

problemas de decisión que una MT No Determinista puede resolver en Tiempo

polinómico. NP es la clase de todos los problemas decidibles en tiempo polinómico

indeterminista.

Estos problemas no tienen solución algorítmica, lo que quiere decir, que una

máquina no los puede resolver en un tiempo razonable.

Existe una escala para medir la complejidad, la que incluye entre otros:

P = Resoluble en tiempo polinómico.

P-Completo = Los mas difíciles de resolver en P.

NP = Problemas con respuestas positivas verificables en tiempo polinómico.

NP-Completo = Los problemas mas difíciles de resolver en NP.

Muchas de estas clases, tienen una co-clase, la cual contiene los problemas

complementarios a los de la clase original. Por ejemplo si X esta en NP, el

complemento de X esta en co-NP. Sin embargo es importante señalar que no debe

entenderse que NP y co-NP sean complementarios, ya que existen problemas que

pertenecen a ambas clases y otros que no están en ninguna de las dos clases.

Los problemas computacionales desde el punto de vista de la decisión se divide

en dos criterios.

Según la teoría de la computabilidad estos pueden ser:

-Decidible

-Parcialmente decidible

-No decidible

Según la teoría de la complejidad:

-L

-NL

-P

-P-Completo

-NP

-NP-Completo

-NP-Duro

Es necesario comprender el modelo teórico de las maquinas de Turing, para poder

obtener una clara comprensión de la clasificación de los problemas computacionales de

acuerdo a la teoría de la complejidad.

MT Determinista (Para cada par (estado, símbolo), existe como máximo una

transición a otro estado).

MT No Determinista (Existe al menos un par (estado, símbolo), con más de una

transición a estados diferentes).

En este artículo nos enfocaremos principalmente en los problemas NP-Completos.

Los problemas NP parecen intratables, un problema se dice si no se ha podido

descubrir un algoritmo de tiempo polinomial capaz de resolver el problema. Los

problemas que pueden ser resueltos en teoría pero no en la práctica, ser llaman

intratables.

Sin embargo nadie ha sabido demostrar que los NP son intratables.

Los problemas NP-Completos son todos equivalentes; lo cual quiere decir que si

se encuentra un algoritmo eficiente capaz de resolver un NP-Completo entonces

tendremos un algoritmo capaz de resolverlos eficientemente a todos.

Ahora bien si probamos que para “ NP- completo X ” no existe ningún algoritmo

eficiente entonces ningún problema de la clase NP lo tendrá, por eso decimos que los

problemas NP-Completos son equivalentes.

Podemos decir que los problemas NP, para

ser NP deben ser reducibles, es decir todos los

problemas NP pueden ser reducidos a un solo

problema NP en tiempo polinómico.

(Reducir es una manera de convertir un

problema en otro de tal manera que la solución al

segundo problema puede ser utilizada para

resolver el primer problema)

La pregunta P = NP

El saber si las clases P y NP son iguales es uno de los más importantes

problemas abiertos en las ciencias de la Computación Teórica.

Esta pregunta motivo la introducción de conceptos como difícil (Hard ) y

Completo.

Un conjunto dado de problemas X es hard con respecto a un conjunto de

problemas Y (‘Y’ pertenecientes a NP) Si X >Y o X = , es decir Y puede ser escrito

como un conjunto de soluciones de los problemas X. Simplemente, Y es más “sencillo

que X”. Aquí, el término sencillo es definido en cada caso particular. El conjunto hard

más importante es NP-hard. El conjunto X es completo para Y si es hard para y es

también un subconjunto de Y. El conjunto completo más importante es NP-Completo.

Ejemplos de Problemas NP Completos

A. El problema del viajante del comercio

B. El problema de hacer cierto un circuito booleano (Circuito SAT)

C. Asignación de procesadores (multiprocessor scheduling )

El problema del viajante

El problema del viajante es un problema clásico de los problemas NP-Completos

desde el punto de vista de la decisión y es NP-Duro desde el punto de vista de la

optimización, también llamado TSP por sus siglas en ingles “Travelling Salesman

Problem”.

Un viajero tiene una lista de ciudades, cada punto de ciudad a ciudad tiene su

propia distancia, ¿Cuál es el camino más corto para visitar cada ciudad una sola vez y

volver a la ciudad de inicio?

Como NP-Completo se ve de esta forma:

Se tiene un grafo con una distancia L, se debe concluir cuál es el grafo con

menos distancia hacia L.

Dados:

n el número de ciudades,

la matriz de distancias d(i, j) para 1<=i, j < = n, una longitud máxima k

¿Existe un camino que pasa por todas las ciudades con longitud como máximo k?

Circuito SAT

Dado: un circuito booleano con una única puerta de salida.

¿Existe una asignación de valores a las entradas para que la salida es “1”?

Asignación de procesadores (multiprocessor scheduling)

Dadas: N el número de tareas,

M número de procesadores

Dur (i) la duración de la tarea I (i<=n)

T tiempo máximo (deadline)

¿Existe una asignación de las tareas a los procesadores sin solapes y cumpliendo el

deadline?

Problema del clique

Este problema NP-Completo consiste en buscar sub-grafos completos dentro de

un grafo dado. Un subgrafo completo es aquel que tiene un conjunto de vertices

adyacentes de dos en dos.

En la imagen anterior podemos ver un ejemplo de clique. Los vértices 3, 4, 5 hacen un

clique ya que 4 y 3 forman un camino adyacente. Pero 1, 5, 6 no hacen clique porque 5

y 6 no son adyacentes.

El problema viene cuando tenemos una gran cantidad de vértices, para poder

determinar por decisión una ruta especificada de cliques.

Pongamos un ejemplo de la vida real, tenemos una red de computadoras a través de

internet, inmensa, de millones de ordenadores, necesitamos determinar la subred más

grande entre esta red, con subred nos referimos a una red con computadores que se

conocen entre ellos.

Tomaría demasiado tiempo determinar esto buscando por fuerza bruta entre cada

subred que existe en internet, realmente tomaría tiempo exponencial “EXP” y por ello

es un problema NP-Completo.

Problemas que se han probado ser intratables

Problemas no decidibles: Problema Halting.

Todos los circuitos amiltonianos de una gráfica

Problemas cuya intratabilidad no se ha probado.

Pero para los cuales tampoco se conoce un algoritmo de tiempo polinomial.

Circuito Hamiltoniano, TSP

Knapsack

Satisfactibilidad

Cliqué

Calendarización Optima (Job Scheduling)

Cubierta Mínima

Corte Máximo.

Conclusión

En conclusión la teoría de la complejidad busca abstraer los detalles de los sistemas

computacionales y encontrar un algoritmo para realizar cálculos sin tener que

preocuparse por los detalles de implantación; siendo así decimos que la función es de

carácter computable o calculable.

La clase NP se caracteriza por el hecho curioso de que aún no se ha encontrado un

algoritmo polinomio que pueda comprobar si una solución posible es válida o no, lo cual

lleva a métodos de resolución no deterministas que son aplicados a métodos de

investigación que brindan soluciones hipotéticas que son desestimadas o aceptadas a

ritmo polinomio como señalamos anteriormente los problemas de esta clase se

denominan NP, la N de No determinista y la P de Polinomio.

Los problemas NP-Completos presentan una gran variedad de problemas, algunos de

ellos tienen una complejidad extrema. Estos problemas NP se encuentran en la frontera

de la clase NP porque son los más difíciles de la clase NP. Lo interesante de estos

problemas es que son equivalentes en el sentido de que si se descubre una solución P

para un problema NP-Completo podríamos aplicar esta solución a todos los problemas

NP con lo cual desaparecería la clase NP-Completo del mundo científico ya que se

carecería de problemas de este tipo.

Referencias

Brookshear, J. G. (1993). Teoría de la computación. Delaware: Addisson Wesley

Iberoamericana.

Grimaldi, R. (1997). Matemática discreta y combinatoria. Delaware: Adisson Wesley

Iberoamericana.