Está en la página 1de 18

Año del buen servicio al Ciudadano

Universidad Nacional De San Agustín

Facultad: Producción y Servicios


Escuela Profesional: Ingeniería de Sistemas

Elementos de la Programación Dinámica

Materia: Análisis y Diseño de Algoritmos


Docente: Ing. Carlo Corrales
Integrantes:
Robert, Arce Apaza
Ade Luz, Imata Sumire
Elber Diego, Chalco Choquehuanca
Arequipa – Perú
2017
Análisis de la Programación Dinámica
Elber Diego Chalco Choquehuanca
Adeluz imata Sumire
Robert Arce Apaza
Universidad Nacional San Agustı́n, Arequipa, PERU

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 el diseño Divide y Vencerás veíamos cómo para resolver un problema lo dividíamos


en subproblemas independientes, los cuales se resolvían de manera recursiva para
combinar finalmente las soluciones y así resolver el problema original. El inconveniente
se presenta cuando los subproblemas obtenidos no son independientes sino que existe
solapamiento entre ellos; entonces es cuando una solución recursiva no resulta eficiente
por la repetición de cálculos que conlleva.

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.

Donde tiene mayor aplicación la Programación Dinámica es en la resolución de


problemas de optimización. En este tipo de problemas se pueden presentar distintas
soluciones, cada una con un valor, y lo que se desea es encontrar la solución de valor
óptimo (máximo o mínimo). La solución de problemas mediante esta técnica se basa en
el llamado principio de óptimo enunciado por Bellman en 1957 y que dice: “En una
secuencia de decisiones óptima toda subsecuencia ha de ser también óptima” Hemos de
observar que aunque este principio parece evidente no siempre es aplicable y por tanto es
necesario verificar que se cumple para el problema en cuestión. Un ejemplo claro para el
que no se verifica este principio aparece al tratar de encontrar el camino de coste máximo
entre dos vértices de un grafo ponderado Para que un problema pueda ser aborda do 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 óptimo.En grandes
líneas, el diseño de un algoritmo de Programación Dinámica consta de los
siguientes pasos:
1. Planteamiento de la solución como una sucesión de decisiones y verificación de
que ésta cumple el principio de óptimo.
2. Definición recursiva de la solución.
3. Cálculo del valor de la solución óptima mediante una tabla en donde se almacenan
soluciones a problemas parcia les para reutilizar los cálculos.
4. Construcción de la solución óptima haciendo uso de la información contenida en
la tabla anterior.

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.

3. ELEMENTOS DE LA PROGRAMACON DINAMICA

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.

1. Principio de optimalidad de Bellman


2. Definición recursiva de la solución óptima
3. Cálculo de la solución óptima

4. PRINCIPIO DE OPTIMALIDAD DE BELLMAN

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.

Contemplar un problema como una secuencia de decisiones equivale a dividirlo en problemas


más pequeños y por lo tanto más fáciles de resolver como hacemos en Divide y Vencerás, técnica
similar a la de programación dinámica. La programación dinámica se aplica cuando la subdivisión
de un problema conduce a:

 Una enorme cantidad de problemas.


 Problemas cuyas soluciones parciales se solapan.
 Grupos de problemas de muy distinta complejidad.

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:

1. Dividir el problema en subproblemas más pequeños.


2. Resolver estos problemas de manera óptima usando este proceso de tres pasos
recursivamente.
3. 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. 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 (F = F + F y F = F + F ) calcular cada término supone


3 1 2 4 2 3

calcular F . Como para calcular F hacen falta tanto F como F , una mala implementación para
2 5 3 4

calcular F acabará calculando F dos o más veces.


5 2

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.

En resumen, la programación hace uso de:

 Subproblemas superpuestos
 Subestructuras óptimas
 Memorización

6. LA PROGRAMACIÓN TOMA NORMALMENTE UNO DE LOS DOS SIGUIENTES


ENFOQUES:

 Top-down: El problema se divide en subproblemas, y estos se resuelven recordando las


soluciones por si fueran necesarias nuevamente. Es una combinación de memorización y
recursió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.

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.

Algunos lenguajes de programación funcionales, sobre todo Haskell, pueden usar la


memorización automáticamente sobre funciones con un conjunto concreto de argumentos, para
acelerar su proceso de evaluación. Esto sólo es posible en funciones que no tengan efectos
secundarios, algo que ocurre en Haskell pero no tanto en otros lenguajes.

Una resolución por programación dinámica se puede dividir en:

 caracterización de la estructura de la solución óptima.


 definición recursiva de la solución óptima.
 calculo bottom-up o top-down de las subsoluciones óptimas (implementación).
 construcción de la solución óptima a partir de la información calculada.
7. DISEÑO DE UN ALGORITMO DE PROGRAMACIÓN DINÁMICA

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.

El diseño de un algoritmo de Programación Dinámica consta de los siguientes pasos:

1. Planteamiento de la solución como una sucesión de decisiones y verificación de que ésta


cumple el principio de óptimo.
2. Definición recursiva de la solución.
3. Cálculo del valor de la solución óptima mediante una estructura de datos en donde se
almacenan soluciones a problemas parciales para reutilizar los cálculos.
4. Construcción de la solución óptima haciendo uso de la información contenida en la
estructura de datos.

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.

 Para evitar este inconveniente, se puede resolver el problema mediante programación


dinámica, y en particular, utilizando el enfoque de memorización (guardar los valores que
ya han sido calculados para utilizarlos posteriormente).

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.

