SlideShare une entreprise Scribd logo
1  sur  10
Télécharger pour lire hors ligne
“Análisis de Algoritmos”
1
“COMPLEJIDAD COMPUTACIONAL”
La complejidad computacional considera globalmente todos los posibles algoritmos para
resolver un problema dado.
Estamos interesados en la distinción que existe entre los problemas que pueden ser
resueltos por un algoritmo en tiempo polinómico y los problemas para los cuales no
conocemos ningún algoritmo polinómico, es decir, el mejor es no-polinómico.
La teoría de la NP-Completitud no proporciona un método para obtener algoritmos de
tiempo polinómico, ni dice que que estos algoritmos no existan. Lo que muestra es que
muchos de los problemas para los cuales no conocemos algoritmos polinómicos están
computacionalmente relacionados.
De esta forma se presentarán definiciones que pretenden distinguir entre los
problemas tratables (aquellos que no son tan duros) y los problemas
intratables (duros o que consumen mucho tiempo). La mayoría de estos
problemas ocurren como problemas de optimización combinatoria.
CLASIFICACIÓN DE PROBLEMAS
Los problemas matemáticos se pueden dividir en primera instancia en dos grupos:
 Problemas indecidibles: aquellos que no se pueden resolver mediante un
algoritmo.
 Problemas decidibles: aquellos que cuentan al menos con un algoritmo para su
cómputo.
Sin embargo, que un problema sea decididle no implica que se pueda encontrar su
solución, pues muchos problemas que disponen de algoritmos para su resolución
son inabordables para un computador por el elevado número de operaciones que
hay que realizar para resolverlos. Esto permite separar los problemas decidibles
en dos:
 Intratables: aquellos para los que no es factible
obtener su solución.
 Tratables: aquellos para los que existe al menos
un algoritmo capaz de resolverlo en un tiempo
razonable.
“Análisis de Algoritmos”
2
Problemas Intratables
Garey & Johnson, plantean una situación de intratabilidad interesante que describimos a
través del siguiente caso:
Si trabajas para una compañía que está pensando entrar a una nueva era globalizadora
de gobierno y tu jefe te propone que obtengas un método para determinar si o no
cualquier conjunto dado de especificaciones para un nuevo componente pueden ser
satisfechas de alguna manera y, si es así, se deberá construir el diseño que satisfaga
dichas expecificaciones. La realidad es que después de un tiempo comprobarás que no
hay manera de obtener tal método. De modo que tendrás dos alternativas:
1. Renunciar para evitar la pena de que te corran por inepto.
2. Esperar a que te corran por inepto. Sería muy penoso, pero tendrías que confesar
que no pudiste resolver el problema por falta de capacidad.
Para evitar la situación anterior tú podrías tratar de tomar una actitud de una persona más
valiente y demostrar que en realidad dicho método no se puede obtener. Si eso fuera así
entonces tú podrías ir con tu jefe y aclararle que el problema no lo resolviste porque no se
puede resolver: Es intratable.
Sin embargo, es muy probable que a tu jefe esta característica del problema le tenga sin
cuidado y, de todas maneras, te corran o tengas que renunciar.
Es decir regresarás a las alternativas: 1 y 2 antes citadas.
Una situación más prometedora, es tratar de probar que el problema no sólo es tan difícil
que no se puede resolver, sino que además pertenece a una clase de problemas tales
que cientos y miles de personas famosas e inteligentes, tampoco pudieron resolver. Aún
así, no estamos muy seguros aún de tu permanencia en la compañía!.
En realidad el conocimiento de que un problema es intratable es de gran utilidad en
problemas de tipo computacional. Dado que el problema completo es intratable, tu podrías
resolver el problema para ciertas instancias del mismo, o bien, resolver un problema
menos ambicioso. Por ejemplo, podrá conformarte con obtener un método para las
especificaciones de solo cierto tipo de componentes para determinados conjuntos de
entrada y no para "cualquier conjunto dado de especificaciones". Esto seguramente te
llevará a tener mejor relaciones con tu compañía.
En general, nos interesa encontrar el algoritmo más eficiente para resolver un problema
determinado. Desde ese punto de vista tendríamos que considerar todos los recursos
utilizados de manera que el algoritmo más eficiente sería aquél que consumiera menos
recursos. ¿Cuáles recursos? Si pensamos nuevamente que tu jefe te encarga que
obtengas el algoritmo más eficiente, es decir, el que consume menos recursos da pena de
que si no lo obtienes seas eliminado de la nomina de la compañía, estoy seguro, en que
pensarías en todos los recursos posibles (horas-hombre para construir el algoritmo,
tiempo de sintonización, tiempo requerido para obtener una solución, número de
procesadores empleados, cantidad de memoria requerida, etc.). Para simplificar un poco
la tarea, consideraremos que tu jefe te permite que la eficiencia la midas sobre un solo
recurso: El tiempo de ejecución. Pensemos por un momento que sólo se tiene una sola
máquina de modo que el número de procesadores no requiere de un análisis. ¿Qué le
“Análisis de Algoritmos”
3
pasó a tu jefe? ¿De pronto se volvió comprensivo contigo? En realidad los otros
parámetros los ha tomado en cuenta como costo directo del programa en cuestión. Esto
es en realidad lo que se hace en teoría de complejidad. Para el análisis de complejidad,
se considera por lo general la eficiencia sobre el tiempo, para un solo procesador en
cómputo secuencial; para cómputo paralelo se considera también el número de
procesadores.
Los algorimos han sido divididos como buenos o malos algoritmos. La comunidad
computacional acepta que un buen algoritmo es aquél para el cual existe un algoritmo
polinomial determinístico que lo resuelva. También se acepta que un mal algoritmo es
aquel para el cual dicho algoritmo simplemente no existe. Un problema se dice intratable,
si es muy difícil que un algoritmo de tiempo no polinomial lo resuelva. No obstante, esta
clasificación de algoritmos en buenos y malos puede resultar a veces engañosa, ya que
se podría pensar que los algoritmos exponenciales no son de utilidad práctica y que habrá
que utilizar solamente algoritmos polinomiales. Sin embargo se tiene el caso de los
métodos simplex y Branch and Bound, los cuales son muy eficientes para muchos
problemas prácticos. Desafortunadamente ejemplos como estos dos son raros, de modo
que es preferible seguir empleando como regla de clasificación en buenos y malos
algoritmos, la que lo hace dependiendo de si son o no polinomiales; todo esto con la
prudencia necesaria.
Problemas de Decisión
Aquí hemos hablado de problemas de optimización como aquél donde buscamos el
máximo o el mínimo de una función donde existen o no un conjunto de restricciones. Sin
embargo, un problema de optimización combinatoria puede también ser formulado de
manera más relajada como sigue:
Dado un problema de optimización, podemos encontrar el costo de la solución óptima.
Se sabe que dado un problema de optimización, se puede definir un problema de decisión
asociado a él, esto es, una pregunta que puede ser contestada por si o no. Por otro lado,
varios problemas computacionales bien conocidos son problemas de decisión. Entre los
problemas de decisión se pueden mencionar por ejemplo:
 El problema de paro (Halting Problem): dado un algoritmo y su entrada, ¿Parará
