Title: Programacin dinmica
1Programación dinámica
- 5.1. Método general.
- 5.2. Análisis de tiempos de ejecución.
- 5.3. Ejemplos de aplicación.
- 5.3.1. Problema del cambio de monedas.
- 5.3.2. Problema de la mochila 0/1.
- 5.3.3. Multiplicación encadenada de matrices.
2Método general
- La programación dinámica se suele utilizar en
problemas de optimización, donde una solución
está formada por una serie de decisiones. - Igual que la técnica divide y vencerás, resuelve
el problema original combinando las soluciones
para subproblemas más pequeños. - Sin embargo, la programación dinámica no utiliza
recursividad, sino que almacena los resultados de
los subproblemas en una tabla, calculando primero
las soluciones para los problemas pequeños. - Con esto se pretende evitar la repetición de
cálculos para problemas más pequeños.
3Método general
- Ejemplo. Cálculo de los números de Fibonacci.
- Con método recursivo
- Fibonacci (n integer)
- Si nlt2 Devolver 1
- Sino Devolver Fibonacci (n-1)
Fibonacci (n-2) - Problema Muchos cálculos están repetidos, tiempo
de ejec. exponencial. - Solución Calcular los valores de menor a mayor
empezando por 0, e ir guardando los resultados en
una tabla. - Con programación dinámica.
- Fibonacci (n integer)
- T0 0 T1 1
- para i 2,3, ...,n
- Ti Ti-1 Ti-2
- Devolver Tn
- Se utiliza la misma fórmula que en la versión
anterior, pero de forma más inteligente. El
tiempo de ejecución es ?(n).
4Método general
- Los algoritmos divide y vencerás están dentro de
los métodos descendentes. - Empezar con el problema original y descomponer en
pasos sucesivos en problemas de menor tamaño. - Partiendo del problema grande, descendemos hacia
problemas más sencillos. - La programación dinámica, por el contrario, es un
método ascendente - Resolvemos primero los problemas pequeños
(guardando las soluciones en una tabla) y después
vamos combinando para resolver los problemas más
grandes.
5Método general
- La programación dinámica se basa en el Principio
de Optimalidad de Bellman cualquier subsecuencia
de una secuencia óptima debe ser, a su vez, una
secuencia óptima. - Para cada problema deberíamos comprobar si es
aplicable el principio de optimalidad. - Ejemplo.
- 2 B 9
- A D
- 3 C 7
- Camino óptimo de A a D A-C-D, de longitud 10
- Camino óptimo de A al siguiente nivel A-B, de
longitud 2, y después B-D de longitud 9. Total
A-B-D, de longitud 11 - Cumple el Principio de Optimalidad?
6Método general
- Aspectos a definir en un algoritmo de
programación dinámica - Ecuación recurrente, para calcular la solución de
los problemas grandes en función de los problemas
más pequeños. - Determinar los casos base.
- Definir las tablas utilizadas por el algoritmo, y
cómo son rellenadas. - Cómo se recompone la solución global a partir de
los valores de las tablas.
7Análisis de tiempos de ejecución
- El tiempo de ejecución depende de las
características concretas del problema a
resolver. - En general, será de la forma
- Tamaño de la tablaTiempo de rellenar cada
elemento de la tabla. - Un aspecto importante de los algoritmos de
programación dinámica es que necesitan una tabla
para almacenar los resultados parciales, que
puede ocupar mucha memoria. - Además, algunos de estos cálculos pueden ser
innecesarios.
8Problema del cambio de monedas
- Problema Dado un conjunto de n tipos de monedas,
cada una con valor ci, y dada una cantidad P,
encontrar el número mínimo de monedas que tenemos
que usar para obtener esa cantidad. - El algoritmo voraz es muy eficiente, pero sólo
funciona en un número limitado de casos. - Utilizando programación dinámica
- Definimos el problema en función de problemas más
pequeños. - Determinar los valores de los casos base.
- Definimos las tablas necesarias para almacenar
los resultados de los subproblemas. - Establecemos una forma de rellenar las tablas y
de obtener el resultado.
9Problema del cambio de monedas
- Definición de la ecuación recurrente
- Cambio (i, Q), el problema de calcular el número
mínimo de monedas necesario para devolver una
cantidad Q, usando los i primeros tipos de
monedas (es decir los tipos 1...i). - La solución de Cambio(i, Q) puede que utilice k
monedas de tipo i o puede que no utilice ninguna. - Si no usa ninguna moneda de ese tipo Cambio(i,
Q) Cambio(i - 1, Q) - Si usa k monedas de tipo i Cambio(i, Q)
Cambio(i, Q kci) k - En cualquier caso, el valor será el mínimo
- Cambio(i, Q) mink0,1,...,Q/ci Cambio(i-1,
Q-k ci)k - Casos base Cambio(i, Q)
- Si (i?0) ó (Qlt0) entonces no existe ninguna
solución al problema, y Cambio(i, Q) ?. - En otro caso para cualquier igt0, Cambio(i, 0) 0.
10Problema del cambio de monedas
- Definición de las tablas utilizadas
- Necesitamos almacenar los resultados de todos los
subproblemas. - El problema a resolver será Cambio (n, P).
- Por lo tanto, necesitamos una tabla de nxP, de
enteros, que llamaremos D, siendo Di, j
Cambio(i, j). - Ejemplo. n 3, P 8, c (1, 4, 6)
- Forma de rellenar las tablas
- De arriba hacia abajo y de izquierda a derecha,
aplicar la ecuación de recurrencia - Di, j mink0,1,...,Q/ci D(i-1, Q-k
ci)k
11Problema del cambio de monedas
- Algoritmo.
- Devolver-cambio (P int C array 1..n of int
var D array 1..n, 0..P of int) - para i 1,2,...,n
- Di, 0 0
- para i 1,2,...,n
- para j 1,2,...,P Tener en cuenta si
el valor - Di, j mink0,1,...,Q/ci D(i-1, Q-k
ci)k cae fuera de la tabla - Ejemplo. n 3, P 8, c (1, 4, 6)
- Cuál es el tiempo de ejecución del algoritmo?
- Cómo es en comparación con el algoritmo voraz?
- Dn, P número mínimo de monedas que hay que
usar para devolver la cantidad P.
12Problema del cambio de monedas
- Cómo calcular cuántas monedas de cada tipo deben
usarse, es decir la solución (x1, x2, ..., xn)? - Se usa otra tabla de decisiones tomadas
- Aux
- Algoritmo para obtener una solución
- para in,n-1,...,1
- xiAuxi,P
- PP-xici
- Cuál es el tiempo de ejecución del algoritmo
para obtener la solución? - Es aplicable el principio de optimalidad?
0
1
2
3
4
5
6
7
8
C
1
0
1
2
3
4
5
6
7
8
1
C
4
0
0
0
0
1
1
1
1
2
2
C
6
0
0
0
0
0
0
1
1
0
3
13Problema de la mochila 0/1
- Igual que en el tema anterior, pero los objetos
no se pueden fragmentar en trozos más pequeños. - Problema Tenemos n objetos, cada uno con un peso
(wi) y un beneficio (vi), y una mochila en la que
podemos meter objetos, con una capacidad de peso
máximo M. El objetivo es maximizar el beneficio
de los objetos transportados, donde cada objeto
se puede coger entero (xi1) o nada (xi0). - Definición de la ecuación recurrente
- Sea Mochila (i, m) el problema de la mochila,
considerando sólo los i primeros objetos (de los
n originales) con una capacidad de peso m.
Supondremos que devuelve el valor de beneficio
total ? xava - a1..i
- Podemos definir el problema de forma recurrente,
en función de que se use o no el objeto i.
14Problema de la mochila 0/1
- Definición de la ecuación recurrente
- Si no se usa el objeto i Mochila (i, m)
Mochila (i - 1, m) - Si se usa Mochila (i, m) vi Mochila (i - 1,
m - wi) - Valor óptimo
- Mochila (i, m) max (Mochila (i-1, m), vi
Mochila (i-1, m - wi)) - Casos base
- Si (ilt0) o (mlt0) entonces no hay solución
Mochila (i, m) -? - En otro caso, si (i0) ó (m0) la solución es no
incluir ningún objeto Mochila (i, m) 0 - Definición de las tablas
- La solución del problema original será Mochila
(n, M). - Por lo tanto necesitamos una tabla V array
0..n, 0..M of integer. - Vi, j Beneficio máximo usando los i primeros
objetos y peso j.
15Problema de la mochila 0/1
- Forma de rellenar las tablas
- Inicializar los casos base.
- Para todo i, desde 1 hasta n, y j desde 1 hasta
M, aplicar la ecuación de recurrencia - Vi, j max (Vi - 1, j , Vi - 1, j - wi
vi) - Si j es negativo, entonces Vi, j -?, y el
máximo será el otro término. - Ejemplo. n 3, M 6, w (2, 3, 4), v (1, 2, 5)
- Tiempo de ejecución ?(nM).
16Problema de la mochila 0/1
- Se puede tener una tabla auxiliar de 0/1 para
almacenar las decisiones parciales y recomponer
la solución, o - A partir de la tabla V obtener la solución (x1,
x2, ..., xn) partir de la posición Vn, M y
analizar las decisiones que se tomaron para cada
objeto i. - Si (Vi, j Vi-1, j) entonces la solución no
usa el objeto i, xi 0. - Si (Vi, j Vi-1, j-wi vi) entonces sí se
usa el objeto i, xi 1. - Si (Vi, j Vi-1, j-wi vi) y (Vi, j
Vi-1, j) entonces podemos usar el objeto i o no
(existe más de una solución óptima). - Acabar cuando lleguemos a un i0 ó j0.
- Cuál será el tiempo de recomponer la solución?
- Se cumple el principio de optimalidad?
17Multiplicación encadenada de matrices
- Supongamos que tenemos las matrices M1, M2, ...,
Mn, que queremos multiplicar - M M1 x M2 x ... x Mn
- Puesto que el producto es asociativo, habrá
muchas formas de realizar las multiplicaciones.
Cada colocación de los paréntesis indica un orden
en el que se realizan las operaciones. - Según el orden de las multiplicaciones, el número
de total de multiplicaciones escalares necesarias
puede variar considerablemente. - Sea una matriz A de dimensión pxq y B de qxr,
entonces el producto AxB requiere pqr
multiplicaciones escalares (método clásico).
18Multiplicación encadenada de matrices
- Ejemplo. Sean las matrices A, B, C y D, de
dimensiones A 13x5, B 5x89, C 89x3 y D 3x34.
Podemos multiplicarlas de 5 formas - ((AB)C)D Requiere 10.582 13589 13893
13334 - (AB)(CD) 54.201
- (A(BC))D 2.856 5893 1353
13334 - A((BC)D) 4.055
- A(B(CD)) 26.418
- Objetivo obtener un orden de multiplicación que
minimice el número de multiplicaciones escalares. - Solución sencilla estimar el número de
multiplicaciones necesarias para todas las
ordenaciones posibles. Quedarse con la que tenga
menor valor. - Cuál es el número de ordenaciones posibles, T(n)?
19Multiplicación encadenada de matrices
- Si n1 ó n2, T(n) 1.
- Si ngt2, entonces podemos realizar la primera
multiplicación por n-1 sitios distintos (M1M2
... Mi)(Mi1Mi2... Mn) - T(n) ? T(i)T(n-i)
- i1..n-1
- El valor de T(n) está en ?(4n/n2)
- Para cada ordenación necesita un tiempo de ?(n).
- Esta solución requeriría un tiempo con una cota
inferior de ?(4n/n). - Solución utilizando programación dinámica
- Definimos NMulti (i, j) el número mínimo de
productos escalares necesarios para realizar la
multiplicación entre la matriz i y la j (con i ?
j), es decir Mi x Mi1 x ... x Mj - Suponemos que las dimensiones se almacenan en un
array d0..n, donde la matriz Mi será de
dimensión di-1 x di.
20Multiplicación encadenada de matrices
- Casos base
- Si i j, entonces NMulti(i, j) 0. No
necesitamos realizar ninguna operación. - Si i j-1, entonces NMulti(i, j)
di-1didi1. Sólo existe una forma de
hacer el producto. - Ecuación de recurrencia
- Si no se da ninguno de los casos anteriores,
entonces podemos hacer la primera multiplicación
por una posición k, con i?kltj - (Mi x ... x Mk)x(Mk1 x ... X Mj)
- El resultado será el valor mínimo
- NMulti(i, j) min (NMulti(i, k) NMulti(k1,
j) di-1dkdj) - i?kltj
- Tablas usadas por el algoritmo
- El resultado será NMulti(1, n).
- Necesitamos una posición para cada i, j, con 1 ?
i ? j ? n.
21Multiplicación encadenada de matrices
- Tablas usadas por el algoritmo.
- Sea M una matriz 1..n, 1..n de enteros. El
algoritmo usará la mitad de la matriz.
- Forma de rellenar la tabla.
- Inicializar la matriz. Para todo i, desde 1 hasta
n. Mi, i 0 - Aplicar la ecuación de recurrencia por
diagonales. - Mi, j min (Mi, k Mk1, j
di-1dkdj) - i?kltj
- Ejemplo. n 4, d (10, 20, 50, 1, 100)
22Multiplicación encadenada de matrices
- Cuál es el orden de complejidad de este
algoritmo? - En la posición M1, n tenemos almacenado el
número mínimo de multiplicaciones escalares
necesario (para la ordenación que es óptima).
Necesitamos calcular cuál es esta ordenación
óptima. - Usar una matriz auxiliar Mejork 1..n, 1..n en
la que se almacene el mejor valor de k encontrado
en cada paso durante el cálculo de M (indica cuál
fue el mínimo en cada celda). - En el ejemplo anterior.