=
|
|
\
|
Implementacin usando programacin dinmica Implementacin usando programacin dinmica
Tringulo de Pascal Tringulo de Pascal
16 16
|
|
\
|
+
|
|
\
|
=
|
|
\
|
p
n
p
n
p
n 1
1
1
\
Programacin Dinmica Programacin Dinmica
Ejemplos Ejemplos
Nmeros combinatorios: Nmeros combinatorios:
Combinaciones de n sobre p Combinaciones de n sobre p
|
|
\
|
+
|
|
\
|
=
|
|
\
|
p
n
p
n
p
n 1
1
1
Orden de eficiencia: Orden de eficiencia: ((np np))
17 17
Programacin Dinmica Programacin Dinmica
Ejemplos Ejemplos
Nmeros combinatorios: Nmeros combinatorios:
Combinaciones de n sobre p Combinaciones de n sobre p
int int combinaciones combinaciones ( (int int n, n, int int p) p)
{ {
for for (i=0; i<=n; i++) { (i=0; i<=n; i++) {
|
|
\
|
+
|
|
\
|
=
|
|
\
|
p
n
p
n
p
n 1
1
1
for for (j=0; j<=min( (j=0; j<=min(i,p i,p); ); j++ j++) { ) {
if if ((j==0) || (j==i)) ((j==0) || (j==i))
c[i][j] = 1 c[i][j] = 1
else else
c[i][j] = c[i c[i][j] = c[i- -1][j 1][j 1]+c[i 1]+c[i- -1][j]; 1][j];
} }
} }
return return c[n][p]; c[n][p];
} }
Orden de eficiencia: Orden de eficiencia: ((np np) en tiempo, ) en tiempo, ((np np) en espacio. ) en espacio.
18 18
Programacin Dinmica Programacin Dinmica
Ejemplos Ejemplos
Nmeros combinatorios: Nmeros combinatorios:
Combinaciones de n sobre p Combinaciones de n sobre p
int int combinaciones combinaciones ( (int int n, n, int int p) p)
{ {
b[0] = 1; b[0] = 1;
|
|
\
|
+
|
|
\
|
=
|
|
\
|
p
n
p
n
p
n 1
1
1
for for (i=1; i<=n; i++) { (i=1; i<=n; i++) {
b[i] = 1; b[i] = 1;
for for (j=i (j=i 1; j>0; j 1; j>0; j-- --) { ) {
b[j] += b[j b[j] += b[j 1]; 1];
} }
} }
return return b[p]; b[p];
} }
Orden de eficiencia: Orden de eficiencia: ((np np) en tiempo, ) en tiempo, (n) en espacio. (n) en espacio.
19 19
Programacin Dinmica Programacin Dinmica
Devolver el cambio Devolver el cambio
Existen casos para los que no se puede aplicar el Existen casos para los que no se puede aplicar el
algoritmo algoritmo greedy greedy (por ejemplo, devolver 8 peniques (por ejemplo, devolver 8 peniques
con monedas de 6, 4 y 1 penique). con monedas de 6, 4 y 1 penique).
Definicin recursiva de la solucin Definicin recursiva de la solucin Definicin recursiva de la solucin Definicin recursiva de la solucin
Clculo de la solucin con programacin dinmica: Clculo de la solucin con programacin dinmica:
Orden de eficiencia proporcional al tamao de la tabla, Orden de eficiencia proporcional al tamao de la tabla,
O( O(Cn Cn), donde n es el nmero de monedas distintas. ), donde n es el nmero de monedas distintas.
20 20
+
=
) }, ,..., ({ 1
) }, ,..., ({
min ) }, ,..., ({
1
1 1
1
i i
i
i
m C m m cambio
C m m cambio
C m m cambio
Programacin Dinmica Programacin Dinmica
Devolver el cambio Devolver el cambio
+
=
) }, ,..., ({ 1
) }, ,..., ({
min ) }, ,..., ({
1
1 1
1
i i
i
i
m C m m cambio
C m m cambio
C m m cambio
m={1,4,6}, C=8 m={1,4,6}, C=8
Solucin: 2 monedas, S={4,4}. Solucin: 2 monedas, S={4,4}.
21 21
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
Programacin Dinmica Programacin Dinmica
Multiplicacin encadenada de matrices Multiplicacin encadenada de matrices
Propiedad asociativa del producto de matrices: Propiedad asociativa del producto de matrices:
Dadas las matrices A Dadas las matrices A
11
(10x100), A (10x100), A
22
(100x5) y A (100x5) y A
33
(5x50), (5x50),
(A (A
11
AA
22
)A )A
33
implica 7500 multiplicaciones implica 7500 multiplicaciones
AA
11
(A (A
22
AA
33
) implica 75000 multiplicaciones ) implica 75000 multiplicaciones AA
11
(A (A
22
AA
33
) implica 75000 multiplicaciones ) implica 75000 multiplicaciones
Parentizaciones Parentizaciones posibles: posibles:
22 22
>
=
=
=
1 ) ( ) (
1 1
) (
1
1
n si k n P k P
n si
n P
n
k
|
|
\
|
2
4
n
n
Programacin Dinmica Programacin Dinmica
Multiplicacin encadenada de matrices Multiplicacin encadenada de matrices
Si cada matriz Si cada matriz AA
k k
tiene un tamao p tiene un tamao p
k k- -11
pp
k k
,,
el nmero de multiplicaciones necesario ser: el nmero de multiplicaciones necesario ser:
n k
p p p n k m k m n m
0
) , 1 ( ) , 1 ( ) , 1 ( + + + =
De forma general: De forma general:
23 23
A
1
x A
2
x A
3
xx A
k
A
k+1
x A
k+2
x x A
n
x
j k i
p p p j k m k i m j i m
1
) , 1 ( ) , ( ) , (
+ + + =
Programacin Dinmica Programacin Dinmica
Multiplicacin encadenada de matrices Multiplicacin encadenada de matrices
Matriz Matriz AA
k k
de tamao p de tamao p
k k- -11
pp
k k
Definicin recursiva de la solucin ptima Definicin recursiva de la solucin ptima::
Si i=j, entonces Si i=j, entonces
Si Si iij j, entonces , entonces
24 24
A
1
x A
2
x A
3
xx A
k
A
k+1
x A
k+2
x x A
n
x
{ }
j k i
j k i
p p p j k m k i m j i m
1
) , 1 ( ) , ( min ) , (
<
+ + + =
0 ) , ( = j i m
Programacin Dinmica Programacin Dinmica
Multiplicacin encadenada de matrices Multiplicacin encadenada de matrices
Implementacin: Implementacin:
Tenemos n Tenemos n
22
subproblemas subproblemas distintos m( distintos m(i,j i,j). ).
Para calcular m( Para calcular m(i,j i,j) necesitamos los valores ) necesitamos los valores Para calcular m( Para calcular m(i,j i,j) necesitamos los valores ) necesitamos los valores
almacenados en la fila i y en la columna j almacenados en la fila i y en la columna j
Para calcular cada valor necesitamos O(n), Para calcular cada valor necesitamos O(n),
por lo que el algoritmo resultante es de orden O(n por lo que el algoritmo resultante es de orden O(n
33
). ).
25 25
{ }
j k i
j k i
p p p j k m k i m j i m
1
) , 1 ( ) , ( min ) , (
<
+ + + =
Programacin Dinmica Programacin Dinmica
Multiplicacin encadenada de matrices Multiplicacin encadenada de matrices
Implementacin: Implementacin:
for for (i=1; i<=n; i++) (i=1; i<=n; i++)
m[ m[i,i i,i] = 0; ] = 0;
for for (s=2; s<=n; l++) (s=2; s<=n; l++)
for for (i=1; i<=n (i=1; i<=n- -s+1; i++) { s+1; i++) { for for (i=1; i<=n (i=1; i<=n- -s+1; i++) { s+1; i++) {
j = i+s j = i+s- -1; 1;
m[ m[i,j i,j] = ; ] = ;
for for (k=i; k<=j (k=i; k<=j- -1; k++) { 1; k++) {
q = m[ q = m[i,k i,k] + m[k+1,j] + p[i ] + m[k+1,j] + p[i- -1]*p[k]p[j] 1]*p[k]p[j]
if if (q < m[ (q < m[i,j i,j]) { ]) {
m[ m[i,j i,j] = q; ] = q;
s[ s[i,j i,j] = k; ] = k;
} }
} }
} }
26 26
Programacin Dinmica Programacin Dinmica
Multiplicacin encadenada de matrices Multiplicacin encadenada de matrices
Implementacin: Implementacin:
// Suponiendo que hemos calculado previamente s[ // Suponiendo que hemos calculado previamente s[i,j i,j] ]
MultiplicaCadenaMatrices MultiplicaCadenaMatrices (A, i, j) (A, i, j)
{ {{ {
if if (j>i) { (j>i) {
x = x = MultplicaCadenaMatrices MultplicaCadenaMatrices (A, i, s[ (A, i, s[i,j i,j]); ]);
y = y = MultplicaCadenaMatrices MultplicaCadenaMatrices (A, s[ (A, s[i,j i,j]+1, j); ]+1, j);
return return MultiplicaMatrices MultiplicaMatrices(x, y); (x, y);
} } else else { {
return return A[i]; A[i];
} }
} }
27 27
Programacin Dinmica Programacin Dinmica
Subsecuencia Subsecuencia de mayor longitud (LCS) de mayor longitud (LCS)
Problema: Problema:
Comparar dos cadenas y encontrar la Comparar dos cadenas y encontrar la subsecuencia subsecuencia
comn de mayor longitud. comn de mayor longitud.
Ejemplo: Ejemplo:
Cadenas: Cadenas:
X = (A B C B D A B), X = (A B C B D A B),
Y = (B D C A B A), Y = (B D C A B A),
Subsecuencia Subsecuencia comn de mayor longitud: comn de mayor longitud:
LCS = (B C B A) LCS = (B C B A)
X = ( A X = ( A B B C C B B D D A A B ) B )
Y = ( Y = ( B B D D C C A A B B A A ) )
28 28
Programacin Dinmica Programacin Dinmica
Subsecuencia Subsecuencia de mayor longitud (LCS) de mayor longitud (LCS)
Un algoritmo de fuerza bruta comparara cualquier Un algoritmo de fuerza bruta comparara cualquier
subsecuencia subsecuencia de X con los smbolos de Y: de X con los smbolos de Y:
Si |X|=m, |Y|=n, entonces hay 2 Si |X|=m, |Y|=n, entonces hay 2
mm
subsecuencias subsecuencias de X de X
que debemos comparar con Y (n comparaciones), por que debemos comparar con Y (n comparaciones), por que debemos comparar con Y (n comparaciones), por que debemos comparar con Y (n comparaciones), por
lo que nuestro algoritmo sera de orden lo que nuestro algoritmo sera de orden O(n2 O(n2
mm
) )..
Sin embargo, LCS tiene subestructuras Sin embargo, LCS tiene subestructuras optimales optimales::
Si buscamos la LCS para pares de prefijos de X e Y, Si buscamos la LCS para pares de prefijos de X e Y,
podemos calcular la solucin de nuestro problema podemos calcular la solucin de nuestro problema
29 29
Programacin Dinmica Programacin Dinmica
Subsecuencia Subsecuencia de mayor longitud (LCS) de mayor longitud (LCS)
Si buscamos la LCS para pares de prefijos de X e Y, Si buscamos la LCS para pares de prefijos de X e Y,
podemos calcular la solucin de nuestro problema podemos calcular la solucin de nuestro problema
XX
ii
Prefijo de X de longitud i. Prefijo de X de longitud i.
Y Y
jj
Prefijo de Y de longitud j. Prefijo de Y de longitud j. Y Y
jj
Prefijo de Y de longitud j. Prefijo de Y de longitud j.
c( c(i,j i,j)) Longitud de la LCS para X Longitud de la LCS para X
ii
e e Y Y
jj
..
La longitud de la La longitud de la subsecuencia subsecuencia de mayor longitud de mayor longitud
(LCS) de X e Y ser (LCS) de X e Y ser c( c(m,n m,n), ), con |X|=m, |Y|=n. con |X|=m, |Y|=n. 30 30
= +
=
caso otro en j i c j i c
j y i x si j i c
j i c
)} 1 , ( ), , 1 ( max{
] [ ] [ 1 ) 1 , 1 (
) , (
Programacin Dinmica Programacin Dinmica
Subsecuencia Subsecuencia de mayor longitud (LCS) de mayor longitud (LCS)
Definicin recursiva de la solucin: Definicin recursiva de la solucin:
Caso base: Caso base:
c(0,0) = 0 c(0,0) = 0 ((Subcadena Subcadena vaca) vaca)
c(0,j) = c(i,0) = 0 c(0,j) = c(i,0) = 0 (LCS de la cadena vaca (LCS de la cadena vaca
y cualquier otra cadena) y cualquier otra cadena) y cualquier otra cadena) y cualquier otra cadena)
Clculo recursivo: Clculo recursivo:
Primer caso (x[i]=y[j]=s): Se emparejan ambos Primer caso (x[i]=y[j]=s): Se emparejan ambos
smbolos y la LCS aumenta de longitud: smbolos y la LCS aumenta de longitud:
LCS( LCS(XX
ii
,Y ,Y
jj
)= LCS(X )= LCS(X
ii- -11
,Y ,Y
jj- -11
)+{s}. )+{s}.
Segundo caso (x[i]y[j]): No se pueden emparejar Segundo caso (x[i]y[j]): No se pueden emparejar
los smbolos x[i] e y[j], por lo que LCS( los smbolos x[i] e y[j], por lo que LCS(XX
ii
,Y ,Y
jj
) ser ) ser
la mejor entre LCS(X la mejor entre LCS(X
ii- -11
,Y ,Y
jj
) y LCS(X ) y LCS(X
ii
,Y ,Y
jj- -11
). ). 31 31
Programacin Dinmica Programacin Dinmica
Subsecuencia Subsecuencia de mayor longitud (LCS) de mayor longitud (LCS)
Implementacin iterativa del algoritmo: Implementacin iterativa del algoritmo:
int[][] LCS (X, Y)
{
for (i=0; i<=X.length; i++) c[i][0]=0; // Y
0
for (j=1; j<=T.length; j++) c[0][j]=0; // X for (j=1; j<=T.length; j++) c[0][j]=0; // X
0
for (i=1; i<=X.length; i++) // X
i
for (j=1; j<=Y.length; j++) // Y
j
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] );
return c;
}
32 32
Programacin Dinmica Programacin Dinmica
Subsecuencia Subsecuencia de mayor longitud (LCS) de mayor longitud (LCS)
Ejemplo: Ejemplo:
X = (A B C B), X = (A B C B),
Y = (B D C A B), Y = (B D C A B),
Y
j
B D C A B
0 1 2 3 4 5
X
i
0 0 0 0 0 0 0
A 1 0
for (i=0; i<=X.length; i++) c[i][0]=0; // Y
0
for (j=1; j<=T.length; j++) c[0][j]=0; // X
0
33 33
B 2 0
C 3 0
B 4 0
Programacin Dinmica Programacin Dinmica
Subsecuencia Subsecuencia de mayor longitud (LCS) de mayor longitud (LCS)
Ejemplo: Ejemplo:
X = ( X = (A A B C B), B C B),
Y = ( Y = (B D C B D C A B), A B),
Y
j
B D C A B
0 1 2 3 4 5
X
i
0 0 0 0 0 0 0
A 1 0 0 0 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 34
B 2 0
C 3 0
B 4 0
Programacin Dinmica Programacin Dinmica
Subsecuencia Subsecuencia de mayor longitud (LCS) de mayor longitud (LCS)
Ejemplo: Ejemplo:
X = ( X = (A A B C B), B C B),
Y = ( Y = (B D C B D C A A B), B),
Y
j
B D C A B
0 1 2 3 4 5
X
i
0 0 0 0 0 0 0
A 1 0 0 0 0 1
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 35
B 2 0
C 3 0
B 4 0
Programacin Dinmica Programacin Dinmica
Subsecuencia Subsecuencia de mayor longitud (LCS) de mayor longitud (LCS)
Ejemplo: Ejemplo:
X = ( X = (A A B C B), B C B),
Y = ( Y = (B D C A B D C A B B), ),
Y
j
B D C A B
0 1 2 3 4 5
X
i
0 0 0 0 0 0 0
A 1 0 0 0 0 1 1
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 36
B 2 0
C 3 0
B 4 0
Programacin Dinmica Programacin Dinmica
Subsecuencia Subsecuencia de mayor longitud (LCS) de mayor longitud (LCS)
Ejemplo: Ejemplo:
X = (A B C B), X = (A B C B),
Y = (B D C A B), Y = (B D C A B),
LCS = (B C B) LCS = (B C B)
Y
j
B D C A B
0 1 2 3 4 5
X
i
0 0 0 0 0 0 0
A 1 0 0 0 0 1 1
LCS = (B C B) LCS = (B C B)
X = ( A X = ( A B B C C B B ) )
Y = ( Y = ( B B D D C C A A B B ) )
N NOTA OTA: :
A partir del valor c[i][j] podemos determinar cmo A partir del valor c[i][j] podemos determinar cmo
se calcul ste y encontrar la LCS hacia atrs se calcul ste y encontrar la LCS hacia atrs
37 37
B 2 0 1 1 1 1 2
C 3 0 1 1 2 2 2
B 4 0 1 1 2 2 3
Programacin Dinmica Programacin Dinmica
Seleccin de actividades con pesos Seleccin de actividades con pesos
Enunciado del problema Enunciado del problema
Dado un conjunto C de n tareas o actividades, con Dado un conjunto C de n tareas o actividades, con
s s
ii
= tiempo de comienzo de la actividad i = tiempo de comienzo de la actividad i s s
ii
= tiempo de comienzo de la actividad i = tiempo de comienzo de la actividad i
f f
ii
= tiempo de finalizacin de la actividad i = tiempo de finalizacin de la actividad i
v v
ii
= valor (o peso) de la actividad i = valor (o peso) de la actividad i
encontrar el subconjunto S de actividades compatibles encontrar el subconjunto S de actividades compatibles
de peso mximo (esto es, un conjunto de actividades de peso mximo (esto es, un conjunto de actividades
que no se solapen en el tiempo y que, adems, nos que no se solapen en el tiempo y que, adems, nos
proporcione un valor mximo). proporcione un valor mximo).
38 38
Programacin Dinmica Programacin Dinmica
Seleccin de actividades con pesos Seleccin de actividades con pesos
Recordatorio Recordatorio
Existe un algoritmo Existe un algoritmo greedy greedy para este problema cuando para este problema cuando
todas las actividades tienen el mismo valor (elegir las todas las actividades tienen el mismo valor (elegir las
actividades en orden creciente de hora de finalizacin). actividades en orden creciente de hora de finalizacin). actividades en orden creciente de hora de finalizacin). actividades en orden creciente de hora de finalizacin).
Sin embargo, el algoritmo Sin embargo, el algoritmo greedy greedy no funciona en general: no funciona en general:
39 39
valor = 999
valor = 1
b
a
Programacin Dinmica Programacin Dinmica
Seleccin de actividades con pesos Seleccin de actividades con pesos
Observacin Observacin
Si, como en el algoritmo Si, como en el algoritmo greedy greedy, ordenamos las , ordenamos las
actividades por su hora de finalizacin actividades por su hora de finalizacin
1
40 40
Tiempo
3
2
6
5
7
4
8
Programacin Dinmica Programacin Dinmica
Seleccin de actividades con pesos Seleccin de actividades con pesos
Observacin Observacin
podemos definir p(j) como el mayor ndice i<j podemos definir p(j) como el mayor ndice i<j
tal que la actividad i es compatible con la actividad j tal que la actividad i es compatible con la actividad j
p(1)=0
41 41
Tiempo
p(3)=0
p(2)=0
p(6)=2
p(5)=0
p(7)=3
p(4)=1
p(8)=5
Programacin Dinmica Programacin Dinmica
Seleccin de actividades con pesos Seleccin de actividades con pesos
Definicin recursiva de la solucin Definicin recursiva de la solucin
> +
=
=
0 )} 1 ( )), ( ( ) ( max{
0 0
) (
j si j OPT j p OPT j v
j si
j OPT
Caso 1: Se elige la actividad j. Caso 1: Se elige la actividad j.
No se pueden escoger actividades incompatibles >p(j). No se pueden escoger actividades incompatibles >p(j).
La solucin incluir la solucin ptima para p(j). La solucin incluir la solucin ptima para p(j).
Caso 2: No se elige la actividad j. Caso 2: No se elige la actividad j.
La solucin coincidir con la solucin ptima La solucin coincidir con la solucin ptima
para las primeras (j para las primeras (j- -1) actividades 1) actividades..
42 42
Programacin Dinmica Programacin Dinmica
Seleccin de actividades con pesos Seleccin de actividades con pesos
Implementacin iterativa del algoritmo Implementacin iterativa del algoritmo
SeleccinActividadesConPesos SeleccinActividadesConPesos (C: actividades): S (C: actividades): S
{ {
Ordenar C segn tiempo de finalizacin; Ordenar C segn tiempo de finalizacin; // O(n log n) // O(n log n)
Calcular p[1]..p[n]; Calcular p[1]..p[n]; // O(n log n) // O(n log n) Calcular p[1]..p[n]; Calcular p[1]..p[n]; // O(n log n) // O(n log n)
mejor[0] = 0; mejor[0] = 0; // O(1) // O(1)
for for (i=1; i<=n, i++) (i=1; i<=n, i++) // O(n) // O(n)
mejor[i] = mejor[i] = max max ( valor[i]+mejor[p[i]], ( valor[i]+mejor[p[i]],
mejor[i mejor[i- -1] ); 1] );
return return Solucin(mejor); Solucin(mejor); // O(n) // O(n)
} }
43 43
Programacin Dinmica Programacin Dinmica
El problema de la mochila 0/1 El problema de la mochila 0/1
Tenemos un conjunto S de n objetos, en el que cada Tenemos un conjunto S de n objetos, en el que cada
objeto i tiene un beneficio objeto i tiene un beneficio bb
ii
y un peso y un peso w w
ii
positivos. positivos.
Objetivo: Seleccionar Objetivo: Seleccionar Objetivo: Seleccionar Objetivo: Seleccionar
los elementos que nos los elementos que nos
garantizan un beneficio garantizan un beneficio
mximo pero mximo pero pero pero con con
un peso global menor un peso global menor
o igual que W. o igual que W.
44 44
Programacin Dinmica Programacin Dinmica
El problema de la mochila 0/1 El problema de la mochila 0/1
Dado el conjunto S de n objetos, Dado el conjunto S de n objetos,
sea sea S S
k k
el conjunto de los k primeros objetos (de 1 a k): el conjunto de los k primeros objetos (de 1 a k):
Podemos definir Podemos definir B( B(k,w k,w) ) como la ganancia de la mejor como la ganancia de la mejor
solucin obtenida a partir de los elementos de solucin obtenida a partir de los elementos de S S
k k
para para solucin obtenida a partir de los elementos de solucin obtenida a partir de los elementos de S S
k k
para para
una mochila de capacidad w. una mochila de capacidad w.
Ahora bien, la mejor seleccin de elementos del Ahora bien, la mejor seleccin de elementos del
conjunto conjunto S S
k k
para una mochila de tamao w se puede para una mochila de tamao w se puede
definir en funcin de selecciones de elementos de S definir en funcin de selecciones de elementos de S
k k- -11
para mochilas de menor capacidad para mochilas de menor capacidad
45 45
Programacin Dinmica Programacin Dinmica
El problema de la mochila 0/1 El problema de la mochila 0/1
Cmo calculamos B( Cmo calculamos B(k,w k,w)? )?
O bien la mejor opcin para O bien la mejor opcin para S S
k k
coincide con la mejor coincide con la mejor
seleccin de elementos de S seleccin de elementos de S
k k- -11
con peso mximo w con peso mximo w
(el beneficio mximo para (el beneficio mximo para S S
k k
coincide con el de S coincide con el de S
k k- -11
), ), (el beneficio mximo para (el beneficio mximo para S S
k k
coincide con el de S coincide con el de S
k k- -11
), ),
o bien es es el resultado de aadir el objeto k a la mejor o bien es es el resultado de aadir el objeto k a la mejor
seleccin de elementos de S seleccin de elementos de S
k k- -11
con peso mximo con peso mximo
w ww w
k k
(el beneficio para (el beneficio para S S
k k
ser el beneficio que se ser el beneficio que se
obtena en S obtena en S
k k- -1 1
para una mochila de capacidad w para una mochila de capacidad ww w
k k
ms el beneficio ms el beneficio bb
k k
asociado al objeto k). asociado al objeto k).
46 46
Programacin Dinmica Programacin Dinmica
El problema de la mochila 0/1 El problema de la mochila 0/1
Definicin recursiva de B( Definicin recursiva de B(k,w k,w): ):
= +
=
=
1 ) , 1 (
0 ) , 1 (
) , (
k k k
k
x si b w w k B
x si w k B
w k B
Para resolver el problema de la mochila nos Para resolver el problema de la mochila nos
quedaremos con el mximo de ambos valores: quedaremos con el mximo de ambos valores:
47 47
} ) , 1 ( ), , 1 ( max{ ) , (
k k
b w w k B w k B w k B + =
Programacin Dinmica Programacin Dinmica
El problema de la mochila 0/1 El problema de la mochila 0/1
Clculo ascendente de B( Clculo ascendente de B(k,w k,w))
usando una matriz B de tamao (n+1) x (W+1): usando una matriz B de tamao (n+1) x (W+1):
int int[][] [][] knapsack knapsack (W, w[1..n], b[1..n]) (W, w[1..n], b[1..n])
{ {
for for (p=0; p<=W; p++) (p=0; p<=W; p++) for for (p=0; p<=W; p++) (p=0; p<=W; p++)
B[0][p]=0; B[0][p]=0;
for for (k=1; k<=n; k++) { (k=1; k<=n; k++) {
for for (p=0; p<w[k]; p++) (p=0; p<w[k]; p++)
B[k][p] = B[k B[k][p] = B[k- -1][p]; 1][p];
for for (p=w[k]; p<=W; w++) (p=w[k]; p<=W; w++)
B[k][p] = B[k][p] = max max ( B[k ( B[k- -1][pw[k]]+b[k], B[k 1][pw[k]]+b[k], B[k- -1][p] ); 1][p] );
} }
return return B; B;
} }
48 48
Programacin Dinmica Programacin Dinmica
El problema de la mochila 0/1 El problema de la mochila 0/1
Cmo calculamos la solucin ptima a partir de B( Cmo calculamos la solucin ptima a partir de B(k,w k,w)? )?
Calculamos la solucin para B[k][w] Calculamos la solucin para B[k][w]
utilizando el siguiente algoritmo: utilizando el siguiente algoritmo:
Si B[k][w] == B[k Si B[k][w] == B[k- -1][w], 1][w], Si B[k][w] == B[k Si B[k][w] == B[k- -1][w], 1][w],
entonces el objeto k no se selecciona y se seleccionan entonces el objeto k no se selecciona y se seleccionan
los objetos correspondientes a la solucin ptima para los objetos correspondientes a la solucin ptima para
k k- -1 objetos y una mochila de capacidad w: 1 objetos y una mochila de capacidad w:
la solucin para B[k la solucin para B[k- -1][w]. 1][w].
Si B[k][w] != B[k Si B[k][w] != B[k- -1][w], 1][w],
se selecciona el objeto k se selecciona el objeto k
y los objetos correspondientes a la solucin ptima y los objetos correspondientes a la solucin ptima
para k para k- -1 objetos y una mochila de capacidad w 1 objetos y una mochila de capacidad w- -w[k]: w[k]:
la solucin para B[k la solucin para B[k- -1][w 1][w- -w[k]]. w[k]].
49 49
Programacin Dinmica Programacin Dinmica
El problema de la mochila 0/1 El problema de la mochila 0/1
Eficiencia del algoritmo Eficiencia del algoritmo
Tiempo de ejecucin: Tiempo de ejecucin: (n W)
Pseudopolinmico (no es polinmico sobre el tamao
de la entrada; esto es, sobre el nmero de objetos). 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(n
2
v*) que proporciona una solucin
aproximada al 0.01% del ptimo [Kleinberg
& Tardos, seccin 11.8: Arbitrarily Good
Approximations: The Knapsack Problem].
50 50
Programacin Dinmica Programacin Dinmica
El problema de la mochila 0/1 El problema de la mochila 0/1
Ejemplo Ejemplo
Mochila de tamao Mochila de tamao W=11 W=11
Nmero de objetos Nmero de objetos n=5 n=5
Solucin ptima Solucin ptima {3,4} {3,4}
1
Valor
18
22
28
1
Peso
5
6
6 2
7
Objeto
1
3
4
5
2
51 51
28 7 5
{ 1, 2 }
{ 1, 2, 3 }
{ 1, 2, 3, 4 }
{ 1 }
{ 1, 2, 3, 4, 5 }
0
0
0
0
0
0
0
1
0
1
1
1
1
1
2
0
6
6
6
1
6
3
0
7
7
7
1
7
4
0
7
7
7
1
7
5
0
7
18
18
1
18
6
0
7
19
22
1
22
7
0
7
24
24
1
28
8
0
7
25
28
1
29
9
0
7
25
29
1
34
10
0
7
25
29
1
35
11
0
7
25
40
1
40
Programacin Dinmica Programacin Dinmica
Caminos mnimos: Algoritmo de Floyd Caminos mnimos: Algoritmo de Floyd
Problema: Problema:
Calcular el camino ms corto que une cada par de Calcular el camino ms corto que une cada par de
vrtices de un grafo, considerando que no hay pesos vrtices de un grafo, considerando que no hay pesos
negativos. negativos.
Posibles soluciones: Posibles soluciones:
Por fuerza bruta (de orden exponencial). Por fuerza bruta (de orden exponencial).
Aplicar el algoritmo de Aplicar el algoritmo de Dijkstra Dijkstra para cada vrtice. para cada vrtice.
Algoritmo de Floyd (programacin dinmica). Algoritmo de Floyd (programacin dinmica).
52 52
Programacin Dinmica Programacin Dinmica
Caminos mnimos: Algoritmo de Floyd Caminos mnimos: Algoritmo de Floyd
Definicin recursiva de la solucin: Definicin recursiva de la solucin:
D D
kk
( (i,j i,j) ): Camino ms corto de i a j usando slo los k : Camino ms corto de i a j usando slo los k
primeros vrtices del grafo como puntos intermedios. primeros vrtices del grafo como puntos intermedios.
Expresin recursiva: Expresin recursiva:
Caso base: Caso base:
53 53
)} , ( ) , ( ), , ( min{ ) , (
1 1 1
j k D k i D j i D j i D
k k k k
+ =
ij
c j i D = ) , (
0
Programacin Dinmica Programacin Dinmica
Caminos mnimos: Algoritmo de Floyd Caminos mnimos: Algoritmo de Floyd
Algoritmo de Floyd (1962): Algoritmo de Floyd (1962): (V
3
)
for for (i=0; i<n; i++) (i=0; i<n; i++)
for for (j=0; j<n; (j=0; j<n; j++ j++) )
D[i][j] = coste( D[i][j] = coste(i,j i,j); );
for for (k=0; k<n; k++) (k=0; k<n; k++)
for for (i=0; i<n; i++) (i=0; i<n; i++)
for for (j=0; j<n; (j=0; j<n; j++ j++) )
if if (D[i][k] + D[k][j] < D[i][j] ) (D[i][k] + D[k][j] < D[i][j] )
D[i][j] = D[i][k] + D[k][j]; D[i][j] = D[i][k] + D[k][j];
54 54
)} , ( ) , ( ), , ( min{ ) , (
1 1 1
j k D k i D j i D j i D
k k k k
+ =
Programacin Dinmica Programacin Dinmica
Caminos mnimos: Algoritmo de Caminos mnimos: Algoritmo de Bellman Bellman- -Ford Ford
Si slo nos interesan los caminos mnimos desde un Si slo nos interesan los caminos mnimos desde un
vrtice concreto del grafo G(V,E), podemos utilizar el vrtice concreto del grafo G(V,E), podemos utilizar el
algoritmo algoritmo greedy greedy de de Dijkstra Dijkstra, de orden , de orden O(E log V) O(E log V), ,
siempre y cuando tengamos siempre y cuando tengamos pesos no negativos pesos no negativos..
El algoritmo de El algoritmo de Dijkstra Dijkstra no funciona con pesos negativos: no funciona con pesos negativos:
Ojo! Ojo!
Tampoco podemos sumarle una constante a cada peso. Tampoco podemos sumarle una constante a cada peso.
55 55
t
s
2
1
3
-6
Programacin Dinmica Programacin Dinmica
Caminos mnimos: Algoritmo de Caminos mnimos: Algoritmo de Bellman Bellman- -Ford Ford
Si tenemos pesos negativos, podemos utilizar el Si tenemos pesos negativos, podemos utilizar el
algoritmo de algoritmo de Bellman Bellman- -Ford, basado en programacin Ford, basado en programacin
dinmica y de orden dinmica y de orden O(EV) O(EV), siempre y cuando no , siempre y cuando no
tengamos ciclos de peso negativo: tengamos ciclos de peso negativo:
N NOTA OTA: Si un camino de s a t incluye un ciclo de peso negativo, : Si un camino de s a t incluye un ciclo de peso negativo,
no existe un camino ms corto de s a t (y, en cualquier caso, no existe un camino ms corto de s a t (y, en cualquier caso,
Bellman Bellman- -Ford tampoco encontrara el camino simple ms corto). Ford tampoco encontrara el camino simple ms corto).
56 56
+
=
=
+
=
=
] [ ] [ )} 1 , 1 ( ), 1 , ( ), , 1 ( min{ 1
] [ ] [ ) 1 , 1 (
) , (
j t i s si j i d j i d j i d
j t i s si j i d
j i d
CASOS CASOS
Mismo carcter: Mismo carcter: d(i d(i- -1,j 1,j- -1) 1)
Insercin: Insercin: 1 + d(i 1 + d(i- -1,j) 1,j)
Borrado: Borrado: 1 + d(i,j 1 + d(i,j- -1) 1)
Modificacin: Modificacin: 1 + d(i 1 + d(i- -1,j 1,j- -1) 1)
59 59
Programacin Dinmica Programacin Dinmica
Distancia de edicin Distancia de edicin
int int LevenshteinDistance LevenshteinDistance ( (string string s[1..m], s[1..m], string string t[1..n]) t[1..n])
{ {
for for (i=0; i<=m; i++) d[i,0]=i; (i=0; i<=m; i++) d[i,0]=i;
for for (j=0; j<=n; (j=0; j<=n; j++ j++) d[0,j]=j; ) d[0,j]=j;
for for (j=1; j<=n; (j=1; j<=n; j++ j++) )
for for (i=1; i<=m; i++) (i=1; i<=m; i++) for for (i=1; i<=m; i++) (i=1; i<=m; i++)
if if (s[i]==t[j]) (s[i]==t[j])
d[ d[i,j i,j] = d[i ] = d[i- -1, j 1, j- -1] 1]
else else
d[ d[i,j i,j] = 1+ min(d[i ] = 1+ min(d[i- -1,j],d[i,j 1,j],d[i,j- -1],d[i 1],d[i- -1,j 1,j- -1]); 1]);
return return d[ d[m,n m,n]; ];
} }
60 60
+
=
=
] [ ] [ )} 1 , 1 ( ), 1 , ( ), , 1 ( min{ 1
] [ ] [ ) 1 , 1 (
) , (
j t i s si j i d j i d j i d
j t i s si j i d
j i d
Programacin Dinmica Programacin Dinmica
Aplicaciones Aplicaciones
Distancia entre dos series temporales: O(n Distancia entre dos series temporales: O(n
22
) )
DTW [ DTW [Dynamic Dynamic Time Time Warping Warping]]
Anlisis sintctico: O(n Anlisis sintctico: O(n
33
))
Algoritmo CKY [ Algoritmo CKY [Cocke Cocke- -Kasami Kasami- -Younger Younger]]
Algoritmo de Algoritmo de Earley Earley Algoritmo de Algoritmo de Earley Earley
Algoritmo de Algoritmo de Viterbi Viterbi: : HMMs HMMs [[Hidden Hidden Markov Markov Models Models]]
Decodificacin de seales (p.ej. Decodificacin de seales (p.ej. modems modems, GSM, , GSM, wi wi- -fi) fi)
Procesamiento del lenguaje natural Procesamiento del lenguaje natural
Bioinformtica Bioinformtica
Optimizacin de consultas en bases de datos relacionales Optimizacin de consultas en bases de datos relacionales
Comparacin de ficheros con Comparacin de ficheros con diff diff
61 61