Documentos de Académico
Documentos de Profesional
Documentos de Cultura
03 Analisis de La Progracion Dinamica1
03 Analisis de La Progracion Dinamica1
1. INTRODUCCION
Existe una serie de problemas cuyas soluciones pueden ser expresadas recursivamente en
términos matemáticos, y posiblemente la manera más natural de resolverlos es mediante
un algoritmo recursivo. Sin embargo, el tiempo de ejecución de la solución recursiva,
normalmente de orden exponencial y por tanto impracticable, puede mejorarse
substancialmente mediante la Programación Dinámica.
En estos casos es cuando la Programación Dinámica nos puede ofrecer una solución
aceptable. La eficiencia de esta técnica consiste en resolver los subproblemas una sola
vez, guardando sus soluciones en una tabla para su futura utilización.
La Programación Dinámica no sólo tiene sentido aplicarla por razones de eficiencia, sino
porque además presenta un método capaz de resolver de manera eficiente problemas cuya
solución ha sido abordada por otras técnicas y ha fracasado.
2. PROGRAMACION DIMANICA
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 una 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.
Dentro de un modelo de PD se pueden identificar tres elementos importantes, que son: las etapas,
las alternativas en cada etapa y los estados para cada etapa. De estos tres elementos, el más
importante es la definición de estado.
El estado del sistema se considera como la información que une cada etapa, de tal manera que se
puedan tomar decisiones óptimas para las etapas restantes reexaminando la forma en la cual se
llegó a las decisiones para las etapas previas.
Cuando hablamos de optimizar nos referimos a buscar alguna de las mejores soluciones de entre
muchas alternativas posibles. Dicho proceso de optimización puede ser visto como una secuencia
de decisiones que nos proporcionan la solución correcta. Si, dada una subsecuencia de decisiones,
siempre se conoce cuál es la decisión que debe tomarse a continuación para obtener la secuencia
óptima, el problema es elemental y se resuelve trivialmente tomando una decisión detrás de otra,
lo que se conoce como estrategia voraz. En otros casos, aunque no sea posible aplicar la estrategia
voraz, se cumple el principio de optimalidad de Bellman que dicta que dada una secuencia óptima
de decisiones, toda subsecuencia de ella es, a su vez, óptima.
En este caso sigue siendo posible el ir tomando decisiones elementales, en la confianza de que la
combinación de ellas seguirá siendo óptima, pero será entonces necesario explorar muchas
secuencias de decisiones para dar con la correcta, siendo aquí donde interviene la programación
dinámica.
5. SUBESTRUCTURA OPTIMA
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:
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. Decir que un problema tiene
subproblemas superpuestos es decir que se usa un mismo subproblema para resolver diferentes
problemas mayores.
calcular F . Como para calcular F hacen falta tanto F como F , una mala implementación para
2 5 3 4
Esto sucede siempre que haya subproblemas superpuestos: una mala implementación puede
acabar desperdiciando tiempo recalculando las soluciones óptimas a problemas 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 memoización (no confundir con
memorización; en inglés es llamado memoization, véase en).
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.
Subproblemas superpuestos
Subestructuras óptimas
Memorización
Bottom-up: Todos los problemas que puedan ser necesarios se resuelven de antemano y
después se usan para resolver las soluciones a problemas mayores. Este enfoque 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.
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.
Para que un problema pueda ser abordado por esta técnica ha de cumplir dos condiciones:
La solución al problema ha de ser alcanzada a través de una secuencia de decisiones, una
en cada etapa
Dicha secuencia de decisiones ha de cumplir el principio de optimalizad.
Si se llama a fib(5), se produce un árbol de llamadas que contendrá funciones con los mismos
parámetros varias veces:
En particular, fib(2) se calcula dos veces. En ejemplos mayores, se recalculan muchos otros
valores de fib, o subproblemas.
Así, rellenaríamos una tabla con los resultados de los distintos subproblemas, para
reutilizarlos cuando haga falta en lugar de volver a calcularlos. La tabla resultante sería
una tabla unidimensional con los resultados desde 0 hasta n.
Para evitar calcular lo mismo varias veces: Cuando se calcula una solución, ésta se almacena.
Antes de realizar una llamada recursiva para un sub-problema, se comprueba si la solución ha
sido obtenida previamente: Si no ha sido obtenida, se hace la llamada recursiva y, antes de
devolver la solución, ésta se almacena. Si ya ha sido previamente calculada, se recupera la
solución directamente (no hace falta calcularla). Usualmente, se utiliza una matriz que se rellena
conforme las soluciones a los conforme las soluciones a los sub-problemas sub-problemas son
calculados.
La programación dinámica se adapta bien a problemas de carácter secuencial como por ejemplo:
import java.util.*;
class shopping{
public static void imprimir(int arr[][]){
for(int i=0 ; i<arr.length;i++){
for(int j=0;j<arr[i].length;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
El problema de un viaje
Se va a realizar un viaje desde la ciudad A hasta la ciudad J. No hay un camino directo, pero
existen varias opciones para llegar a J a partir de A, pasando por otras ciudades. Esas opciones y
los costos asociados a cada tramo del viaje don dados en el diagrama.
El objetivo es realizar el viaje de A a J con el menor costo posible. Por ejemplo la ruta ADFHI
tiene un costo de 29. Analizar todas las trayectorias no es una técnica satisfactoria. Este problema
tiene un total de 125 posibles rutas.
No sabemos “a priori “si la trayectoria óptima pasará por H o por I. Pero sabemos que si pasa por
H tendrá su costo es incrementado en 7 para llegar hasta J. Así mismo, pasando por I su costo será
incrementado en 5.
Si pasa por E, podría ir vía H y ese recorrido cuesta 6+7=13, o vía I, lo que cuesta
9+5=14. Está claro que si la trayectoria óptima pasa por E, el camino óptimo de ahí en
adelante es EHJ, de costo 13. Marcamos esos costos en el diagrama.
Si la trayectoria óptima pasa por F, es indiferente seguir FHJ o FIJ, ya que ambas
opciones tienen un costo de 17
Si la trayectoria óptima pasa por G, no hay otras opciones, el único camino posible es
GIJ, con costo de 8
Así, si la trayectoria óptima pasa por E, F, G los costos mínimos de cada uno de esos puntos hasta
J ya son conocidos.
De igual forma podemos calcular los costos si la trayectoria óptima pasa por B, C,D.
A partir de B la mejor decisión es viajar a E con un costo de 21 hasta alcanzar J
A partir de C, la mejor opción es viajar a G
A partir de D, la mejor es ir hacia G
Así, como a cada paso ya habíamos seleccionado la mejor opción sabemos que la trayectoria
óptima pasa por ACGIJ y que su costo es de 20
Los instantes en que se inicia o termina un viaje son las etapas, en nuestro problema
tenemos 5 etapas. Formalmente, la etapa es una variable discreta. Normalmente llamada
“k“
En cada etapa el viajero se encuentra en una ciudad, que representa el estado del viajero.
Formalmente, el estado es una variable ( “ X “ ) que describe completamente el sistema
en una etapa dada. X(k)
Para ocupar un nuevo estado en la etapa siguiente, el viajero tiene que tomar una decisión:
viajar a la siguiente ciudad. La decisión es una variable ( normalmente denominada por
u(k) )
Solo algunas ciudades pueden ser alcanzadas en una determinada etapa k. Estas ciudades
forman el conjunto de estados viables que X(k) puede asumir en la etapa k. En el ejemplo,
en la etapa k=2, los estados viables son E, F,G.
Dado un determinado estado del sistema x(k), existe un conjunto de decisiones admisibles
que pueden ser tomadas a partir de x(k). Por ejemplo, a partir de x(1) = D, el conjunto de
decisiones admisibles es ir hacia F o hacia G. Aunque E sea un estado viable en k=2, no
puede ser alcanzado a partir de D. Por lo tanto la decisión “ir para E” no es admisible.
La ecuación recursiva del sistema, o ecuación de transición de estado describe la relación entre el
estado en una etapa dada, la decisión entonces aplicada y el nuevo estado resultante
El estado inicial del sistema es la condición en que el sistema se encuentra en la etapa inicial . Ese
es un estado único
x(0) = {x(0}
Encontrar, si existe, una política admisible que aplicada al estado inicial, lleva el sistema a la
etapa final optimizando (maximizando o minimizando) la función objetivo.
Se observa que, si existe alguna política admisible, entonces existe una política óptima, ya que el
número de políticas admisibles no puede ser infinito.
el espacio de estados.
1 embalse 20 2
= 400 estados
2 embalse 20 4
= 160000 estados
3 embalse 20 6
= 64 millones de estados
4 embalse 20 8
= 25000 millones de estados
5 embalse 20 10
= 10 billones de estados
Por ello, se han utilizado algunas técnicas fundamentadas en la PD tales como el Método de
Aproximaciones Sucesivas [3.8], Programación Dinámica Discreta Diferencial [3.2], [3.3]. De
acuerdo con Yakowitz (1982), “las mayores soluciones numéricas de programación dinámica
estocástica en el contexto, o fuera, de la literatura de recursos hidráulicos por nosotros conocida,
son para problemas que tienen como máximo dos o tres variables de estado. Así mismo, los
autores que relatan sus resultados, a menudo destacan la ferocidad del esfuerzo computacional. “
Las últimas dos técnicas aplicadas a la operación de embalses y reportadas como las más
eficientes son: Programación Dinámica Diferencial, y el Algoritmo de Optimalidad Progresiva
Sin embargo requieren que la función objetivo sea diferenciable y de restricciones lineales.
La otra técnica reportada es la PD de Estados Binarios, técnica que propone, al igual que la otras
mencionadas, una nueva aproximación comenzando con una trayectoria de prueba, pero busca
una mejora de la función objetivo con el menor número de evaluaciones, meta que se logra gracias
a que cada combinación está formada por sólo dos valores por coordenada del espacio de estados.
Así, se logra una reducción significativa del tamaño de memoria requerido para la solución del
problema, lo mismo que la disminución de los tiempos de convergencia.
14. CONCLUSIONES
BIBLIOGRAFIA