7.1 FIBONACCI UTILIZANDO (PROGRAMACIÓN DINÁMICA -BUTTOM-UP)

7.2 FIBONACCI UTILIZANDO (PROGRAMACIÓN DINÁMICA -TOP-DOWN)


8. MEMORIZACION

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.

9. APLICACIONES DE LA PROGRAMACION DINAMICA

La programación dinámica se adapta bien a problemas de carácter secuencial como por ejemplo:

 Búsqueda del camino más corto entre dos puntos.


 Planificación de tareas.
 Gestión de recursos escasos.
 Gestión de stocks.
 Coordinación hidrotérmica

10. EJERCICIO DEL ACM: WEDDING SHOPPING


Pruebas de Entrada
LLENANDO LOS VALORES A LA TABLA
DE MEMORIZACIÓN

Al momento de armar el árbol de recurrencia se


hace una pregunta al método y pregunta si el dato
ingresado esta en memoria, como a un principio
la taba esta vacía esta se llena con el dato
ingresado y pasa al siguiente dato y vuelve a
preguntar.
Mientras que el dato preguntado se encuentre en
memoria esta solo sacara el valor .

COMPILACIÓN DEL CÓDIGO EN JAVA


COMPARACION DE TIEMPOS DE EJECUCIÓN DEL ALGORITMO CON
MEMORIZACION Y SI MEMORIZACIO AMBOS CASOS SON LLAMADOS
RECURSIVAMETE

11. CODIGO FUENTE DEL EJERCICIO: WEDDING SHOPPING

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();
}
}

public static int minimo(int M , int C , int tipos[][]){


int sum=0;
String cu="0";
if(M<0){
return Integer.MAX_VALUE;
}
else if(C==0){
return M;
}else{
int ayuda=Integer.MAX_VALUE;
for(int j=0;j<tipos[C-1].length;j++){
ayuda=(int)(Math.min(minimo(M-tipos[C-1][j],C-
1,tipos),ayuda));
}
return ayuda;
}

public static void main(String args[]){


Scanner scan = new Scanner(System.in);
int N=scan.nextInt();
int [][] tipos=null;
for(int i=0 ; i<N ;i++){
int M=scan.nextInt();
int C=scan.nextInt();
tipos=new int[C][];
for(int j=0;j<tipos.length;j++){
int tipo=scan.nextInt();
tipos[j]=new int[tipo];
for(int m=0;m<tipos[j].length;m++){
tipos[j][m]=scan.nextInt();
}
}
if(minimo(M,C,tipos)>M){
System.out.println("no solution");
}else{
int num=M-minimo(M,C,tipos);
System.out.println(num);
}
}
}
}

12. EJEMPLO DE PROGRAMACION DINAMICA

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.

Este es un problema clásico de Programación Dinámica.

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.

No sabemos si la trayectoria óptima pasará por E, F o G. Pero sabemos que:

 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

Desde el punto de partida, que es un punto obligatorio de paso, podemos viajar a


B, C o D y para cada opción el costo total será:
Vía B 4+21 = 25
Vía C 5+15 = 20
Vía D 3+19 = 22

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 elementos básicos de la PD, son:

 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

f :(x(k), u(k),k) f ( x(k), u(k),k) = x(k+1)

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}

Una política admisible aplicada a partir de x(0) es una secuencia de decisiones:

de tal modo que, si definimos:

x(k+1) = f ( x(k),u(k), k) k = ko,…,N-1


x(k) Є X(k) k= k +1,…,N
0

La función objetivo está dada por:


El estado Terminal es el conjunto x(N). Al contrario del estado inicial que es único, él puede estar
constituido por más de un estado viable.

En general el problema de Programación Dinámica planteado es:

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.

13. EL PROBLEMA DE LA DIMENSIONALIDAD

Según se ha mencionado, la aplicación de la Programación Dinámica convencional en la


optimización de sistemas hidro- térmicos, limita la solución a problemas con hasta unos pocos
embalses, esto debido a lo que se ha denominado como “plaga de dimensionalidad (Excesivas
necesidades de memoria de computadora y tiempo de computación)

La solución de la ecuación de recursiva requiere usualmente la discretización del espacio de


estados. Suponiendo que cada uno de los N volúmenes de los N embalses (N niveles ) y cada una
de las N aportes en la etapa previa A sean discretizados en M intervalos, habrán M estados en
t-1
2N

el espacio de estados.

El número de estados discretizados y, en consecuencia el esfuerzo computacional aumenta


exponencialmente con el número de variables de estado. Esto implica que la solución del
problema es irrealizable aún para sistemas con pocos embalses. Para un estudio en etapas
mensuales es normal analizar 5 años, o sea 5x12= 60, o para etapas semanales para 2 años 2x52=
104, supongamos M=20 etapas

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

La Programación Dinámica es una técnica que permite la optimización de soluciones a problemas


adaptan dándolos 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.

BIBLIOGRAFIA

• Manuel Maurette e Ignacio Ojea, Programación Dinámica, Junio de 2006.


• Bohorquez Jaime y Cardozo Rodrigo, Programación Dinámica, Análisis de Algoritmo 1992.
• Ramos, Andres, Programación dinámica (DP),
Universidad Pontificia Comillas.
• Profesor: Julio Cesar López, Programación Dinámica, Universidad del Valle, 8 de Noviembre
del 2008.
• Goic F. Marcel, Programación Dinámica, Universidad de Chile, Facultad de Ciencias Fıś icas y
Matemáticas, Departamento de Ingenierı́a Indus-
trial.

También podría gustarte