Documentos de Académico
Documentos de Profesional
Documentos de Cultura
6 Dynamic Programming PDF
6 Dynamic Programming PDF
Programacin Dinmica
Introduccin
Elementos de la programacin dinmica
Principio de optimalidad de Bellman
Definicin recursiva de la solucin ptima
Clculo de la solucin ptima
Ejemplos
Multiplicacin encadenada de matrices
Subsecuencia de mayor longitud (LCS)
Seleccin de actividades con pesos
Problema de la mochila
Caminos mnimos: Algoritmos de Floyd y Bellman-
Bellman-Ford
Distancia de edicin
Aplicaciones 1
Programacin Dinmica
Esta tcnica se aplica sobre problemas que presentan
las siguientes caractersticas:
Subproblemas optimales:
optimales: La solucin ptima a un
problema puede ser definida en funcin de soluciones
ptimas a subproblemas de tamao menor.
Programacin Dinmica
Enfoque ascendente (bottom
(bottom--up):
Primero se calculan las soluciones ptimas para
problemas de tamao pequeo.
Luego, utilizando dichas soluciones, encuentra
soluciones a problemas de mayor tamao.
Clave: Memorizacin
Almacenar las soluciones de los subproblemas en
alguna estructura de datos para reutilizarlas
posteriormente. De esa forma, se consigue un
algoritmo ms eficiente que la fuerza bruta, que
resuelve el mismo subproblema una y otra vez.
3
Programacin Dinmica
Memorizacin
Para evitar calcular lo mismo varias veces:
Cuando se calcula una solucin, sta se almacena.
Antes de realizar una llamada recursiva para un
subproblema Q, se comprueba si la solucin ha sido
obtenida previamente:
Si no ha sido obtenida, se hace la llamada recursiva
y, antes de devolver la solucin, sta se almacena.
Si ya ha sido previamente calculada, se recupera la
solucin directamente (no hace falta calcularla).
Usualmente, se utiliza una matriz que se rellena
conforme las soluciones a los subproblemas son
4
calculados (espacio vs. tiempo).
Programacin Dinmica
Uso de la programacin dinmica:
5
Estrategias de diseo
Algoritmos greedy:
Se construye la solucin incrementalmente,
incrementalmente, utilizando
un criterio de optimizacin local.
Programacin dinmica:
dinmica:
Se descompone el problema en subproblemas
solapados y se va construyendo la solucin con las
soluciones de esos subproblemas
subproblemas..
Divide y vencers:
vencers:
Se descompone el problema en subproblemas
independientes y se combinan las soluciones de
esos subproblemas
subproblemas..
6
Principio de Optimalidad
Para poder emplear programacin dinmica, una
secuencia ptima debe cumplir la condicin de que
cada una de sus subsecuencias tambin sea ptima:
7
Principio de Optimalidad
En otras palabras:
Principio de Optimalidad
Un poco de historia: Bellman,
Bellman, aos 50
9
Richard E. Bellman: Eye of the Hurricane: An Autobiography
Principio de Optimalidad
Principio de Optimalidad de Bellman
[Bellman, R.E.: Dynamic Programming. Princeton University Press, 1957]
En Informtica,
Informtica, un problema que puede descomponerse
de esta forma se dice que presenta subestructuras
optimales (la base de los algoritmos greedy y de la
programacin dinmica).
dinmica). 10
Principio de Optimalidad
Principio de Optimalidad de Bellman
[Bellman, R.E.: Dynamic Programming. Princeton University Press, 1957]
Ojo
Ojo!!
El principio de optimalidad no nos dice que,
que,
si tenemos las soluciones ptimas de los subproblemas,
subproblemas,
entonces podamos combinarlas para obtener la solucin
ptima del problema original
11
Principio de Optimalidad
Principio de Optimalidad de Bellman
[Bellman, R.E.: Dynamic Programming. Princeton University Press, 1957]
13
y clculo de la solucin ptima
3. Se calcula el valor de la solucin ptima utilizando un
enfoque ascendente:
Se determina el conjunto de subproblemas que
hay que resolver (el tamao de la tabla).
Se identifican los subproblemas con una
solucin trivial (casos base).
Se van calculando los valores de soluciones
ms complejas a partir de los valores
previamente calculados.
Programacin Dinmica
Ejemplos
Sucesin de Fibonacci fib (n) = fib (n 1) + fib (n 2)
O(n)
Implementacin recursiva: O(
Implementacin usando programacin dinmica: (n)
if (n == 0) return 0;
else if (n == 1) return 1;
else {
previo = 0; actual = 1;
for (i=1; i<n; i++) {
fib = previo + actual;
previo = actual; actual = fib
fib;;
}
return actual;
} 15
Programacin Dinmica
Ejemplos
Nmeros combinatorios:
Combinaciones de n sobre p
n n!
Implementacin inmediata =
p p ! ( n p )!
Implementacin usando programacin dinmica
Tringulo de Pascal
n n 1 n 1
= +
p
p 1 p
16
Programacin Dinmica
Ejemplos
Nmeros combinatorios: n n 1 n 1
Combinaciones de n sobre p = +
p
p 1 p
17
Orden de eficiencia: (np
np))
Programacin Dinmica
Ejemplos
Nmeros combinatorios: n n 1 n 1
Combinaciones de n sobre p = +
p
p 1 p
int combinaciones (int n, int p)
{
for (i=0; i<=n; i++) {
for (j=0; j<=min(
j<=min(i,p
i,p);
); j++
j++)) {
if ((j==0) || (j==i))
c[i][j] = 1
else
c[i][j] = c[i-
c[i-1][j
1][j1]+c[i
1]+c[i-
-1][j];
}
}
return c[n][p];
}
18
Orden de eficiencia: (np
np)) en tiempo, (np
np)) en espacio.
Programacin Dinmica
Ejemplos
Nmeros combinatorios: n n 1 n 1
Combinaciones de n sobre p = +
p
p 1 p
int combinaciones (int n, int p)
{
b[0] = 1;
for (i=1; i<=n; i++) {
b[i] = 1;
for (j=i
(j=i
1; j>0; j
j--
--)
) {
b[j] += b[j 1];
}
}
return b[p];
}
19
Orden de eficiencia: (np
np)) en tiempo, (n) en espacio.
Programacin Dinmica
Devolver el cambio
Existen casos para los que no se puede aplicar el
algoritmo greedy (por ejemplo, devolver 8 peniques
con monedas de 6, 4 y 1 penique).
Programacin Dinmica
Devolver el cambio
0 1 2 3 4 5 6 7 8
{1} 0 1 2 3 4 5 6 7 8
{1,4} 0 1 2 3 1 2 3 4 2
{1,4,6} 0 1 2 3 1 2 1 2 2
m={1,4,6}, C=8
Solucin: 2 monedas, S={4,4}.
21
Programacin Dinmica
Multiplicacin encadenada de matrices
Propiedad asociativa del producto de matrices:
Parentizaciones
Parentizaciones posibles:
1 si n = 1 4n
n 1
P(n) = P(k ) P(n k ) si n > 1 2
k =1
n
22
Programacin Dinmica
Multiplicacin encadenada de matrices
Si cada matriz Ak tiene un tamao pk-1pk,
el nmero de multiplicaciones necesario ser:
A1 x A2 x A3 xx Ak x Ak+1 x Ak+2 x x An
De forma general:
Si ij
j,, entonces
m(i, j ) = min{m(i, k ) + m(k + 1, j ) + pi 1 pk p j }
ik < j
A1 x A2 x A3 xx Ak x Ak+1 x Ak+2 x x An
24
Programacin Dinmica
Multiplicacin encadenada de matrices
Implementacin:
25
Programacin Dinmica
Multiplicacin encadenada de matrices
Implementacin:
for (i=1; i<=n; i++)
m[i,i
m[i,i]] = 0;
Programacin Dinmica
Multiplicacin encadenada de matrices
Implementacin:
MultiplicaCadenaMatrices (A, i, j)
{
if (j>i) {
x = MultplicaCadenaMatrices (A, i, s[s[i,j
i,j]);
]);
y = MultplicaCadenaMatrices (A, s[s[i,j
i,j]+1,
]+1, j);
return MultiplicaMatrices
MultiplicaMatrices(x,
(x, y);
} else {
return A[i];
}
}
27
Programacin Dinmica
Subsecuencia de mayor longitud (LCS)
Problema:
Ejemplo:
Cadenas:
X = (A B C B D A B),
Y = (B D C A B A),
X = ( A B C B D A B )
Y = ( B D C A B A ) 28
Programacin Dinmica
Subsecuencia de mayor longitud (LCS)
Un algoritmo de fuerza bruta comparara cualquier
subsecuencia de X con los smbolos de Y:
Xi Prefijo de X de longitud i.
Yj Prefijo de Y de longitud j.
c(i,j
c(i,j)) Longitud de la LCS para Xi e Yj.
c(i 1, j 1) + 1 si x[i ] = y[ j ]
c(i, j ) =
max{c(i 1, j ), c(i, j 1)} en otro caso
Programacin Dinmica
Subsecuencia de mayor longitud (LCS)
Definicin recursiva de la solucin:
Caso base:
c(0,0) = 0 (Subcadena vaca)
c(0,j) = c(i,0) = 0 (LCS de la cadena vaca
y cualquier otra cadena)
Clculo recursivo:
Primer caso (x[i]=y[j]=s): Se emparejan ambos
smbolos y la LCS aumenta de longitud:
LCS(X
LCS( Xi,Yj)= LCS(Xi-1,Yj-1)+{s}.
Segundo caso (x[i]y[j]): No se pueden emparejar
los smbolos x[i] e y[j], por lo que LCS(X
LCS(Xi,Yj) ser
la mejor entre LCS(Xi-1,Yj) y LCS(Xi,Yj-1). 31
Programacin Dinmica
Subsecuencia de mayor longitud (LCS)
Implementacin iterativa del algoritmo:
return c;
} 32
Programacin Dinmica
Subsecuencia de mayor longitud (LCS)
Ejemplo:
Yj B D C A B
X = (A B C B), 0 1 2 3 4 5
Y = (B D C A B),
Xi 0 0 0 0 0 0 0
A 1 0
B 2 0
C 3 0
B 4 0
if ( X[i] == Y[j] )
c[i][j] = c[i-1][j-1] + 1;
else
c[i][j] = max ( c[i-1][j], c[i][j-1] ); 34
Programacin Dinmica
Subsecuencia de mayor longitud (LCS)
Ejemplo:
Yj B D C A B
(A B C B),
X = (A 0 1 2 3 4 5
Y = (B D C A B),
(B
Xi 0 0 0 0 0 0 0
A 1 0 0 0 0 1
B 2 0
C 3 0
B 4 0
if ( X[i] == Y[j] )
c[i][j] = c[i-1][j-1] + 1;
else
c[i][j] = max ( c[i-1][j], c[i][j-1] ); 35
Programacin Dinmica
Subsecuencia de mayor longitud (LCS)
Ejemplo:
Yj B D C A B
(A B C B),
X = (A 0 1 2 3 4 5
Y = (
(B
B D C A B),
Xi 0 0 0 0 0 0 0
A 1 0 0 0 0 1 1
B 2 0
C 3 0
B 4 0
if ( X[i] == Y[j] )
c[i][j] = c[i-1][j-1] + 1;
else
c[i][j] = max ( c[i-1][j], c[i][j-1] ); 36
Programacin Dinmica
Subsecuencia de mayor longitud (LCS)
Ejemplo:
Yj B D C A B
X = (A B C B), 0 1 2 3 4 5
Y = (B D C A B),
Xi 0 0 0 0 0 0 0
LCS = (B C B) A 1 0 0 0 0 1 1
B 2 0 1 1 1 1 2
X = ( A B C B )
C 3 0 1 1 2 2 2
Y = ( B D C A B )
B 4 0 1 1 2 2 3
NOTA:
A partir del valor c[i][j] podemos determinar cmo
se calcul ste y encontrar la LCS hacia atrs 37
Programacin Dinmica
Seleccin de actividades con pesos
Enunciado del problema
Programacin Dinmica
Seleccin de actividades con pesos
Recordatorio
valor = 999 b
valor = 1 a
39
Programacin Dinmica
Seleccin de actividades con pesos
Observacin
Si, como en el algoritmo greedy,
greedy, ordenamos las
actividades por su hora de finalizacin
8 Tiempo 40
Programacin Dinmica
Seleccin de actividades con pesos
Observacin
podemos definir p(j) como el mayor ndice i<j
tal que la actividad i es compatible con la actividad j
p(1)=0
p(2)=0
p(3)=0
p(4)=1
p(5)=0
p(6)=2
p(7)=3
p(8)=5 Tiempo 41
Programacin Dinmica
Seleccin de actividades con pesos
Definicin recursiva de la solucin
0 si j=0
OPT ( j ) =
max{v( j ) + OPT ( p ( j )), OPT ( j 1)} si j>0
Programacin Dinmica
Seleccin de actividades con pesos
Implementacin iterativa del algoritmo
mejor[0] = 0; // O(1)
for (i=1; i<=n, i++) // O(n)
mejor[i] = max ( valor[i]+mejor[p[i]],
mejor[i-
mejor[i-1] );
Objetivo: Seleccionar
los elementos que nos
garantizan un beneficio
mximo pero pero con
un peso global menor
o igual que W.
44
Programacin Dinmica
El problema de la mochila 0/1
Dado el conjunto S de n objetos,
sea Sk el conjunto de los k primeros objetos (de 1 a k):
45
Programacin Dinmica
El problema de la mochila 0/1
Cmo calculamos B(k,w
B(k,w)?
)?
46
Programacin Dinmica
El problema de la mochila 0/1
Definicin recursiva de B(k,w
B(k,w):
):
B (k 1, w) si xk = 0
B (k , w) =
B (k 1, w wk ) + bk si xk = 1
47
Programacin Dinmica
El problema de la mochila 0/1
Clculo ascendente de B(k,w
B(k,w))
usando una matriz B de tamao (n+1) x (W+1):
return B; 48
}
Programacin Dinmica
El problema de la mochila 0/1
Cmo calculamos la solucin ptima a partir de B(k,w
B(k,w)?
)?
Si B[k][w] == B[k-
B[k-1][w],
entonces el objeto k no se selecciona y se seleccionan
los objetos correspondientes a la solucin ptima para
k-1 objetos y una mochila de capacidad w:
la solucin para B[k-
B[k-1][w].
Si B[k][w] != B[k-
B[k-1][w],
se selecciona el objeto k
y los objetos correspondientes a la solucin ptima
para k-
k-1 objetos y una mochila de capacidad w
w--w[k]:
la solucin para B[k-
B[k-1][w
1][w-
-w[k]].
49
Programacin Dinmica
El problema de la mochila 0/1
Eficiencia del algoritmo
Tiempo de ejecucin: (n W)
Pseudopolinmico (no es polinmico sobre el tamao
de la entrada; esto es, sobre el nmero de objetos).
El problema de la mochila es NP.
Programacin Dinmica
El problema de la mochila 0/1
Ejemplo Objeto Valor Peso
0 1 2 3 4 5 6 7 8 9 10 11
0 0 0 0 0 0 0 0 0 0 0 0
{1} 0 1 1 1 1 1 1 1 1 1 1 1
{ 1, 2 } 0 1 6 7 7 7 7 7 7 7 7 7
{ 1, 2, 3 } 0 1 6 7 7 18 19 24 25 25 25 25
{ 1, 2, 3, 4 } 0 1 6 7 7 18 22 24 28 29 29 40
{ 1, 2, 3, 4, 5 } 0 1 6 7 7 18 22 28 29 34 35 40 51
Programacin Dinmica
Caminos mnimos: Algoritmo de Floyd
Problema:
Calcular el camino ms corto que une cada par de
vrtices de un grafo, considerando que no hay pesos
negativos.
Posibles soluciones:
Programacin Dinmica
Caminos mnimos: Algoritmo de Floyd
Definicin recursiva de la solucin:
Dk(i,j
i,j)): Camino ms corto de i a j usando slo los k
primeros vrtices del grafo como puntos intermedios.
Expresin recursiva:
Caso base:
D0 (i, j ) = cij
53
Programacin Dinmica
Caminos mnimos: Algoritmo de Floyd
Algoritmo de Floyd (1962): (V3)
Programacin Dinmica
Caminos mnimos: Algoritmo de Bellman-
Bellman-Ford
2 3
s
1 -6
t
Ojo!
Tampoco podemos sumarle una constante a cada peso. 55
Programacin Dinmica
Caminos mnimos: Algoritmo de Bellman-
Bellman-Ford
si i = 0
Di ( w) =
min{Di 1 ( w), (min {Di 1 (v ) + cvw }} en otro caso
v ,w )E
Programacin Dinmica
Caminos mnimos: Algoritmo de Bellman-
Bellman-Ford
Bellman-Ford: (EV)
Algoritmo de Bellman-
foreach v V {
D[v] = ;
predecesor[v]
predecesor[v] = null;
}
D[s] = 0;
for (i=1; i<n; i++) {
foreach (v, w) E {
if (D[v] + coste
coste((v,w
v,w)) < D[w]) {
D[w] = D[v] + coste
coste((v,w
v,w);
);
predecesor[w]
predecesor[w] = v;
}
}
} 57
Programacin Dinmica
Distancia de edicin
Tambin conocida como distancia Levenshtein,
Levenshtein, mide
la diferencia entre dos cadenas s y t como el nmero
mnimo de operaciones de edicin que hay que
realizar para convertir una cadena en otra:
d(data mining,
mining, data minino) = 1
d(efecto, defecto) = 1
d(poda, boda) = 1
d(
d(night,natch
night,natch)
) = d(natch,noche
d(natch,noche)
) = 3
Programacin Dinmica
Distancia de edicin
Definicin recursiva de la solucin
d (i 1, j 1) si s[i ] = t[ j ]
d (i, j ) =
1 + min{d (i 1, j ), d (i, j 1), d (i 1, j 1)} si s[i ] t[ j ]
CASOS
Mismo carcter: d(i
d(i--1,j
1,j--1)
Insercin: 1 + d(i-
d(i-1,j)
Borrado: 1 + d(i,j-
d(i,j-1)
Modificacin: 1 + d(i-
d(i-1,j
1,j--1)
59
Programacin Dinmica
Distancia de edicin
int LevenshteinDistance (string s[1..m], string t[1..n])
{
for (i=0; i<=m; i++) d[i,0]=i;
for (j=0; j<=n; j++
j++)
) d[0,j]=j;
return d[m,n
d[m,n];
];
}
d (i 1, j 1) si s[i ] = t[ j ]
d (i, j ) =
1 + min{d (i 1, j ), d (i, j 1), d (i 1, j 1)} si s[i ] t[ j ] 60
Programacin Dinmica
Aplicaciones
Distancia entre dos series temporales: O(n2)
DTW [Dynamic
[Dynamic Time Warping]
Warping]
Anlisis sintctico: O(n3)
Algoritmo CKY [Cocke
[Cocke--Kasami
Kasami--Younger]
Younger]
Algoritmo de Earley
Algoritmo de Viterbi:
Viterbi: HMMs [Hidden Markov Models]
Models]
Decodificacin de seales (p.ej. modems,
modems, GSM, wi
wi--fi)
Procesamiento del lenguaje natural
Bioinformtica
Optimizacin de consultas en bases de datos relacionales
Comparacin de ficheros con diff
61