éste alguna vez?
 El problema de satisfactibilidad: dada una fórmula booleana, ¿Es ésta
satisfactible?
 El problema del circuito Hamiltoniano: dado un grafo G, ¿Hay un circuito en G que
visite todos los nodos exactamente una vez?.
La definición de problema de decisión a partir del problema de optimización permite
estudiar ambos tipos de problemas de una manera uniforme. Además, como se ha
puntualizado que un problema de decisión no es más difícil que el problema de
optimización original, cualquier resultado negativo probado sobre la complejidad del
problema de decisión será aplicable al problema de optimización también.
“Análisis de Algoritmos”
4
Se está interesado en clasificar los problemas de decisión de acuerdo a su complejidad.
Se denota por P a la clase de problemas de decisión que son polinomialmente acotados,
esto es, la clase de problemas de decisión que pueden ser solucionados en tiempo
polinomial. La clase P puede ser definida muy precisamente en términos de cualquier
formalismo matemático para algoritmos, como por ejemplo la Máquina de Turing.
Se puede decir que P es la clase de problemas de decisión relativamente fáciles, para los
cuales existe un algoritmo que los soluciona eficientemente.
Para una entrada dada, una "solución" es un objeto (por ejemplo, un grafo coloreado) que
satisface el criterio en el problema y justifica una respuesta afirmativa de si. Una "solución
propuesta" es simplemente un objeto del tipo apropiado, este puede o no satisfacer el
criterio. Informalmente se puede decir que NP es la clase de problemas de decisión para
los cuales una solución propuesta dada para una entrada dada, puede ser chequeada
rápidamente (en tiempo polinomial) para ver si ésta es realmente una solución, es decir, si
ésta satisface todos los requerimientos del problema.
Una solución propuesta puede ser descrita por una cadena de símbolos a partir de algún
conjunto finito. Simplemente se necesita alguna convención para describir grafos,
conjuntos, funciones, etc. usando estos símbolos. El tamaño de la cadena es el número
de símbolos en ella. Chequear una solución propuesta incluye chequear que la cadena
tenga sentido (esto es, que tenga una sintáxis correcta) como una descripción del tipo de
objeto requerido, también como chequear que ésta satisface el criterio del problema.
Algoritmos No Determinísticos
Un algoritmo no determinístico tiene dos fases:
Fase no Determinística: alguna cadena de caracteres, s, completamente arbitraria es
escrita a partir de algún lugar de memoria designado. Cada vez que el algoritmo corre, la
cadena escrita puede diferir (Esta cadena puede ser vista como una adivinación de la
solución para el problema, por lo que a esta fase se le da el nombre de fase de
adivinación, pero s también podría ser ininteligible o sin sentido).
Fase Determinística: Un algoritmo determinístico (es decir ordinario) siendo ejecutado.
Además de la entrada del problema de decisión, el algoritmo puede leer s, o puede
ignorarla. Eventualmente éste para con una salida de si o no, o puede entrar en un ciclo
infinito y nunca parar (véase ésta como la fase de chequear, el algoritmo determinístico
verifica s para ver si ésta es una solución para la entrada del problema de decisión).
El número de pasos llevados a cabo durante la ejecución de un algoritmo no
determinístico es definido como la suma de los pasos en ambas fases; esto es, el número
de pasos tomados para escribir s (simplemente el número de caracteres en s) más el
número de pasos ejecutados por la segunda fase determinística.
Normalmente cada vez que se corre un algoritmo con la misma entrada se obtiene la
misma salida. Esto no ocurre con algoritmos no determinísticos; para una entrada
particular x, la salida a partir de una corrida puede diferir de la salida de otra debido a que
ésta depende de s. aunque los algoritmos no determinísticos no son realistas (algoritmos
útiles en la práctica), ellos son útiles para clasificar problemas.
“Análisis de Algoritmos”
5
Se dice que un algoritmo no determinístico es polinomialmente acotado si hay un
polinomio p tal que para cada entrada de tamaño n para la cual la respuesta es si, hay
alguna ejecución del algoritmo que produce una salida si en cuando mucho p(n) pasos.
De esta forma se puede decir que: NP es la clase de problemas de decisión para los
cuales hay un algoritmo no determinístico acotado polinomialmente (el nombre de NP
viene de no determinístico polinomialmente acotado).
Un algoritmo ordinario (determinístico) para un problema de decisión es un caso especial
de un algoritmo no determinístico. En otras palabras, si A es un algoritmo determinístico
para un problema de decisión, entonces A es la segunda fase de un algoritmo no
determinístico. A simplemente ignora lo que fue escrito por la primera fase y procede con
su cálculo usual. Un algoritmo no determinístico puede hacer cero pasos en la primera
fase (escribiendo la cadena nula). Así, si A corre en tiempo polinomial, el algoritmo no
determinístico con A como su segunda fase corre también en tiempo polinomial. De lo
mencionado se deduce que P es un subconjunto propio de NP.
La gran pregunta es ¿ P = NP o es P un subconjunto propio de NP? Se cree que NP es
un conjunto mucho mayor que P, pero no hay un solo problema en NP para el cual éste
haya sido probado que el problema no está en P. No hay un algoritmo polinomialmente
acotado conocido para muchos problemas en NP, pero ningún límite inferior mayor que un
polinomio ha sido probado para estos problemas.
NP-completo es el término usado para describir los problemas de decisión que son los
más difíciles en NP en el sentido que, si hubiera un algoritmo polinomialmente acotado
para un problema NP-completo, entonces habría un algoritmo polinomialmente acotado
para cada problema en NP.
Algoritmos Determinísticos: Tiene la propiedad de que el resultado de cada operación,
se define en forma única.
Los problemas pueden clasificarse también atendiendo a su complejidad:
PROBLEMAS P, NP Y NP-COMPLETOS
CLASE P
Los algoritmos de complejidad polinómica se dice que son tratables en el sentido de que
suelen ser abordables en la práctica. Los problemas para los que se conocen algoritmos
con esta complejidad se dice que forman la clase P. Aquellos problemas para los que la
mejor solución que se conoce es de complejidad superior a la polinómica, se dice que son
problemas intratables. Seria muy interesante encontrar alguna solución polinómica (o
mejor) que permitiera abordarlos.
Ejemplos: Todos los algoritmos a los que se les ha podido establecer su tiempo de
ejecución.
“Análisis de Algoritmos”
6
CLASE NP
Algunos de estos problemas intratables pueden caracterizarse por el curioso hecho de
que puede aplicarse un algoritmo polinómico para comprobar si una posible solución es
válida o no. Esta característica lleva a un método de resolución no determinista
consistente en aplicar heurísticos para obtener soluciones hipotéticas que se van
desestimando (o aceptando) a ritmo polinómico. Los problemas de esta clase se
denominan NP (la N de no-deterministas y la P de polinómicos). Los problemas de la
clase P son subconjunto de los de clase NP.
Ejemplos: Torres de Hanoi, Ordenación por el método Shell
CLASE NP-COMPLETOS.
Se conoce una amplia variedad de problemas de tipo NP, de los cuales destacan algunos
de ellos de extrema complejidad. Gráficamente se puede decir que algunos problemas se
encuentran en la "frontera externa" de la clase NP. Son problemas NP, y son los peores
problemas posibles de clase NP. Estos problemas se caracterizan por ser todos "iguales"
en el sentido de que si se descubriera una solución P para alguno de ellos, esta solución
sería fácilmente aplicable a todos ellos. Actualmente hay un premio de prestigio
equivalente al Nobel reservado para el que descubra semejante solución.
Es más, si se descubriera una solución para los problemas NP-completos, esta sería
aplicable a todos los problemas NP y, por tanto, la clase NP desaparecería del mundo
científico al carecerse de problemas de ese tipo. Realmente, tras años de búsqueda
exhaustiva de dicha solución, es hecho ampliamente aceptado que no debe existir,
aunque nadie ha demostrado, todavía, la imposibilidad de su existencia.
La teoría de NP-completitud se basa en el concepto de transformación polinomial.
Transformación Polinomial: es una función que permite cambiar la representación de
problema D1 a otro problema D2 aplicando un algoritmo determinista de tiempo
polinomial.
Lo anterior se puede representar como ''D1 se transforma a D2'' o D1 µ D2.
Las transformaciones polinomiales son importantes porque sirven para determinar la
pertenencia de los problemas a las clases P y NP, y permiten definir la clase NP-
completo.
Si D1 se transforma a D2 y D2 pertenece a la clase P, entonces D1 también pertenece a
la clase P, porque, si para cambiar de D1 a D2 se utiliza un algoritmo de tiempo polinomial
y si D2 (ya que pertenece a la clase P) tiene un algoritmo de solución que se ejecuta en
tiempo polinomial, D1 debe tener asociado un algoritmo que lo resuelva también en
tiempo polinomial, y D1 debe pertenecer a la clase P.
“Análisis de Algoritmos”
7
P
NP (No Determinístico
Polinomial)
NP-COMPLETO
Existe un Algoritmo de
tiempo polinómico para su
resolución.
Sus mejores algoritmos
conocidos son no
deterministas.
Imposible encontrar un
algoritmo eficiente para
encontrar una solución
óptima.
El tiempo de ejecución de
estos algoritmos está dado
por un polinomio.
Puede aplicarse un
algoritmo polinómico para
comprobar si una posible
solución es válida o no
Se basan en el concepto de
Transformación Polinomial.
(D1 µ D2)
Ej: Factorial, búsqueda
secuencial, etc.
Ej: Torres de Hanoi,
Ordenación por el método
del Shell
Ej: Vendedor Viajero,
Mochila, etc.
“SOLUCIONES” A PROBLEMAS NP-COMPLETOS
1. Técnicas Heurísticas
2. Aproximaciones Polinomiales
1. Un algoritmo heurístico (o simplemente heurística) puede producir una buena
solución (puede que la óptima) pero también puede que no produzca ninguna
solución o dar una solución no muy buena. Normalmente, se basa en un
conocimiento intuitivo del programador sobre un determinado problema.
Ejemplo: Para el caso del vendedor viajero se tienen 2 heurísticas:
a. Realizar todas las combinaciones posibles
b. Iniciar un grafo con los nodos y sin las aristas e ir agregando las aristas de
menor costo que unen los vértices.
2. Aproximaciones Polinomiales: encontrar soluciones que se aproximen a la
solución óptima.
Siempre que se desea realizar una aproximación, existe un error relativo que
afecta a esta solución, el cual está dado por:
| opt(x) – c (sx) |
max{opt(x), c(sx)}
“Análisis de Algoritmos”
8
Problemas NP-Completos
1. Ciclo Hamiltoniano: es aquél que recorre todos los nodos en un camino simple.
 Un Ciclo Hamiltoneano es aquél que recorre todos los nodos en un camino
