Este documento trata sobre la programación dinámica. Explica que la programación dinámica es un método para resolver problemas dividiéndolos en subproblemas superpuestos y encontrando soluciones óptimas recursivamente. También describe algunos problemas como el problema de la diligencia y el problema del vendedor viajero que pueden resolverse usando programación dinámica.
IPERC Y ATS - SEGURIDAD INDUSTRIAL PARA TODA EMPRESA
Programación dinámica y árboles binarios de búsqueda
1. República Bolivariana de Venezuela
Ministerio de Poder Popular para la Educación Universitaria
Instituto Universitario Politécnico “Santiago Mariño”
Extensión Caracas
Programación no numérica II
Programación Dinámica
Autor:
Rubén González C.I.: 17.269.058 Escuela: 47
Caracas, julio de 2020
2. Introducción
Una subestructura óptima significa que se pueden usar soluciones óptimas de subproblemas
para encontrar la solución óptima del problema en su conjunto. Por ejemplo, el camino más corto
entre dos vértices de un Grafo se puede encontrar calculando primero el camino más corto al
objetivo desde todos los vértices adyacentes al de partida, y después usando estas soluciones
para elegir el mejor camino de todos ellos. En general, se pueden resolver problemas con
subestructuras óptimas siguiendo estos tres pasos:
•Dividir el problema en subproblemas más pequeños.
•Resolver estos problemas de manera óptima usando este proceso de tres pasos recursivamente.
•Usar estas soluciones óptimas para construir una solución óptima al problema original.
Los subproblemas se resuelven a su vez dividiéndolos en subproblemas más pequeños hasta
que se alcance el caso fácil, donde la solución al problema es trivial.
3. Decir que un problema tiene subproblemas superpuestos es decir que se usa un mismo
subproblema para resolver diferentes problemas mayores. Por ejemplo, en la Sucesión de
Fibonacci (F3 = F1 + F2 y F4 = F2 + F3) calcular cada término supone calcular F2. Como para
calcular F5 hacen falta tanto F3 como F4, una mala implementación para calcular F5 acabará
calculando F2 dos o más veces. Esto sucede siempre que haya subproblemas superpuestos: una
mala implementación puede acabar desperdiciando tiempo recalculando las soluciones óptimas a
subproblemas que ya han sido resueltos anteriormente.
Esto se puede evitar guardando las soluciones que ya hemos calculado. Entonces, si
necesitamos resolver el mismo problema más tarde, podemos obtener la solución de la lista de
soluciones calculadas y reutilizarla. Este acercamiento al problema se llama Memorización (en
inglés "Memorization"). Si estamos seguros de que no volveremos a necesitar una solución en
concreto, la podemos descartar para ahorrar espacio. En algunos casos, podemos calcular las
soluciones a problemas que de antemano sabemos que vamos a necesitar.
4. Es ligeramente mejor en consumo de espacio y llamadas a funciones, pero a
veces resulta poco intuitivo encontrar todos los subproblemas necesarios para
resolver un problema dado.
Originalmente, el término de programación dinámica se refería a la resolución
de ciertos problemas y operaciones fuera del ámbito de la Ingeniería Informática,
al igual que hacía la Programación lineal. Aquel contexto no tiene relación con la
Programación en absoluto; el nombre es una coincidencia. El término también lo
usó en los años 40 Richard Bellman, un matemático norteamericano, para
describir el proceso de resolución de problemas donde hace falta calcular la mejor
solución consecutivamente.
5. Programación dinámica
En informática, la programación dinámica es un método para reducir el tiempo de ejecución de
un algoritmo mediante la utilización de subproblemas superpuestos y subestructuras óptimas
La programación dinámica es una técnica matemática que se utiliza para la solución de
problemas matemáticos seleccionados, en los cuales se toma un serie de decisiones en forma
secuencial. Proporciona un procedimiento sistemático para encontrar la combinación de decisiones
que maximice la efectividad total, al descomponer el problema en etapas, las que pueden ser
completadas por una o más formas (estados), y enlazando cada etapa a través de cálculos
recursivos.
• Etapa: es la parte del problema que posee un conjunto de alternativas mutuamente excluyentes,
de las cuales se seleccionará la mejor alternativa.
• Estado: es el que refleja la condición o estado de las restricciones que enlazan las etapas.
Representa la “liga” entre etapas de tal manera que cuando cada etapa se optimiza por
separado la decisión resultante es automáticamente factible para el problema completo.
6. Esquema de una etapa
qi Variable de estado en la
etapa i
Xij Uno de los valores que
puede adoptar la variable
de decisión “Xi” en la
etapa i
Xi * Decisión óptima de la
etapa i
7. Fórmula y solución de problemas
La programación dinámica no cuenta con una formulación matemática estándar, sino que se trata
de un enfoque de tipo general para la solución de problemas, y las ecuaciones específicas que se
usan se deben desarrollar para que representen cada situación individual.
Comúnmente resuelve el problema por etapas, en donde cada etapa interviene exactamente una
variable de optimización (u optimizadora)
La teoría unificadora fundamental de la programación dinámica es el Principio de Optimalidad,
que nos indica básicamente como se puede resolver un problema adecuadamente descompuesto
en etapas utilizando cálculos recursivos.
“Una política óptima tiene la propiedad de que, independientemente de las decisiones tomadas
para llegar a un estado particular, en una etapa particular, las decisiones restantes deben constituir
una política óptima para abandonar ese estado”.
8. Para resolver problemas de programación dinámica se necesita:
• Un grado de creatividad
• Un buen conocimiento de la estructura general de los problemas de programación dinámica para
reconocer cuando un problema se puede resolver por medio de estos procedimientos y como
esto se puede llevar a cabo.
Características de los problemas de programación dinámica
• El problema se puede dividir en etapas que requieren una política de decisión en cada una.
• Cada etapa tiene cierto número de estados asociados a ella.
• El efecto de la política de decisión en cada etapa es transformar el estado actual en un estado
asociado con la siguiente etapa.
• El procedimiento de solución esta diseñado para encontrar una política óptima para el problema
completo.
• Dado un estado actual, una política óptima para las etapas restantes es independiente de la
política adoptada en las etapas anteriores (principio de optimalidad).
9. • El procedimiento de solución se inicia al encontrar la política optima para la ultima etapa.
• Se dispone de una relación recursiva que identifica la política optima par la etapa n dada la
política optima para la etapa (n+1)
Recursividad
Existen dos formas de plantear la fórmula de recursividad en los problemas de programación
dinámica:
• Recursividad de Retroceso: el problema se resuelva partiendo de la última etapa hacia la
primera.
• Recursividad de Avance: el problema se resuelve partiendo de la primera etapa hacia la última.
10. Las formulaciones de avance y retroceso son en realidad equivalentes en términos de cálculo.
Sin embargo, hay situaciones donde habría alguna diferencia, en la eficiencia del cálculo, según la
formulación que se utilice. Esto sucede en particular en problemas donde intervine la toma de
decisiones conforme transcurre el tiempo. En esto caso las etapas se designan con base en el
estricto orden cronológico de los periodos que ellas representan y la eficiencia de los cálculos
dependerá de si se utiliza formulación de avance o retroceso.
11. EL PROBLEMA DE LA DILIGENCIA
Un caza fortunas de Missouri decide irse al oeste a unirse a la fiebre del oro en California . Tiene
que hacer el viaje en diligencia a través de territorios sin ley donde existían serios peligros de ser
atacados por merodeadores. Aún cuando su punto de partida y destino eran fijos, tenia muchas
opciones en cuanto a que estados debía elegir como puntos intermedios. Se desea estimar la ruta
mas segura , como el costo de la póliza para cualquier jornada de la diligencia esta basada en una
evaluación de seguridad del recorrido, la ruta mas segura debe ser aquella que tenga el costo total
mas barato.
¿Cuál es la ruta que minimiza el costo total de la póliza ?
13. Solución
• Los cálculos se realizan en etapas dividiendo el problema en subproblemas.
• Después, se considera por separado cada subproblema con el fin de reducir el número de
operaciones de cálculo.
• Se comienza con una pequeña porción del problema original y se encuentra la solución optima.
• Luego, se agranda gradualmente el problema y se encuentra la solución óptima actual a partir
de la que le precede , hasta resolver el problema original completo.
• En cada problema aumentado se puede encontrar la solución óptima tomando en cuenta los
resultados obtenidos en la interacción anterior.
14. Arboles Binarios
Un árbol impone una estructura jerárquica sobre una colección de objetos. Ejemplos claros de
utilización de árboles se presentan tanto dentro como fuera del área de computación (índices de
libros, árboles genealógicos, etc.); en Informática constituyen una de las estructuras más utilizadas,
con aplicaciones que van desde los árboles sintácticos utilizados para la representación y/o
interpretación de términos de un lenguaje o expresiones aritméticas, pasando por los arboles de
activación de procedimientos recursivos, hasta la representación de datos que se desea mantener
ordenados con un tiempo de acceso relativamente bajo. En general, se usarán árboles siempre que
se quiera representar información jerarquizada, cuando esta converja en un solo punto.
¿Qué es un árbol binario de búsqueda?
Un árbol binario no es más que una estructura de datos cuyos nodos pueden tener un hijo a la
izquierda o a la derecha ( no más de 2). Por lo tanto un árbol binario de búsqueda no es más que
un tipo de árbol binario cuya estructura de árbol se representa en informática.
15. Estos árboles pueden realizar operaciones de:
• Búsqueda : La búsqueda en un árbol binario de búsqueda consiste en acceder a la raíz del
árbol, si el elemento a localizar coincide con éste la búsqueda ha concluido con éxito, si el elemento
es menor se busca en el subárbol izquierdo y si es mayor en el derecho. Si se alcanza un nodo hoja
y el elemento no ha sido encontrado es que no existe en el árbol. Estas búsquedas son bastantes
eficientes teniendo un máximo de comparaciones en el rango de [log2(N+1)] y N
• Insertado: La inserción es similar a la búsqueda y se puede dar una solución tanto iterativa como
recursiva. Si tenemos inicialmente como parámetro un árbol vacío se crea un nuevo nodo como
único contenido el elemento a insertar. Si no lo está, se comprueba si el elemento dado es menor
que la raíz del árbol inicial con lo que se inserta en el subárbol izquierdo y si es mayor se inserta en
el subárbol derecho.
• Borrado: esta operación es más compleja y hay que tener en cuenta a borrar un nodo hija o
padre el impacto que tendrá en la estructura del mismo.
16. Árboles de búsqueda binario óptimos
Si no vamos a modificar un árbol de búsqueda, y sabemos exactamente con qué frecuencia cada
artículo será accesible, podemos construir un árbol binario de búsqueda óptimo, que es un árbol de
búsqueda donde el coste medio de buscar un artículo (el esperado coste de búsqueda) se reduce al
mínimo.
Incluso si sólo tenemos estimaciones de los costos de búsqueda, este sistema puede acelerar
considerablemente las búsquedas en promedio.
17. El Problema del Vendedor Viajero
Consiste en encontrar el circuito óptimo (en términos del viaje más corto) que deberá seguir un
vendedor en un caso con n ciudades, en el que cada ciudad se visita exactamente una vez.
Básicamente es una adaptación del Problema de Asignación que considera restricciones
adicionales que garantiza la exclusión de subcircuitos en la solución óptima.
Podemos considerar esto como una explicación:
Eres vendedor y tienes que visitar varias ciudades de una sola vez. Digamos que unas 100,
porque eres un vendedor muy ambicioso. ¿Ahora cómo vas a hacer eso? ¿Cuál es la ruta más
corta que puede tomar entre esas 100 ciudades
18. En realidad es un problema realmente difícil de resolver, casi imposible. Los informáticos lo
llaman un problema NP-complejo. El Problema del Vendedor Viajero se vuelve exponencialmente
más difícil de resolver a mayor cantidad de puntos, o ciudades, que el vendedor debe visitar.
Ahora bien, si pensabas que el TSP era difícil, considera esto: ¿qué pasaría si no fuera solo un
vendedor para el que necesitaras planificar las rutas? ¿Qué pasa si tienes varios vendedores, un
equipo completo de ellos? Ese es un enigma aún más desafiante conocido como el problema de
enrutamiento de vehículos (VRP, por sus siglas en inglés): el tema de la tesis de mi compañero.
Por qué el vendedor viajero es importante
Mientras trabajamos nerviosamente en todo este problema de enrutamiento de vendedores
viajeros, tal vez estés pensando: ¿por qué debería importarme? Bueno, porque los TSP y los VRP
están a tu alrededor. El problema en realidad se manifiesta con bastante claridad en la vida
cotidiana.
¿Los mensajeros que entregan paquetes a su oficina?
¿Los camiones de reparto que te traen productos frescos de la tienda?
¿Los autobuses escolares que recogen y dejan a sus hijos?
19. Camina alrededor de tu ciudad y verás a personas y vehículos lidiando con una situación de TSP
o VRP. Lo que es fascinante de todo esto es lo crítico que es resolver el TSP y el VRP para el
movimiento de bienes y servicios de un lugar a otro, y otro, y otro.
Esto se vuelve especialmente crítico en áreas urbanas densas, donde el espacio es escaso y el
tiempo incluso más estricto. Las empresas que invierten en algoritmos de optimización de rutas han
informado de hasta un 40% de ahorro en lo que respecta al tiempo de conducción y los costos de
combustible.
No es de extrañar que los matemáticos hayan trabajado para resolver el problema de los
vendedores itinerantes y el enrutamiento de vehículos durante siglos.
El Problema del Vendedor Viajero es un hombre muy, pero muy viejo
El TSP fue matemáticamente formulado por primera vez en 1800, por el matemático irlandés Sir
William Rowan Hamilton y por el matemático británico Thomas Penyngton Kirkman. Más tarde, en
la década de 1930, TSP fue notablemente estudiado por el matemático Karl Menger en Viena y
Harvard, y luego promovido por Hassler Whitney y Merrill Flood en la Universidad de Princeton.
20. A lo largo de los años, los informáticos y programadores han abordado el TSP y el VRP, lo que ha
llevado a soluciones nuevas y mejoradas.
Si está investigando la historia, la Universidad de Waterloo tiene un sitio web fantástico que
profundiza en la historia de TSP y alberga una gran colección de casos de uso de TSP modernos,
incluidos los récords mundiales de TSP y los juegos inspirados en TSP, muy interesante, ¿no?.
El Problema del Vendedor Viajero está en todas partes
El TSP y el VRP pueden parecer aplicables únicamente al transporte y la logística, pero lo
desafío a que mire alrededor de su ciudad y encuentre más ejemplos.
En mi experiencia, el Problema del Viajero Vendedor ha surgido cuando menos lo esperaba. Hay
espacio para la optimización en muchas situaciones: desde encontrar belleza en el arte de TSP; a
personas ocupadas con muchos recados para correr; a fanáticos Pokémon enloquecidos que
necesitan una forma inteligente de llegar a cada Pokéstop de la ciudad.
The Traveling Salesman está en todas partes, amigos. Y con las empresas de entregas cada vez
más populares, parece que está aquí para quedarse.
21. Conclusión
Un problema de optimización que se pueda dividir en etapas y que sea dinámico en el tiempo
puede resolverse por programación dinámica. Las soluciones se pueden ver de manera parcial.
Si es posible se validan los resultados usando otros métodos de solución como programación
lineal, no lineal, entera o teoría de redes.
La Programación Dinámica es una técnica que permite la optimización de soluciones a
problemas adaptandandolos a la metodología divide y vencerás, fraccionando el problema en
subproblemas y solucionando a cada uno de ellos mediante el uso de la recursividad para luego
combinar estas soluciones parciales para obtener la solución al problema. Cabe destacar que
para que un problema se pueda resolver mediante la Programación Dinámica debe cumplir ciertas
características para que pueda ser tratado como así. Conviene resaltar que a diferencia de la
programación lineal, el modelado de problemas de programación dinámica no tiene una forma
estándar. Así, para cada problema es necesario especificar cada uno de los componentes que
caracterizan un problema de programación dinámica.
22. Sin embargo un aspecto realmente destacable es la posibilidad de amplio campo de aplicación
que posee la programación dinámica, que desde un turista queriendo viajar o la posibilidad de
combinar objetos de una mochila para ahorrar espacio o también la planificación de programación
de producción e inventarios y sin olvidarse de la gran importancia que posee la “Programación
Dinámica” en la informática.