11 Programacion Dinamica
11 Programacion Dinamica
11 Programacion Dinamica
1. Método general.
2. Análisis de tiempos de ejecución.
3. Ejemplos de aplicación.
3.1. Problema del cambio de monedas.
3.2. Conteo de frases.
3.3. Problema de la mochila 0/1.
3.4. Multiplicación encadenada de matrices.
1
Mé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.
2
Método general
• Ejemplo. Cálculo de los números de Fibonacci.
• Con método recursivo
Fibonacci (n: integer)
Si n<2 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)
T[0] = 0; T[1] = 1
para i = 2,3, ...,n
T[i] = T[i-1] + T[i-2]
Devolver T[n]
– 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).
3
Método general
4
Método general
• La programación dinámica en problemas de optimización 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
5
Método general
6
Análisis de tiempos de ejecución
• El tiempo de ejecución depende de las características
concretas del problema a resolver.
• Fórmula:
13
Conteo de frases
• “coincide” devuelve 1 si la palabra pal se encuentra en la
cadena a partir de la posición pos.
• Caso base: NF(n+1)=1
• Sólo es necesaria tabla de tamaño n.
• Para recomponer las
Frases una tabla (nxnpal):
14
Problema 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 (xi=1) o nada (xi=0).
Casos base:
• Si (i<0) o (m<0) entonces no hay solución: Mochila (i, m) = -
• En otro caso, si (i=0) ó (m=0) la solución es no incluir ningún objeto:
Mochila (i, m) = 0
18
Multiplicación encadenada de matrices
• Supongamos que tenemos las matrices M1, M2, ..., Mn, que
queremos multiplicar:
M = M1 x M2 x ... x Mn
19
Multiplicació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 = 13·5·89 + 13·89·3 + 13·3·34
– (AB)(CD) “ 54.201
– (A(BC))D “ 2.856 = 5·89·3 + 13·5·3 + 13·3·34
– A((BC)D) “ 4.055
– A(B(CD)) “ 26.418
20
Multiplicación encadenada de matrices
• Si n=1 ó n=2, T(n) = 1.
• Si n>2, entonces podemos realizar la primera multiplicación por n-1
sitios distintos: (M1M2 ... Mi)(Mi+1Mi+2... Mn)
• T(n) = T(i)·T(n-i)
i=1..n-1
21
Multiplicació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) = d[i-1]·d[i]·d[i+1]. 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 ik<j:
(Mi x ... x Mk)x(Mk+1 x ... X Mj)
• El resultado será el valor mínimo:
NMulti(i, j) = min (NMulti(i, k) + NMulti(k+1, j) + d[i-1]·d[k]·d[j])
ik<j
Mejork j= 1 2 3 4
i=1 - 1 1 3
2 - 2 3
3 - 3
4 -
24