simple.
 Problema: Existe un ciclo simple en G que contenga a todos los vértices?
Un posible candidato para este problema puede ser verificado en tiempo
polinomial, luego este problema está en la categoría NP.
Consideremos el problema del ciclo Hamiltoniano “¿Tiene un grafo G un ciclo
Hamiltoniano? (Aquél que recorre todos los nodos en un camino simple) Un
posible candidato para este problema puede ser verificado en tiempo polinomial,
luego este problema está en la categoría NP.
Ejemplo:
“Análisis de Algoritmos”
9
2. Vendedor Viajero: Recorrer todos los vértices de manera que el costo sea
mínimo. No se debe pasar 2 veces por un mismo vértice. Se debe volver al punto
de partida.
• Se tiene un grafo completo (todos los arcos) con costos asociados a cada
arco. El vendedor desea hacer un “tour” (ciclo hamiltoniano) tal que el costo
sea mínimo.
Ejemplo:
15
30
20
25
50
45
10
35
40 55
5
4
3
1
2
A
F
D
B
C
E
4
3
3
5
7
21
9
2
35
1
“Análisis de Algoritmos”
3
pasó a tu jefe? ¿De pronto se volvió comprensivo contigo? En realidad los otros
parámetros los ha tomado en cuenta como costo directo del programa en cuestión. Esto
es en realidad lo que se hace en teoría de complejidad. Para el análisis de complejidad,
se considera por lo general la eficiencia sobre el tiempo, para un solo procesador en
cómputo secuencial; para cómputo paralelo se considera también el número de
procesadores.
Los algorimos han sido divididos como buenos o malos algoritmos. La comunidad
computacional acepta que un buen algoritmo es aquél para el cual existe un algoritmo
polinomial determinístico que lo resuelva. También se acepta que un mal algoritmo es
aquel para el cual dicho algoritmo simplemente no existe. Un problema se dice intratable,
si es muy difícil que un algoritmo de tiempo no polinomial lo resuelva. No obstante, esta
clasificación de algoritmos en buenos y malos puede resultar a veces engañosa, ya que
se podría pensar que los algoritmos exponenciales no son de utilidad práctica y que habrá
que utilizar solamente algoritmos polinomiales. Sin embargo se tiene el caso de los
métodos simplex y Branch and Bound, los cuales son muy eficientes para muchos
problemas prácticos. Desafortunadamente ejemplos como estos dos son raros, de modo
que es preferible seguir empleando como regla de clasificación en buenos y malos
algoritmos, la que lo hace dependiendo de si son o no polinomiales; todo esto con la
prudencia necesaria.
Problemas de Decisión
Aquí hemos hablado de problemas de optimización como aquél donde buscamos el
máximo o el mínimo de una función donde existen o no un conjunto de restricciones. Sin
embargo, un problema de optimización combinatoria puede también ser formulado de
manera más relajada como sigue:
Dado un problema de optimización, podemos encontrar el costo de la solución óptima.
Se sabe que dado un problema de optimización, se puede definir un problema de decisión
asociado a él, esto es, una pregunta que puede ser contestada por si o no. Por otro lado,
varios problemas computacionales bien conocidos son problemas de decisión. Entre los
problemas de decisión se pueden mencionar por ejemplo:
 El problema de paro (Halting Problem): dado un algoritmo y su entrada, ¿Parará
