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
Ejemplos
Aplicaciones
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:
1.
2.
3.
4.
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:
Dado un problema P con n elementos,
si la secuencia ptima es e1e2...
...e
ek...en entonces:
e1e2...
...e
ek es solucin al problema P considerando los
k primeros elementos.
ek+1...en es solucin al problema P considerando los
elementos desde k+1 hasta n.
Principio de Optimalidad
En otras palabras:
La solucin ptima de cualquier instancia no trivial
de un problema es una combinacin de las soluciones
ptimas de sus subproblemas
subproblemas..
Principio de Optimalidad
Un poco de historia: Bellman,
Bellman, aos 50
Enfoque est inspirado en la teora de control:
Se obtiene la poltica ptima para un problema de
control con n etapas basndose en una poltica ptima
para un problema similar, pero de nn-1 etapas.
Etimologa: Programacin dinmica = Planificacin temporal
En una poca hostil a la investigacin matemtica, Bellman
busc un nombre llamativo que evitase posibles confrontaciones:
it's impossible to use dynamic in a pejorative sense
something not even a Congressman could object to
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]
10
Principio de Optimalidad
Principio de Optimalidad de Bellman
[Bellman, R.E.: Dynamic Programming. Princeton University Press, 1957]
Principio de Optimalidad
Principio de Optimalidad de Bellman
[Bellman, R.E.: Dynamic Programming. Princeton University Press, 1957]
12
2.
13
4.
Programacin Dinmica
Ejemplos
Sucesin de Fibonacci
Implementacin recursiva: O(
O(n)
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!
=
p p ! ( n p )!
Implementacin inmediata
p
p
1
p
16
Programacin Dinmica
Ejemplos
Nmeros combinatorios:
Combinaciones de n sobre p
n n 1 n 1
=
+
p
p
1
p
17
Programacin Dinmica
Ejemplos
Nmeros combinatorios:
Combinaciones de n sobre p
n n 1 n 1
=
+
p
p
1
p
18
Programacin Dinmica
Ejemplos
Nmeros combinatorios:
Combinaciones de n sobre p
int combinaciones (int
{
b[0] = 1;
for (i=1; i<=n; i++)
b[i] = 1;
for (j=i
(j=i
1; j>0;
b[j] += b[j
}
}
return b[p];
}
n n 1 n 1
=
+
p
p
1
p
n, int p)
{
j
j---)
) {
1];
19
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).
Definicin recursiva de la solucin
Programacin Dinmica
Devolver el cambio
cambio({m1 ,..., mi 1}, C )
cambio({m1 ,..., mi }, C ) = min
1 + cambio({m1 ,..., mi }, C mi )
0
{1}
{1,4}
{1,4,6}
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:
Dadas las matrices A1 (10x100), A2 (100x5) y A3 (5x50),
(A1A2)A3 implica 7500 multiplicaciones
A1(A2A3) implica 75000 multiplicaciones
Parentizaciones
Parentizaciones posibles:
1
si n = 1
n 1
P(n) = P(k ) P(n k ) si n > 1
k =1
4n
2
n
22
Programacin Dinmica
Multiplicacin encadenada de matrices
Si cada matriz Ak tiene un tamao pk-1pk,
el nmero de multiplicaciones necesario ser:
Ak+1 x Ak+2 x x An
De forma general:
Programacin Dinmica
Multiplicacin encadenada de matrices
Matriz Ak de tamao pk-1pk
Definicin recursiva de la solucin ptima:
ptima:
Si i=j, entonces
m(i, j ) = 0
Si ij
j,, entonces
A1 x A2 x A3 xx Ak
Ak+1 x Ak+2 x x An
24
Programacin Dinmica
Multiplicacin encadenada de matrices
Implementacin:
Programacin Dinmica
Multiplicacin encadenada de matrices
Implementacin:
for (i=1; i<=n; i++)
m[i,i
m[i,i]
] = 0;
for (s=2; s<=n; l++)
for (i=1; i<=ni<=n-s+1; i++) {
j = i+si+s-1;
m[i,j
m[i,j]
] = ;
for (k=i; k<=j
k<=j-1; k++) {
q = m[i,k
m[i,k]
] + m[k+1,j] + p[i
p[i-1]*p[k]p[j]
if (q < m[
m[i,j
i,j])
]) {
m[i,j
m[i,j]
] = q;
s[i,j
s[i,j]
] = k;
}
}
}
26
Programacin Dinmica
Multiplicacin encadenada de matrices
Implementacin:
// Suponiendo que hemos calculado previamente s[i,j
s[i,j]
]
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:
Comparar dos cadenas y encontrar la subsecuencia
comn de mayor longitud.
Ejemplo:
Cadenas:
X = (A B C B D A B),
Y = (B D C A B A),
Subsecuencia comn de mayor longitud:
LCS = (B C 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:
Si |X|=m, |Y|=n, entonces hay 2m subsecuencias de X
que debemos comparar con Y (n comparaciones), por
lo que nuestro algoritmo sera de orden O(n2m).
Sin embargo, LCS tiene subestructuras optimales:
optimales:
Si buscamos la LCS para pares de prefijos de X e Y,
podemos calcular la solucin de nuestro problema
29
Programacin Dinmica
Subsecuencia de mayor longitud (LCS)
Si buscamos la LCS para pares de prefijos de X e Y,
podemos calcular la solucin de nuestro problema
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
La longitud de la subsecuencia de mayor longitud
(LCS) de X e Y ser c(m,n
c(m,n),
), con |X|=m, |Y|=n.
30
Programacin Dinmica
Subsecuencia de mayor longitud (LCS)
Definicin recursiva de la solucin:
Caso base:
c(0,0) = 0
c(0,j) = c(i,0) = 0
(Subcadena vaca)
(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:
int[][] LCS (X, Y)
{
for (i=0; i<=X.length; i++) c[i][0]=0;
for (j=1; j<=T.length; j++) c[0][j]=0;
// Y0
// X0
Programacin Dinmica
Subsecuencia de mayor longitud (LCS)
Ejemplo:
X = (A B C B),
Y = (B D C A B),
Yj
Xi
// Y0
// X0
33
Programacin Dinmica
Subsecuencia de mayor longitud (LCS)
Ejemplo:
X = (A
(A B C B),
Y = (
(B
B D C A B),
Yj
Xi
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:
X = (A
(A B C B),
B D C A B),
Y = (
(B
Yj
5
0
Xi
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:
X = (A
(A B C B),
Y = (
(B
B D C A B),
Yj
Xi
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:
X = (A B C B),
Y = (B D C A B),
LCS = (B C B)
X = ( A B
C
B )
B D C A B )
Y = (
Yj
Xi
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
Dado un conjunto C de n tareas o actividades, con
si = tiempo de comienzo de la actividad i
fi = tiempo de finalizacin de la actividad i
vi = valor (o peso) de la actividad i
encontrar el subconjunto S de actividades compatibles
de peso mximo (esto es, un conjunto de actividades
que no se solapen en el tiempo y que, adems, nos
proporcione un valor mximo).
38
Programacin Dinmica
Seleccin de actividades con pesos
Recordatorio
Existe un algoritmo greedy para este problema cuando
todas las actividades tienen el mismo valor (elegir las
actividades en orden creciente de hora de finalizacin).
Sin embargo, el algoritmo greedy no funciona en general:
valor = 999
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
1
2
3
4
5
6
7
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
OPT ( j ) =
max{v( j ) + OPT ( p ( j )), OPT ( j 1)} si
j>0
j=0
42
Programacin Dinmica
Seleccin de actividades con pesos
Implementacin iterativa del algoritmo
SeleccinActividadesConPesos (C: actividades): S
{
Ordenar C segn tiempo de finalizacin;
// O(n log n)
Calcular p[1]..p[n];
// O(n log n)
mejor[0] = 0;
for (i=1; i<=n, i++)
mejor[i] = max ( valor[i]+mejor[p[i]],
mejor[imejor[i
-1] );
// O(1)
// O(n)
return Solucin(mejor);
// O(n)
}
43
Programacin Dinmica
El problema de la mochila 0/1
Tenemos un conjunto S de n objetos, en el que cada
objeto i tiene un beneficio bi y un peso wi positivos.
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):
Podemos definir B(k,w
B(k,w)) como la ganancia de la mejor
solucin obtenida a partir de los elementos de Sk para
una mochila de capacidad w.
Ahora bien, la mejor seleccin de elementos del
conjunto Sk para una mochila de tamao w se puede
definir en funcin de selecciones de elementos de Sk-1
para mochilas de menor capacidad
45
Programacin Dinmica
El problema de la mochila 0/1
Cmo calculamos B(k,w
B(k,w)?
)?
O bien la mejor opcin para Sk coincide con la mejor
seleccin de elementos de Sk-1 con peso mximo w
(el beneficio mximo para Sk coincide con el de Sk-1),
o bien es es el resultado de aadir el objeto k a la mejor
seleccin de elementos de Sk-1 con peso mximo
w
ww
wk (el beneficio para Sk ser el beneficio que se
obtena en Sk-1 para una mochila de capacidad ww
wwk
ms el beneficio bk asociado al objeto k).
46
Programacin Dinmica
El problema de la mochila 0/1
Definicin recursiva de B(k,w
B(k,w):
):
B (k 1, w)
B (k , w) =
B (k 1, w wk ) + bk
si
si
xk = 0
xk = 1
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):
int[][] knapsack (W, w[1..n], b[1..n])
int[][]
{
for (p=0; p<=W; p++)
B[0][p]=0;
for (k=1; k<=n; k++) {
for (p=0; p<w[k]; p++)
B[k][p] = B[kB[k-1][p];
for (p=w[k]; p<=W; w++)
B[k][p] = max ( B[k
B[k-1][pw[k]]+b[k], B[k
B[k-1][p] );
}
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)?
)?
Calculamos la solucin para B[k][w]
utilizando el siguiente algoritmo:
Si B[k][w] == B[kB[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[kB[k-1][w].
Si B[k][w] != B[kB[k-1][w],
se selecciona el objeto k
y los objetos correspondientes a la solucin ptima
para kk-1 objetos y una mochila de capacidad w
w-w[k]:
la solucin para B[kB[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.
NOTA: Existe un algoritmo polinmico de
orden O(n2v*) que proporciona una solucin
aproximada al 0.01% del ptimo [Kleinberg
& Tardos, seccin 11.8: Arbitrarily Good
Approximations: The Knapsack Problem].
50
Programacin Dinmica
El problema de la mochila 0/1
Ejemplo
Mochila de tamao W=11
Nmero de objetos n=5
Solucin ptima {3,4}
Objeto Valor
1
2
3
4
5
7
1
2
5
6
7
0
{1}
0
{ 1, 2 }
0
{ 1, 2, 3 }
0
{ 1, 2, 3, 4 } 0
{ 1, 2, 3, 4, 5 } 0
0
1
1
1
1
1
0
1
6
6
6
6
0
1
7
7
7
7
0
1
7
7
7
7
0 0 0 0 0 0 0
1 1 1 1 1 1 1
7 7 7 7 7 7 7
18 19 24 25 25 25 25
18 22 24 28 29 29 40
18 22 28 29 34 35 40
1
6
18
22
28
Peso
10 11
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:
52
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:
D0 (i, j ) = cij
53
Programacin Dinmica
Caminos mnimos: Algoritmo de Floyd
Algoritmo de Floyd (1962): (V3)
for (i=0; i<n; i++)
for (j=0; j<n; j++
j++)
)
D[i][j] = coste(i,j
coste(i,j);
);
for (k=0; k<n; k++)
for (i=0; i<n; i++)
for (j=0; j<n; j++
j++)
)
if (D[i][k] + D[k][j] < D[i][j] )
D[i][j] = D[i][k] + D[k][j];
54
Programacin Dinmica
Caminos mnimos: Algoritmo de BellmanBellman-Ford
Si slo nos interesan los caminos mnimos desde un
vrtice concreto del grafo G(V,E), podemos utilizar el
V),
algoritmo greedy de Dijkstra,
Dijkstra, de orden O(E log V),
siempre y cuando tengamos pesos no negativos.
negativos.
El algoritmo de Dijkstra no funciona con pesos negativos:
3
2
s
1
-6
t
Ojo!
Tampoco podemos sumarle una constante a cada peso.
55
Programacin Dinmica
Caminos mnimos: Algoritmo de BellmanBellman-Ford
Si tenemos pesos negativos, podemos utilizar el
algoritmo de BellmanBellman-Ford, basado en programacin
O(EV),, siempre y cuando no
dinmica y de orden O(EV)
tengamos ciclos de peso negativo:
Di ( w) =
{Di 1 (v ) + cvw }}
min{Di 1 ( w), (min
v ,w )E
si i = 0
en otro caso
56
Programacin Dinmica
Caminos mnimos: Algoritmo de BellmanBellman-Ford
Algoritmo de BellmanBellman-Ford: (EV)
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
58
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:
Insercin:
Borrado:
Modificacin:
d(i
d(i--1,j
1,j--1)
1 + d(id(i-1,j)
1 + d(i,jd(i,j-1)
1 + d(id(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;
for (j=1; j<=n; j++
j++)
)
for (i=1; i<=m; i++)
if (s[i]==t[j])
d[i,j
d[i,j]
] = d[i
d[i-1, j
j-1]
else
d[i,j
d[i,j]
] = 1+ min(d[i
min(d[i-1,j],d[i,j
1,j],d[i,j-1],d[i
1],d[i-1,j
1,j-1]);
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