éste alguna vez?
 El problema de satisfactibilidad: dada una fórmula booleana, ¿Es ésta
satisfactible?
 El problema del circuito Hamiltoniano: dado un grafo G, ¿Hay un circuito en G que
visite todos los nodos exactamente una vez?.
La definición de problema de decisión a partir del problema de optimización permite
estudiar ambos tipos de problemas de una manera uniforme. Además, como se ha
puntualizado que un problema de decisión no es más difícil que el problema de
optimización original, cualquier resultado negativo probado sobre la complejidad del
problema de decisión será aplicable al problema de optimización también.

Contenu connexe

Tendances

Resumen programacion lineal
Resumen programacion linealResumen programacion lineal
Resumen programacion linealSilvia Michay
 
El problema de la mochila
El problema de la mochilaEl problema de la mochila
El problema de la mochilaEn todos lados
 
Pruebas de Uniformidad
Pruebas de UniformidadPruebas de Uniformidad
Pruebas de UniformidadEwing Ma
 
Introducción a la Programación No Lineal
Introducción a la Programación No LinealIntroducción a la Programación No Lineal
Introducción a la Programación No LinealAngelCarrasquel3
 
3.1.1 Búsqueda exhaustiva.pptx
3.1.1 Búsqueda exhaustiva.pptx3.1.1 Búsqueda exhaustiva.pptx
3.1.1 Búsqueda exhaustiva.pptxFernando Solis
 
Simulacion para ISC - Unidad 1 Introducción a la Simulación
Simulacion para ISC - Unidad 1 Introducción a la SimulaciónSimulacion para ISC - Unidad 1 Introducción a la Simulación
Simulacion para ISC - Unidad 1 Introducción a la SimulaciónJosé Antonio Sandoval Acosta
 
Ejercicios resueltos de java
Ejercicios resueltos de javaEjercicios resueltos de java
Ejercicios resueltos de javaFaral TF
 
Ejemplo de-simulación-continua
Ejemplo de-simulación-continuaEjemplo de-simulación-continua
Ejemplo de-simulación-continuaLeonardo Rojas
 
Aplicaciones de los números complejos
Aplicaciones de los números complejosAplicaciones de los números complejos
Aplicaciones de los números complejosJazmin Rivera
 
Métodos para generar números aleatorios
Métodos para generar números aleatoriosMétodos para generar números aleatorios
Métodos para generar números aleatoriosfabela_c
 

Tendances (20)

Unidad 1. Programación entera
Unidad 1. Programación enteraUnidad 1. Programación entera
Unidad 1. Programación entera
 
Resumen programacion lineal
Resumen programacion linealResumen programacion lineal
Resumen programacion lineal
 
Programación dinámica
Programación dinámicaProgramación dinámica
Programación dinámica
 
El problema de la mochila
El problema de la mochilaEl problema de la mochila
El problema de la mochila
 
Unidad 3. Programación dinámica
Unidad 3. Programación dinámicaUnidad 3. Programación dinámica
Unidad 3. Programación dinámica
 
Importancia de la simulacion
Importancia de la simulacionImportancia de la simulacion
Importancia de la simulacion
 
Programacion no lineal
Programacion no linealProgramacion no lineal
Programacion no lineal
 
Pruebas de Uniformidad
Pruebas de UniformidadPruebas de Uniformidad
Pruebas de Uniformidad
 
Arreglos - Assembler
Arreglos - AssemblerArreglos - Assembler
Arreglos - Assembler
 
MEMOIZACIÓN
MEMOIZACIÓNMEMOIZACIÓN
MEMOIZACIÓN
 
Introducción a la Programación No Lineal
Introducción a la Programación No LinealIntroducción a la Programación No Lineal
Introducción a la Programación No Lineal
 
Recursividad
RecursividadRecursividad
Recursividad
 
3.1.1 Búsqueda exhaustiva.pptx
3.1.1 Búsqueda exhaustiva.pptx3.1.1 Búsqueda exhaustiva.pptx
3.1.1 Búsqueda exhaustiva.pptx
 
Simulacion para ISC - Unidad 1 Introducción a la Simulación
Simulacion para ISC - Unidad 1 Introducción a la SimulaciónSimulacion para ISC - Unidad 1 Introducción a la Simulación
Simulacion para ISC - Unidad 1 Introducción a la Simulación
 
Ejercicios resueltos de java
Ejercicios resueltos de javaEjercicios resueltos de java
Ejercicios resueltos de java
 
algoritmos distribuidos
algoritmos distribuidosalgoritmos distribuidos
algoritmos distribuidos
 
Ejemplo de-simulación-continua
Ejemplo de-simulación-continuaEjemplo de-simulación-continua
Ejemplo de-simulación-continua
 
Aplicaciones de los números complejos
Aplicaciones de los números complejosAplicaciones de los números complejos
Aplicaciones de los números complejos
 
Problema 8 puzzle
Problema 8 puzzleProblema 8 puzzle
Problema 8 puzzle
 
Métodos para generar números aleatorios
Métodos para generar números aleatoriosMétodos para generar números aleatorios
Métodos para generar números aleatorios
 

Similaire à Clasificacion de los problemas

Tema1 faa 16_17
Tema1 faa 16_17Tema1 faa 16_17
Tema1 faa 16_17alexray100
 
Actividad iv aplicar algoritmos a problemas (reparado)
Actividad iv aplicar algoritmos a problemas (reparado)Actividad iv aplicar algoritmos a problemas (reparado)
Actividad iv aplicar algoritmos a problemas (reparado)javier170497
 
Algoritmos Voraces (Greedy)
Algoritmos Voraces (Greedy)Algoritmos Voraces (Greedy)
Algoritmos Voraces (Greedy)luzenith_g
 
Chapter 1 General Problem-Solving Concepts
Chapter 1 General Problem-Solving ConceptsChapter 1 General Problem-Solving Concepts
Chapter 1 General Problem-Solving ConceptsCarlos M. Sandoval
 
Complejidad de problemas
Complejidad de problemasComplejidad de problemas
Complejidad de problemasrodrigoalseco
 
1.3 elaborar algoritmos de la solución de un problema.
1.3 elaborar algoritmos de la solución de un problema.1.3 elaborar algoritmos de la solución de un problema.
1.3 elaborar algoritmos de la solución de un problema.carolina peña
 
Presentación optimizacion de sistema
Presentación optimizacion de sistemaPresentación optimizacion de sistema
Presentación optimizacion de sistemaDiRossalez
 
portafolio de informatica
portafolio de informaticaportafolio de informatica
portafolio de informaticabeyiima
 
Actividad iv aplicar algoritmos a problemas (pasar ya a carpeta)
Actividad iv aplicar algoritmos a problemas (pasar ya a carpeta)Actividad iv aplicar algoritmos a problemas (pasar ya a carpeta)
Actividad iv aplicar algoritmos a problemas (pasar ya a carpeta)beyiima
 
Programacion dinamica
Programacion dinamicaProgramacion dinamica
Programacion dinamicaJosé Padrón
 
Actividad IV Aplicar algoritmos a problemas
Actividad IV Aplicar algoritmos a problemasActividad IV Aplicar algoritmos a problemas
Actividad IV Aplicar algoritmos a problemasgamma_destro
 
resolucion de problemas: Algoritmos y programas
resolucion de problemas: Algoritmos y programas resolucion de problemas: Algoritmos y programas
resolucion de problemas: Algoritmos y programas panchofronteras
 
Unidad1 130504213500-phpapp02
Unidad1 130504213500-phpapp02Unidad1 130504213500-phpapp02
Unidad1 130504213500-phpapp02Lesly Gonzalez
 
Unidad1 130504213500-phpapp02
Unidad1 130504213500-phpapp02Unidad1 130504213500-phpapp02
Unidad1 130504213500-phpapp02Lesly Gonzalez
 

Similaire à Clasificacion de los problemas (20)

Tema1 faa 16_17
Tema1 faa 16_17Tema1 faa 16_17
Tema1 faa 16_17
 
Actividad iv aplicar algoritmos a problemas (reparado)
Actividad iv aplicar algoritmos a problemas (reparado)Actividad iv aplicar algoritmos a problemas (reparado)
Actividad iv aplicar algoritmos a problemas (reparado)
 
Cap1.3
Cap1.3Cap1.3
Cap1.3
 
Algoritmos Voraces (Greedy)
Algoritmos Voraces (Greedy)Algoritmos Voraces (Greedy)
Algoritmos Voraces (Greedy)
 
Chapter 1 General Problem-Solving Concepts
Chapter 1 General Problem-Solving ConceptsChapter 1 General Problem-Solving Concepts
Chapter 1 General Problem-Solving Concepts
 
Complejidad de problemas
Complejidad de problemasComplejidad de problemas
Complejidad de problemas
 
1.3 elaborar algoritmos de la solución de un problema.
1.3 elaborar algoritmos de la solución de un problema.1.3 elaborar algoritmos de la solución de un problema.
1.3 elaborar algoritmos de la solución de un problema.
 
Presentación optimizacion de sistema
Presentación optimizacion de sistemaPresentación optimizacion de sistema
Presentación optimizacion de sistema
 
portafolio de informatica
portafolio de informaticaportafolio de informatica
portafolio de informatica
 
Actividad iv aplicar algoritmos a problemas (pasar ya a carpeta)
Actividad iv aplicar algoritmos a problemas (pasar ya a carpeta)Actividad iv aplicar algoritmos a problemas (pasar ya a carpeta)
Actividad iv aplicar algoritmos a problemas (pasar ya a carpeta)
 
Vivi Reinoso
Vivi ReinosoVivi Reinoso
Vivi Reinoso
 
Unidad 1
Unidad 1Unidad 1
Unidad 1
 
Unidad 1
Unidad 1Unidad 1
Unidad 1
 
Elaboracion de algoritmos
Elaboracion de algoritmosElaboracion de algoritmos
Elaboracion de algoritmos
 
Programacion dinamica
Programacion dinamicaProgramacion dinamica
Programacion dinamica
 
Unidad 1
Unidad 1Unidad 1
Unidad 1
 
Actividad IV Aplicar algoritmos a problemas
Actividad IV Aplicar algoritmos a problemasActividad IV Aplicar algoritmos a problemas
Actividad IV Aplicar algoritmos a problemas
 
resolucion de problemas: Algoritmos y programas
resolucion de problemas: Algoritmos y programas resolucion de problemas: Algoritmos y programas
resolucion de problemas: Algoritmos y programas
 
Unidad1 130504213500-phpapp02
Unidad1 130504213500-phpapp02Unidad1 130504213500-phpapp02
Unidad1 130504213500-phpapp02
 
Unidad1 130504213500-phpapp02
Unidad1 130504213500-phpapp02Unidad1 130504213500-phpapp02
Unidad1 130504213500-phpapp02
 

Plus de Patricia Correa

Plus de Patricia Correa (6)

Clasificacion de los problemas (1)
Clasificacion de los problemas (1)Clasificacion de los problemas (1)
Clasificacion de los problemas (1)
 
Como funciona la recursividad
Como funciona la recursividadComo funciona la recursividad
Como funciona la recursividad
 
Metodo quicksort
Metodo quicksortMetodo quicksort
Metodo quicksort
 
Cuadro comparativo quicksort
Cuadro comparativo quicksortCuadro comparativo quicksort
Cuadro comparativo quicksort
 
Algoritmo metodo quicksort
Algoritmo metodo quicksortAlgoritmo metodo quicksort
Algoritmo metodo quicksort
 
Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 

Clasificacion de los problemas

  • 1. “Análisis de Algoritmos” 1 “COMPLEJIDAD COMPUTACIONAL” La complejidad computacional considera globalmente todos los posibles algoritmos para resolver un problema dado. Estamos interesados en la distinción que existe entre los problemas que pueden ser resueltos por un algoritmo en tiempo polinómico y los problemas para los cuales no conocemos ningún algoritmo polinómico, es decir, el mejor es no-polinómico. La teoría de la NP-Completitud no proporciona un método para obtener algoritmos de tiempo polinómico, ni dice que que estos algoritmos no existan. Lo que muestra es que muchos de los problemas para los cuales no conocemos algoritmos polinómicos están computacionalmente relacionados. De esta forma se presentarán definiciones que pretenden distinguir entre los problemas tratables (aquellos que no son tan duros) y los problemas intratables (duros o que consumen mucho tiempo). La mayoría de estos problemas ocurren como problemas de optimización combinatoria. CLASIFICACIÓN DE PROBLEMAS Los problemas matemáticos se pueden dividir en primera instancia en dos grupos:  Problemas indecidibles: aquellos que no se pueden resolver mediante un algoritmo.  Problemas decidibles: aquellos que cuentan al menos con un algoritmo para su cómputo. Sin embargo, que un problema sea decididle no implica que se pueda encontrar su solución, pues muchos problemas que disponen de algoritmos para su resolución son inabordables para un computador por el elevado número de operaciones que hay que realizar para resolverlos. Esto permite separar los problemas decidibles en dos:  Intratables: aquellos para los que no es factible obtener su solución.  Tratables: aquellos para los que existe al menos un algoritmo capaz de resolverlo en un tiempo razonable.
  • 2. “Análisis de Algoritmos” 2 Problemas Intratables Garey & Johnson, plantean una situación de intratabilidad interesante que describimos a través del siguiente caso: Si trabajas para una compañía que está pensando entrar a una nueva era globalizadora de gobierno y tu jefe te propone que obtengas un método para determinar si o no cualquier conjunto dado de especificaciones para un nuevo componente pueden ser satisfechas de alguna manera y, si es así, se deberá construir el diseño que satisfaga dichas expecificaciones. La realidad es que después de un tiempo comprobarás que no hay manera de obtener tal método. De modo que tendrás dos alternativas: 1. Renunciar para evitar la pena de que te corran por inepto. 2. Esperar a que te corran por inepto. Sería muy penoso, pero tendrías que confesar que no pudiste resolver el problema por falta de capacidad. Para evitar la situación anterior tú podrías tratar de tomar una actitud de una persona más valiente y demostrar que en realidad dicho método no se puede obtener. Si eso fuera así entonces tú podrías ir con tu jefe y aclararle que el problema no lo resolviste porque no se puede resolver: Es intratable. Sin embargo, es muy probable que a tu jefe esta característica del problema le tenga sin cuidado y, de todas maneras, te corran o tengas que renunciar. Es decir regresarás a las alternativas: 1 y 2 antes citadas. Una situación más prometedora, es tratar de probar que el problema no sólo es tan difícil que no se puede resolver, sino que además pertenece a una clase de problemas tales que cientos y miles de personas famosas e inteligentes, tampoco pudieron resolver. Aún así, no estamos muy seguros aún de tu permanencia en la compañía!. En realidad el conocimiento de que un problema es intratable es de gran utilidad en problemas de tipo computacional. Dado que el problema completo es intratable, tu podrías resolver el problema para ciertas instancias del mismo, o bien, resolver un problema menos ambicioso. Por ejemplo, podrá conformarte con obtener un método para las especificaciones de solo cierto tipo de componentes para determinados conjuntos de entrada y no para "cualquier conjunto dado de especificaciones". Esto seguramente te llevará a tener mejor relaciones con tu compañía. En general, nos interesa encontrar el algoritmo más eficiente para resolver un problema determinado. Desde ese punto de vista tendríamos que considerar todos los recursos utilizados de manera que el algoritmo más eficiente sería aquél que consumiera menos recursos. ¿Cuáles recursos? Si pensamos nuevamente que tu jefe te encarga que obtengas el algoritmo más eficiente, es decir, el que consume menos recursos da pena de que si no lo obtienes seas eliminado de la nomina de la compañía, estoy seguro, en que pensarías en todos los recursos posibles (horas-hombre para construir el algoritmo, tiempo de sintonización, tiempo requerido para obtener una solución, número de procesadores empleados, cantidad de memoria requerida, etc.). Para simplificar un poco la tarea, consideraremos que tu jefe te permite que la eficiencia la midas sobre un solo recurso: El tiempo de ejecución. Pensemos por un momento que sólo se tiene una sola máquina de modo que el número de procesadores no requiere de un análisis. ¿Qué le
  • 3. “Análisis de Algoritmos” 3 pasó a tu jefe? ¿De pronto se volvió comprensivo contigo? En realidad los otros parámetros los ha tomado en cuenta como costo directo del programa en cuestión. Esto es en realidad lo que se hace en teoría de complejidad. Para el análisis de complejidad, se considera por lo general la eficiencia sobre el tiempo, para un solo procesador en cómputo secuencial; para cómputo paralelo se considera también el número de procesadores. Los algorimos han sido divididos como buenos o malos algoritmos. La comunidad computacional acepta que un buen algoritmo es aquél para el cual existe un algoritmo polinomial determinístico que lo resuelva. También se acepta que un mal algoritmo es aquel para el cual dicho algoritmo simplemente no existe. Un problema se dice intratable, si es muy difícil que un algoritmo de tiempo no polinomial lo resuelva. No obstante, esta clasificación de algoritmos en buenos y malos puede resultar a veces engañosa, ya que se podría pensar que los algoritmos exponenciales no son de utilidad práctica y que habrá que utilizar solamente algoritmos polinomiales. Sin embargo se tiene el caso de los métodos simplex y Branch and Bound, los cuales son muy eficientes para muchos problemas prácticos. Desafortunadamente ejemplos como estos dos son raros, de modo que es preferible seguir empleando como regla de clasificación en buenos y malos algoritmos, la que lo hace dependiendo de si son o no polinomiales; todo esto con la prudencia necesaria. Problemas de Decisión Aquí hemos hablado de problemas de optimización como aquél donde buscamos el máximo o el mínimo de una función donde existen o no un conjunto de restricciones. Sin embargo, un problema de optimización combinatoria puede también ser formulado de manera más relajada como sigue: Dado un problema de optimización, podemos encontrar el costo de la solución óptima. Se sabe que dado un problema de optimización, se puede definir un problema de decisión asociado a él, esto es, una pregunta que puede ser contestada por si o no. Por otro lado, varios problemas computacionales bien conocidos son problemas de decisión. Entre los problemas de decisión se pueden mencionar por ejemplo:  El problema de paro (Halting Problem): dado un algoritmo y su entrada, ¿Parará éste alguna vez?  El problema de satisfactibilidad: dada una fórmula booleana, ¿Es ésta satisfactible?  El problema del circuito Hamiltoniano: dado un grafo G, ¿Hay un circuito en G que visite todos los nodos exactamente una vez?. La definición de problema de decisión a partir del problema de optimización permite estudiar ambos tipos de problemas de una manera uniforme. Además, como se ha puntualizado que un problema de decisión no es más difícil que el problema de optimización original, cualquier resultado negativo probado sobre la complejidad del problema de decisión será aplicable al problema de optimización también.
  • 4. “Análisis de Algoritmos” 4 Se está interesado en clasificar los problemas de decisión de acuerdo a su complejidad. Se denota por P a la clase de problemas de decisión que son polinomialmente acotados, esto es, la clase de problemas de decisión que pueden ser solucionados en tiempo polinomial. La clase P puede ser definida muy precisamente en términos de cualquier formalismo matemático para algoritmos, como por ejemplo la Máquina de Turing. Se puede decir que P es la clase de problemas de decisión relativamente fáciles, para los cuales existe un algoritmo que los soluciona eficientemente. Para una entrada dada, una "solución" es un objeto (por ejemplo, un grafo coloreado) que satisface el criterio en el problema y justifica una respuesta afirmativa de si. Una "solución propuesta" es simplemente un objeto del tipo apropiado, este puede o no satisfacer el criterio. Informalmente se puede decir que NP es la clase de problemas de decisión para los cuales una solución propuesta dada para una entrada dada, puede ser chequeada rápidamente (en tiempo polinomial) para ver si ésta es realmente una solución, es decir, si ésta satisface todos los requerimientos del problema. Una solución propuesta puede ser descrita por una cadena de símbolos a partir de algún conjunto finito. Simplemente se necesita alguna convención para describir grafos, conjuntos, funciones, etc. usando estos símbolos. El tamaño de la cadena es el número de símbolos en ella. Chequear una solución propuesta incluye chequear que la cadena tenga sentido (esto es, que tenga una sintáxis correcta) como una descripción del tipo de objeto requerido, también como chequear que ésta satisface el criterio del problema. Algoritmos No Determinísticos Un algoritmo no determinístico tiene dos fases: Fase no Determinística: alguna cadena de caracteres, s, completamente arbitraria es escrita a partir de algún lugar de memoria designado. Cada vez que el algoritmo corre, la cadena escrita puede diferir (Esta cadena puede ser vista como una adivinación de la solución para el problema, por lo que a esta fase se le da el nombre de fase de adivinación, pero s también podría ser ininteligible o sin sentido). Fase Determinística: Un algoritmo determinístico (es decir ordinario) siendo ejecutado. Además de la entrada del problema de decisión, el algoritmo puede leer s, o puede ignorarla. Eventualmente éste para con una salida de si o no, o puede entrar en un ciclo infinito y nunca parar (véase ésta como la fase de chequear, el algoritmo determinístico verifica s para ver si ésta es una solución para la entrada del problema de decisión). El número de pasos llevados a cabo durante la ejecución de un algoritmo no determinístico es definido como la suma de los pasos en ambas fases; esto es, el número de pasos tomados para escribir s (simplemente el número de caracteres en s) más el número de pasos ejecutados por la segunda fase determinística. Normalmente cada vez que se corre un algoritmo con la misma entrada se obtiene la misma salida. Esto no ocurre con algoritmos no determinísticos; para una entrada particular x, la salida a partir de una corrida puede diferir de la salida de otra debido a que ésta depende de s. aunque los algoritmos no determinísticos no son realistas (algoritmos útiles en la práctica), ellos son útiles para clasificar problemas.
  • 5. “Análisis de Algoritmos” 5 Se dice que un algoritmo no determinístico es polinomialmente acotado si hay un polinomio p tal que para cada entrada de tamaño n para la cual la respuesta es si, hay alguna ejecución del algoritmo que produce una salida si en cuando mucho p(n) pasos. De esta forma se puede decir que: NP es la clase de problemas de decisión para los cuales hay un algoritmo no determinístico acotado polinomialmente (el nombre de NP viene de no determinístico polinomialmente acotado). Un algoritmo ordinario (determinístico) para un problema de decisión es un caso especial de un algoritmo no determinístico. En otras palabras, si A es un algoritmo determinístico para un problema de decisión, entonces A es la segunda fase de un algoritmo no determinístico. A simplemente ignora lo que fue escrito por la primera fase y procede con su cálculo usual. Un algoritmo no determinístico puede hacer cero pasos en la primera fase (escribiendo la cadena nula). Así, si A corre en tiempo polinomial, el algoritmo no determinístico con A como su segunda fase corre también en tiempo polinomial. De lo mencionado se deduce que P es un subconjunto propio de NP. La gran pregunta es ¿ P = NP o es P un subconjunto propio de NP? Se cree que NP es un conjunto mucho mayor que P, pero no hay un solo problema en NP para el cual éste haya sido probado que el problema no está en P. No hay un algoritmo polinomialmente acotado conocido para muchos problemas en NP, pero ningún límite inferior mayor que un polinomio ha sido probado para estos problemas. NP-completo es el término usado para describir los problemas de decisión que son los más difíciles en NP en el sentido que, si hubiera un algoritmo polinomialmente acotado para un problema NP-completo, entonces habría un algoritmo polinomialmente acotado para cada problema en NP. Algoritmos Determinísticos: Tiene la propiedad de que el resultado de cada operación, se define en forma única. Los problemas pueden clasificarse también atendiendo a su complejidad: PROBLEMAS P, NP Y NP-COMPLETOS CLASE P Los algoritmos de complejidad polinómica se dice que son tratables en el sentido de que suelen ser abordables en la práctica. Los problemas para los que se conocen algoritmos con esta complejidad se dice que forman la clase P. Aquellos problemas para los que la mejor solución que se conoce es de complejidad superior a la polinómica, se dice que son problemas intratables. Seria muy interesante encontrar alguna solución polinómica (o mejor) que permitiera abordarlos. Ejemplos: Todos los algoritmos a los que se les ha podido establecer su tiempo de ejecución.
  • 6. “Análisis de Algoritmos” 6 CLASE NP Algunos de estos problemas intratables pueden caracterizarse por el curioso hecho de que puede aplicarse un algoritmo polinómico para comprobar si una posible solución es válida o no. Esta característica lleva a un método de resolución no determinista consistente en aplicar heurísticos para obtener soluciones hipotéticas que se van desestimando (o aceptando) a ritmo polinómico. Los problemas de esta clase se denominan NP (la N de no-deterministas y la P de polinómicos). Los problemas de la clase P son subconjunto de los de clase NP. Ejemplos: Torres de Hanoi, Ordenación por el método Shell CLASE NP-COMPLETOS. Se conoce una amplia variedad de problemas de tipo NP, de los cuales destacan algunos de ellos de extrema complejidad. Gráficamente se puede decir que algunos problemas se encuentran en la "frontera externa" de la clase NP. Son problemas NP, y son los peores problemas posibles de clase NP. Estos problemas se caracterizan por ser todos "iguales" en el sentido de que si se descubriera una solución P para alguno de ellos, esta solución sería fácilmente aplicable a todos ellos. Actualmente hay un premio de prestigio equivalente al Nobel reservado para el que descubra semejante solución. Es más, si se descubriera una solución para los problemas NP-completos, esta sería aplicable a todos los problemas NP y, por tanto, la clase NP desaparecería del mundo científico al carecerse de problemas de ese tipo. Realmente, tras años de búsqueda exhaustiva de dicha solución, es hecho ampliamente aceptado que no debe existir, aunque nadie ha demostrado, todavía, la imposibilidad de su existencia. La teoría de NP-completitud se basa en el concepto de transformación polinomial. Transformación Polinomial: es una función que permite cambiar la representación de problema D1 a otro problema D2 aplicando un algoritmo determinista de tiempo polinomial. Lo anterior se puede representar como ''D1 se transforma a D2'' o D1 µ D2. Las transformaciones polinomiales son importantes porque sirven para determinar la pertenencia de los problemas a las clases P y NP, y permiten definir la clase NP- completo. Si D1 se transforma a D2 y D2 pertenece a la clase P, entonces D1 también pertenece a la clase P, porque, si para cambiar de D1 a D2 se utiliza un algoritmo de tiempo polinomial y si D2 (ya que pertenece a la clase P) tiene un algoritmo de solución que se ejecuta en tiempo polinomial, D1 debe tener asociado un algoritmo que lo resuelva también en tiempo polinomial, y D1 debe pertenecer a la clase P.
  • 7. “Análisis de Algoritmos” 7 P NP (No Determinístico Polinomial) NP-COMPLETO Existe un Algoritmo de tiempo polinómico para su resolución. Sus mejores algoritmos conocidos son no deterministas. Imposible encontrar un algoritmo eficiente para encontrar una solución óptima. El tiempo de ejecución de estos algoritmos está dado por un polinomio. Puede aplicarse un algoritmo polinómico para comprobar si una posible solución es válida o no Se basan en el concepto de Transformación Polinomial. (D1 µ D2) Ej: Factorial, búsqueda secuencial, etc. Ej: Torres de Hanoi, Ordenación por el método del Shell Ej: Vendedor Viajero, Mochila, etc. “SOLUCIONES” A PROBLEMAS NP-COMPLETOS 1. Técnicas Heurísticas 2. Aproximaciones Polinomiales 1. Un algoritmo heurístico (o simplemente heurística) puede producir una buena solución (puede que la óptima) pero también puede que no produzca ninguna solución o dar una solución no muy buena. Normalmente, se basa en un conocimiento intuitivo del programador sobre un determinado problema. Ejemplo: Para el caso del vendedor viajero se tienen 2 heurísticas: a. Realizar todas las combinaciones posibles b. Iniciar un grafo con los nodos y sin las aristas e ir agregando las aristas de menor costo que unen los vértices. 2. Aproximaciones Polinomiales: encontrar soluciones que se aproximen a la solución óptima. Siempre que se desea realizar una aproximación, existe un error relativo que afecta a esta solución, el cual está dado por: | opt(x) – c (sx) | max{opt(x), c(sx)}
  • 8. “Análisis de Algoritmos” 8 Problemas NP-Completos 1. Ciclo Hamiltoniano: es aquél que recorre todos los nodos en un camino simple.  Un Ciclo Hamiltoneano es aquél que recorre todos los nodos en un camino simple.  Problema: Existe un ciclo simple en G que contenga a todos los vértices? Un posible candidato para este problema puede ser verificado en tiempo polinomial, luego este problema está en la categoría NP. Consideremos el problema del ciclo Hamiltoniano “¿Tiene un grafo G un ciclo Hamiltoniano? (Aquél que recorre todos los nodos en un camino simple) Un posible candidato para este problema puede ser verificado en tiempo polinomial, luego este problema está en la categoría NP. Ejemplo:
  • 9. “Análisis de Algoritmos” 9 2. Vendedor Viajero: Recorrer todos los vértices de manera que el costo sea mínimo. No se debe pasar 2 veces por un mismo vértice. Se debe volver al punto de partida. • Se tiene un grafo completo (todos los arcos) con costos asociados a cada arco. El vendedor desea hacer un “tour” (ciclo hamiltoniano) tal que el costo sea mínimo. Ejemplo: 15 30 20 25 50 45 10 35 40 55 5 4 3 1 2 A F D B C E 4 3 3 5 7 21 9 2 35 1
  • 10. “Análisis de Algoritmos” 3 pasó a tu jefe? ¿De pronto se volvió comprensivo contigo? En realidad los otros parámetros los ha tomado en cuenta como costo directo del programa en cuestión. Esto es en realidad lo que se hace en teoría de complejidad. Para el análisis de complejidad, se considera por lo general la eficiencia sobre el tiempo, para un solo procesador en cómputo secuencial; para cómputo paralelo se considera también el número de procesadores. Los algorimos han sido divididos como buenos o malos algoritmos. La comunidad computacional acepta que un buen algoritmo es aquél para el cual existe un algoritmo polinomial determinístico que lo resuelva. También se acepta que un mal algoritmo es aquel para el cual dicho algoritmo simplemente no existe. Un problema se dice intratable, si es muy difícil que un algoritmo de tiempo no polinomial lo resuelva. No obstante, esta clasificación de algoritmos en buenos y malos puede resultar a veces engañosa, ya que se podría pensar que los algoritmos exponenciales no son de utilidad práctica y que habrá que utilizar solamente algoritmos polinomiales. Sin embargo se tiene el caso de los métodos simplex y Branch and Bound, los cuales son muy eficientes para muchos problemas prácticos. Desafortunadamente ejemplos como estos dos son raros, de modo que es preferible seguir empleando como regla de clasificación en buenos y malos algoritmos, la que lo hace dependiendo de si son o no polinomiales; todo esto con la prudencia necesaria. Problemas de Decisión Aquí hemos hablado de problemas de optimización como aquél donde buscamos el máximo o el mínimo de una función donde existen o no un conjunto de restricciones. Sin embargo, un problema de optimización combinatoria puede también ser formulado de manera más relajada como sigue: Dado un problema de optimización, podemos encontrar el costo de la solución óptima. Se sabe que dado un problema de optimización, se puede definir un problema de decisión asociado a él, esto es, una pregunta que puede ser contestada por si o no. Por otro lado, varios problemas computacionales bien conocidos son problemas de decisión. Entre los problemas de decisión se pueden mencionar por ejemplo:  El problema de paro (Halting Problem): dado un algoritmo y su entrada, ¿Parará éste alguna vez?  El problema de satisfactibilidad: dada una fórmula booleana, ¿Es ésta satisfactible?  El problema del circuito Hamiltoniano: dado un grafo G, ¿Hay un circuito en G que visite todos los nodos exactamente una vez?. La definición de problema de decisión a partir del problema de optimización permite estudiar ambos tipos de problemas de una manera uniforme. Además, como se ha puntualizado que un problema de decisión no es más difícil que el problema de optimización original, cualquier resultado negativo probado sobre la complejidad del problema de decisión será aplicable al problema de optimización también.