¡Cookiegeddon! Bye a las cookies de terceros y cómo afectará a tu software
Algoritmos c5-diap
1. Programación Dinámica
Dra. Laura Cruz Reyes
Instituto Tecnológico de Ciudad Madero
México
2. Programación dinámica vs.
divide y vencerás
Divide y vencerás:
Divide el problema en suproblemas.
Integra las soluciones parciales para lograr una solución final.
Repite procesamiento en subproblemas idénticos
Programación dinámica:
Divide el problema en suproblemas.
Integra las soluciones parciales para lograr una solución final.
Durante el proceso de división-integración guarda la solución
de los subproblemas encontrados para evitar resolverlos cuando
los vuelva a encontrar.
Laura Cruz Reyes Programación Dinámica
3. Divide y vencerás
• Si un problema es demasiado grande para
resolverlo de una vez, se descompone en varias
partes más fáciles de resolver.
• Más formalmente, dado un problema a resolver
planteado en términos de una entrada de tamaño
n, la técnica de divide y vencerás parte la entrada
en k subproblemas, 1< k< n.
• Estos subproblemas se resuelven
independientemente y después se combinan sus
soluciones parciales para obtener la solución del
problema original.
Laura Cruz Reyes Programación Dinámica
4. Aplicaciones de
divide y vencerás
Ordenamiento
• Mezcla
• Quicksort
• Heap
Búsqueda
• Búsqueda binaria
Laura Cruz Reyes Programación Dinámica
5. Programación dinámica
Bajo el principio de divide y vencerás se divide un
problema en varios problemas más pequeños que
se pueden resolver independientemente.
En la programación dinámica, aplica cuando los
subproblemas no son independienes. Se
resuelven todos una sóla vez y se almacenan las
respuestas para dar solución a problemas
mayores.
Laura Cruz Reyes Programación Dinámica
6. Programación dinámica
Un problema puede ser resuelto por
programación dinámica si cumple el
principio de Optimalidad:
Cualquier decisión que suponga encontrar la
mejor forma de resolver un pequeño
subproblema es también válida cuando el
subproblema pasa a ser una parte de un
problema mayor
Laura Cruz Reyes Programación Dinámica
7. Programación dinámica
Dos dificultades que pueden surgir en la
programación dinámica son las siguientes:
Puede que no siempre sea posible combinar
las soluciones de dos problemas pequeños
para obtener la de uno mayor.
El número de subproblemas a resolver puede
ser inaceptablemente grande.
Laura Cruz Reyes Programación Dinámica
8. Pasos de la programación
dinámica
El desarrollo de un algoritmo de programación dinámica
puede realizarse en 4 pasos.
1. Caracterizar la estructura de una solución óptima.
2. Definir una estructura para guardar los elementos de
la solución óptima.
3. Definir recursivamente el valor de una solución óptima
y su estructura de almacenamiento.
4. Diseñar un algoritmo para obtener la solución óptima
y su valor usando abajo-arriba (button-up).
5. Diseñar un algoritmo para extraer la solución óptima a
partir de información previamente calculada.
Laura Cruz Reyes Programación Dinámica
9. Aplicaciones de la
programación dinámica
En los siguientes problemas la programación
dinámica es más eficaz que la técnica de fuerza
bruta. Con esta última, el número de posibles
soluciones a evaluar es exponencial.
Problema del orden de multiplicación de matrices
Problema del cambio de moneda
Problema de la mochila 0-1
Problema de la subsecuencia común más larga
Laura Cruz Reyes Programación Dinámica
11. Multiplicación de matrices
Algoritmo multiplicaciónMatrices
Entradas: Matrices A y B, y enteros m, n, y p,
que indican que A es una matriz de m × n y B es
una matriz de n × p
Salidas: Matriz C, una matriz de m × p. C se pasa
al algoritmo, el cual la llena.
multMat(A,B,C,m,n,p)
1. for (i =0; i<m; i++)
2. for (j =0; j<p; j++)
3. cij = 0
4. for (k =0; k<n; k++)
5. cij += aik bkj
Laura Cruz Reyes Programación Dinámica
12. Número de multiplicaciones
Si se desea obtener la evaluación del producto
de n matrices
A = A1 x A2 x.....x An
Donde Ai es una matriz con ri-1 renglones y ri
columnas. El orden de multiplicación de las
matrices afecta al número total de las
operaciones requeridas para evaluar A.
Laura Cruz Reyes Programación Dinámica
13. Número de multiplicaciones
En el algoritmo clásico de multiplicación de una matriz m x n
por una matriz n x p, el número de multiplicaciones es mnp.
Sea el siguiente producto:
A= A1 x A2 x A3 x A4
[10 x 20] [20 x 50] [50 x 1] [1 x 100]
El orden de evaluación
A1 x (A2 x (A3 x A4)) requiere 125,000 operaciones.
El orden de evaluación
(A1 x (A2 x A3)) x A4 requiere 2200 operaciones.
Laura Cruz Reyes Programación Dinámica
14. Número de multiplicaciones
A= A1 x A2 x A3 x A4
[10 x 20] [20 x 50] [50 x 1] [1 x 100]
El orden de evaluación (A1 x (A2 x A3)) x A4 requiere 2200 operaciones
(A2 x A3) con dimensiones [20 x 50] [50 x 1] respectivamente
Requiere 20*50*1=1000 multiplicaciones
Genera la matriz A2A3 con dimensiones [20 x 1]
(A1 x A2A3) con dimensiones [10 x 20] [20 x 1] respectivamente
Requiere 10*20*1=200 multiplicaciones
Genera la matriz A1A2A3 con dimensiones [10 x 1]
(A1A2A3 x A4) con dimensiones [10 x 1] [1 x 100] respectivamente
Requiere 10*1*100=1000 multiplicaciones
Genera la matriz A1A2A3A4 con dimensiones [10 x 100]
Total de multiplicaciones = 1000+200+1000=2200
Laura Cruz Reyes Programación Dinámica
15. Problema del orden de multiplicación
de matrices
Dada una cadena ‹A1, A2,...An› de n matrices,
donde i=1,2,...,n, Ai tiene dimensiones ri-1 x ri .
Se busca poner paréntesis completamente al
producto A1, A2,...An de manera que minimice el
número de operaciones escalares.
Laura Cruz Reyes Programación Dinámica
16. Solución óptima y su valor
Sea el siguiente producto:
A= A1 x A2 x A3 x A4
[10 x 20] [20 x 50] [50 x 1] [1 x 100]
Solución óptima: colocación de paréntesis con menor costo
( ((A1(A2A3)) ((A4A5) A6))
Valor de la solución óptima: mínimo número de multiplicaciones
2200 multiplicaciones
Producto obtenido con el menor número de multiplicaciones
A=( ((A1(A2A3)) ((A4A5) A6))
Laura Cruz Reyes Programación Dinámica
17. Paso 1: Caracterizar la estructura de
una solución óptima
División del problema en subproblemas: Para colocar
paréntesis, dada una cadena de matrices Ai Ai+1 … Aj se divide el
producto en términos de k, con i ≤ k< j, quedando dos
subcadenas: (A1 … Ak) y (Ak+1… An )
1..4
k=1 k=2 k=3
1..1 2..4 1..2 3..4 1..3 4..4
k=2 k=3 k=1 k=3 k=1 k=2
2..2 3..4 2..3 4..4 1..1 2..2 3..3 4..4 1..1 2..3 1..2 3..3
3..3 4..4 2..2 3..3 2..2 3..3 1..1 2..2
k=3 k=2 k=2 k=1
La estructura debe permitir generar soluciones alternas, entre ellas la óptima
Laura Cruz Reyes Programación Dinámica
18. Paso 1: Caracterizar la estructura de
una solución óptima
1..4
k=1 k=2 k=3
1..1 2..4 1..2 3..4 1..3 4..4
k=2 k=3 k=1 k=3 k=1 k=2
2..2 3..4 2..3 4..4 1..1 2..2 3..3 4..4 1..1 2..3 1..2 3..3
3..3 4..4 2..2 3..3 2..2 3..3 1..1 2..2
k=3 k=2 k=2 k=1
A1 x A2 x A3 x A4
k=3
(A1 x A2 x A3) x (A4 )
k=1
((A1 ) x (A2 x A3)) x (A4 )
k=2
((A1 ) x ((A2 ) x (A3 ))) x (A4 )
Laura Cruz Reyes Programación Dinámica
19. Paso 2: Definir una estructura para guardar los
elementos de la solución óptima
Pare construir la solución óptima, se define una matriz
s[i,j], la cual contendrá el valor de k que logra una
colocación óptima de paréntesis.
1..4
k=1 k=2 k=3
1..1 2..4 1..2 3..4 1..3 4..4
k=1 k=2
4..4 1..1 2..3 1..2 3..3
s[1,4]=k_óptima=3 ⇒ (A1 x A2 x A3) x (A4 );
s[1,3]=k_óptima=1 ⇒ ((A1 ) x (A2 x A3)) x (A4 ); 2..2 3..3
s[2,3]=k_óptima=2 ⇒ ((A1 ) x ((A2 ) x (A3 ))) x (A4 ); k=2
Laura Cruz Reyes Programación Dinámica
20. Paso 3: Definir recursivamente el valor
de una solución óptima
Para calcular el número de multiplicaciones de una
solución, se define un arreglo m[i,j] el cual contendra el
costo mínimo de la subcadena Ai … Aj usando el punto
de corte óptimo k:
1..4
Ejemplo: Si k=2, m[1,4] = m[1,2]+m[3,4]+r0r2r4
k=2
1..2 3..4
Ejemplo: Si k=3, m[1,4] = m[1,3]+m[4,4]+r0r3r4 1..4
k=3
1..3 4..4
Laura Cruz Reyes Programación Dinámica
21. Paso 3: Definir recursivamente el valor
de una solución óptima
Sea m[i,j] un arreglo que almacena el costo mínimo de
la subcadena Ai … Aj usando el punto de corte óptimo k.
Por lo tanto, la tabla se llena con la siguiente regla:
Si i == j entonces m[i,j] = 0, quiere decir que la cadena es de
una sola matriz así que no requiere de multiplicaciones
escalares.
Si i < j entonces m[i,j] = min(m[i,k]+ m[k+1,j] +ri-1rkrj), i≤k<j
• El término m[i,k] es el costo mínimo de evaluar A′ = Ai x Ai+1 x...x Ak
• El término m[k+1,j] es el costo mínimo de evaluar A′′ = Ak + 1 x Ak+2 x...x Aj
• El tercer término es el costo de multiplicar A′ x A′′ .
Laura Cruz Reyes Programación Dinámica
23. Paso 4: Diseñar un algoritmo para
obtener la solución óptima y su valor
Valor de solución óptima: Solución óptima:
Matriz de costos mínimos Matriz de cortes óptimos k
m[i,j] s[i,j]
0 1
0
2
0
3
0
Ta
ma
ño
4
1
Laura Cruz Reyes Programación Dinámica
24. Paso 4: Diseñar un algoritmo para
obtener la solución óptima y su valor
Valor de solución óptima: Solución óptima:
Matriz de costos mínimos Matriz de cortes óptimos k
m[i,j] s[i,j]
0 10000 1 1
0 1000
2 2
0 5000
Ta
3 3
0 ma
ño
Ta 2
ma
ño
4
1
Laura Cruz Reyes Programación Dinámica
25. Paso 4: Diseñar un algoritmo para
obtener la solución óptima y su valor
Valor de solución óptima: Solución óptima:
Matriz de costos mínimos Matriz de cortes óptimos k
m[i,j] s[i,j]
0 10000 1200 1 1 1
0 1000 3000
2 2 2
Ta
0 5000 ma
ño
Ta
3 3 3
0 ma
ño
Ta 2
ma
ño
4
1
Laura Cruz Reyes Programación Dinámica
26. Paso 4: Diseñar un algoritmo para
obtener la solución óptima y su valor
Valor de solución óptima: Solución óptima:
Matriz de costos mínimos Matriz de cortes óptimos k
m[i,j] s[i,j]
0 10000 1200 2200 1 1 1 3
Ta
ma
0 1000 3000 ño
4 2 2 2
Ta
0 5000 ma
ño
Ta
3 3 3
0 ma
ño
Ta 2
ma
ño
4
1
Laura Cruz Reyes Programación Dinámica
27. Algoritmo para obtener la
solución óptima y su valor
Algoritmo ordenCadenaMatrices(R)
Entradas:R es el vector de dimensiones de una cadena de n matrices, la
matriz i tiene dimensiones ri-1 x ri
Salidas: M es la matriz de costos mínimos, expresado en número de multiplicaciones
S es la matriz de puntos-de-corte óptimos
1 n ← lenght(R)-1
2 for i = 1 to n do mii= 0 /*costo de cadenas de tamaño 1*/
3 for l = 2 to n do /*tamaño de la cadena*/
4 for i=1 to n–l+1 do /*inicio de la cadena*/
5 j ← i+l–1 /*fin de la cadena*/
6 mij ← ∞
7 for k = i to j-1 do /*punto-corte de cadena*/
8 q ← mik + mk+1,j + ri - 1* rk * rj
9 if q < mij
10 then mij ← q /* valor: mejor costo de cadena*/
11 sij ← k /*solución: mejor punto-corte de cadena*/
Laura Cruz Reyes Programación Dinámica
28. Complejidad del algoritmo
Existen solamente n(n-1)/2 problemas diferentes
(cadenas), y la programación dinámica resuelve
cada problema exactamente una vez*, por lo tanto
T(n)= n2 /2= θ(n2)
* No se están contabilizando las evaluaciones de un mismo problema con diferentes valores de k
Laura Cruz Reyes Programación Dinámica
29. Complejidad del algoritmo
Operación básica: número de subproblemas evaluados*
T(n)=subproblemas de tamaño 1+ suproblemas de tamaños 2 a n
n n − l +1 j −1 n n − l +1 i + l − 2
T ( n) = n + ∑ ∑ ∑ 1 = ∑ ∑ ∑ 1 = Θ( n ) 3
l =2 i =1 k =1 l =2 i =1 k =1
* Si se están contabilizando las evaluaciones de un mismo problema con diferentes valores de k
Laura Cruz Reyes Programación Dinámica
30. Paso 5: Diseñar un algoritmo para
extraer la solución óptima
Matriz s[i,j] Solución óptima: (A1 x (A2 x A3)) x A4
1 1 1 3 A1…A4: s14=3
(A1x A2xA3)x (A4)
2 2 2
3 3 A1…A3: s13=1 A4…A4: s44=4
(A1)x(A2x A3) (A4)
4
A1…A1: s11=1 A2…A3: s23=2
(A!) (A2)x(A3)
A2…A2: s22=2 A3…A3: s33=3
(A2) (A3)
Laura Cruz Reyes Programación Dinámica
31. Algoritmo para calcular un producto
usando el mínimo número de operaciones
Algoritmo multiplicaCadenaMatrices(A,S,i,j)
Entradas: A es una cadena de matrices
S es una matriz que contiene la solución óptima
i,j delimitan una subcadena contenida en A
Salidas: producto de la cadena de matrices
1 if j > i
2 then X ← multiplicaCadenaMatrices(A,S,i,sij)
3 Y ← multiplicaCadenaMatrices(A,S,sij+1,j)
4 return multiplicaMatrix(X,Y)
5 else return Ai
Laura Cruz Reyes Programación Dinámica
32. Algoritmo para calcular un producto
usando el mínimo número de operaciones
Algoritmo multiplicaCadenaMatrices(A,S,1,6)
if 6>1
X = multiplicaCadenaMatrices(A,S,i=1,s1,6=3) R1
Y = multiplicaCadenaMatrices(A,S,s1,6+1=4,j=6) R3
return (multiplicar (X, Y))
Laura Cruz Reyes Programación Dinámica
33. Algoritmo para calcular un producto
usando el mínimo número de operaciones
R1
Algoritmo multiplicaCadenaMatrices(A,S,1,3)
if 3>1
X = multiplicaCadenaMatrices(A,S,1,1) A1
Y = multiplicaCadenaMatrices(A,S,2,3) R2
return (multiplicar (X,Y))
Laura Cruz Reyes Programación Dinámica
34. Algoritmo para calcular un producto
usando el mínimo número de operaciones
R2
Algoritmo multiplicaCadenaMatrices(A,S,2,3)
if 3>2
X = multiplicaCadenaMatrices(A,S,2,2) A2
Y = multiplicaCadenaMatrices (A,S,3,3) A3
return (multiplicar (X,Y)) (A2A3)
Laura Cruz Reyes Programación Dinámica
35. Algoritmo para calcular un producto
usando el mínimo número de operaciones
R1
Algoritmo multiplicaCadenaMatrices(A,S,1,3)
if 3>1
X = multiplicaCadenaMatrices(A,S,1,1) A1
Y = multiplicaCadenaMatrices(A,S,2,3) (A2A3)
return (multiplicar (X,Y)) (A1(A2A3))
Laura Cruz Reyes Programación Dinámica
36. Algoritmo para calcular un producto
usando el mínimo número de operaciones
Algoritmo multiplicaCadenaMatrices(A,S,1,6)
if 6>1
X = multiplicaCadenaMatrices(A,S,1,3)(A1(A2A3))
Y = multiplicaCadenaMatrices(A,S,4,6)R3
return (multiplicar (X,Y))
Laura Cruz Reyes Programación Dinámica
37. Algoritmo para calcular un producto
usando el mínimo número de operaciones
R3
Algoritmo multiplicaCadenaMatrices(A,S,4,6)
if 6>4
X = multiplicaCadenaMatrices(A,S,4,5) R4
Y = multiplicaCadenaMatrices(A,S,6,6) A6
return (multiplicar (X,Y))
Laura Cruz Reyes Programación Dinámica
38. Algoritmo para calcular un producto
usando el mínimo número de operaciones
R4
Algoritmo multiplicaCadenaMatrices(A,S,4,5)
if 5>4
X = multiplicaCadenaMatrices (A,S,4,4) A4
Y = multiplicaCadenaMatrices (A,S,5,5) A5
return (multiplicar (X,Y)) (A4A5)
Laura Cruz Reyes Programación Dinámica
39. Algoritmo para calcular un producto
usando el mínimo número de operaciones
R3
Algoritmo multiplicaCadenaMatrices(A,S,4,6)
if 6>4
X = multiplicaCadenaMatrices (A,S,4,5)A4A5
Y = multiplicaCadenaMatrices (A,S,6,6) A6
return (multiplicar (X,Y)) ((A4A5)A6)
Laura Cruz Reyes Programación Dinámica
40. Algoritmo para calcular un producto
usando el mínimo número de operaciones
Algoritmo multiplicaCadenaMatrices(A,S,1,6)
if 6>1
X = multiplicaCadenaMatrices(A,S,1,3)(A1(A2A3))
Y = multiplicaCadenaMatrices(A,S,4,6) ((A4A5)A6)
return (multiplicar(X Y))((A1(A2A3))((A4A5)A6)
Laura Cruz Reyes Programación Dinámica
41. Algoritmo para obtener una cadena
de matrices con paréntesis
Algoritmo parentizaCadenaMatrices(A,S,i,j)
EntradaS: A es una cadena de matrices sin paréntesis
Salidas: A es la cadena de matrices con paréntesis
1
2
3
4
5
Laura Cruz Reyes Programación Dinámica
42. Algoritmo recursivo para obtener el costo
óptimo de una multiplicación de matrices
Algoritmo ordenCadenaMatricesRecursivo(R,i,j)
Entradas:R es el vector de dimensiones de una cadena de n matrices, la
matriz i tiene dimensiones ri-1 x ri
Salidas: M es la matriz de costos mínimos
1 if i = j then
2 return 0
3 mij= ∞ /*inicializa costo cadena actual*/
4 for k = i to j-1 do /*punto-corte cadena*/
5 q ← ordenCadenaMatricesRecursivo(R,i,k)+
ordenCadenaMatricesRecursivo(R,k+1,j)+ri-1*rk*rj
6 if q < mij
7 then mij ← q
8 return mij
Laura Cruz Reyes Programación Dinámica
43. Complejidad del algoritmo
recursivo
El número de subproblemas evaluados es al
menos exponencial en n
⎧0 para n = 1
⎪
T (n) = ⎨ n −1
⎪1 + ∑ (T (k ) + T (n − k ) + 1) para n > 1
⎩ k =1
⎧0 para n = 1
⎪
T (n) = ⎨ n −1
⎪2∑ T (i ) + n para n > 1
⎩ i =1
T (n) ≥ 2n −1
T (n) = Ω(2n −1 )
Laura Cruz Reyes Programación Dinámica
44. Versión memorizada del
programa recursivo
Variación de la programación dinámica que
combina el enfoque natural de los algoritmos
recursivos con la eficiencia de la programación
dinámica.
Se mantiene una tabla con soluciones de
subproblemas, pero el llenado de la tabla se
realiza bajo el control de un algoritmo recursivo.
Cada entrada de la tabla tiene una bandera que
se prende cuando esta ha sido calculada.
Laura Cruz Reyes Programación Dinámica
45. Versión memorizada del
programa recursivo
LOOKUP-CHAIN(p,i,j)
1 if i = j
MEMOIZED-MATRIX-CHAIN(p)
2 then return 0
1 n ← length[p] - 1
3 m[i,j] ← ∞
2 for i ← 1 to n
4 for k ← 1 to j -1
3 do for j ← 1 to n
5 do q ← LOOKUP-CHAIN
4 do m[i,j] ← ∞
(p,i,k)
5 return LOOKUP-CHAIN(p,1,n)
+ LOOKUP-CHAIN
(p,k+1,j)
+ pi-1pkpj
6 if q < m[i,j]
7 then m[i,j] ← q
8 return m[i,j]
Laura Cruz Reyes Programación Dinámica
46. Complejidad del algoritmo
recursivo-memorizado
Existen solamente n(n-1)/2 problemas diferentes
(cadenas), y el algoritmo recursivo-memorizado
resuelve cada problema exactamente una vez, por
lo tanto:
T(n)= θ(n2)
Sin embargo, la versión pura es más eficiente por
un factor constante debido que no hay sobrecarga
inherente a la recursión.
Laura Cruz Reyes Programación Dinámica
48. Problema del cambio de
moneda
Dada una divisa (unidad monetaria de un
país) con monedas de u1, u2,…,un, y C
unidades que deben ser devueltas a un
cliente.
Se busca el número mínimo de monedas
que se necesitan para devolver las C
unidades de cambio.
Laura Cruz Reyes Programación Dinámica
51. Valor de una solución óptima
Sea m[C] un arreglo que almacena el menor número
de monedas para devolver la cantidad C usando una
moneda óptima u ∈ U. Por lo tanto, la tabla se llena
con la siguiente regla:
Si C = 0 entonces m[C] = 0, quiere decir que no se requiere
ninguna moneda para devolver una cantidad igual a cero.
Si C > 0 entonces m[C] = min(1+ m[C-u]), ∀ u ∈ U, quiere
decir que se utilizará una moneda óptima de denominación
u más las monedas requeridas para devolver una cantidad
igual a C-u.
Laura Cruz Reyes Programación Dinámica
52. Complejidad del algoritmo
El tiempo de ejecución depende del número de
monedad con distintos valores n y de la cantidad
de cambio que queremos devolver C, por lo tanto:
T(n)= nC
Laura Cruz Reyes Programación Dinámica
53. Algoritmo para cambio de
monedas
Consultar el libro de Mark Allen
(pag. 201)
Laura Cruz Reyes Programación Dinámica
55. El Problema de la Mochila 0-1
Se tienen n objetos, cada uno con un peso pi, y una
mochila con una capacidad C. Si se mete un objeto i en la
mochila, entonces se consigue un beneficio bi. El objetivo
es llenar la mochila de manera que se maximice el
beneficio total y no se exceda la capacidad de la mochila.
Para la asignación de los objetos se utiliza un vector X de n
elementos xi, caracterizado porque cada elemento xi sólo
puede tomar los valores cero o uno para indicar si el objeto
se mete o no a la mochila.
Laura Cruz Reyes Programación Dinámica
56. El Problema de la Mochila 0-1
Dada una mochila con capacidad C y un conjunto de
n objetos; cada objeto i, 1≤ i≤n, tiene un peso pi > 0 y
un beneficio b i > 0.
Se busca una asignación en X (xi=1 si el objeto se
lleva, xi=0 en caso contrario) de objetos a la mochila
que obtenga el máximo beneficio:
n
maximizar ∑ bixi,
i=1
y satisfaga la condición:
n
∑ pi xi ≤ C
i=1
Laura Cruz Reyes Programación Dinámica
57. El Problema de la Mochila 0-1
Un caso particular del problema de la mochila 0-1 es:
n=3,
C=15,
(b1,b2,b3) = (38, 40, 24) y
(p1,p2,p3) = (9,6,5).
Una posible solución es:
(x1,x2,x3) = (0,1,1), con beneficio 64.
Para este caso, la solución óptima es:
(x1,x2,x3) = (1,1,0) con beneficio 78.
Laura Cruz Reyes Programación Dinámica
58. Valor de una solución óptima
Sea m[i,j] un arreglo que almacena el valor máximo de
los objetos que podemos transportar si el límite de peso
es j, con 0≤j ≤ C, y si solamente incluimos los objetos
numerados desde 1 hasta el i, con 1≤i ≤n. Por tanto, la
solución se puede encontrar en m[n,C]. La tabla se llena
n,C
con la regla:
Si j=0 entonces m[i,0] = 0, quiere decir que ningún objeto se
puede acomodar en una mochila de capacidad cero.
Si j>0 entonces m[i,j] = max (m[i-1, j], m[i-1, j-pi] + bi), quiere
decir que se evalúa la opción de no añadir el objeto i a la
carga contra la opción de incluirlo, lo cual tiene como efecto
incrementar el valor de la carga en bi, y reducir la capacidad
disponible en pi.
Laura Cruz Reyes Programación Dinámica
60. Complejidad del algoritmo
El tiempo de ejecución depende del número de
objetos por acomodar n y de la capacidad de la
mochila C, por lo tanto:
T(n)= nC
Laura Cruz Reyes Programación Dinámica
61. Algoritmo para la mochila 0-1
Consultar el libro de Brassard et.al
(pag. 201)
Laura Cruz Reyes Programación Dinámica
62. El Problema de la Mochila 0-1
con repetición
Una variante del problema de la mochila 0-1 admite
objetos repetidos en la mochila. Para representar el
número de objetos repetidos se utiliza el vector r.
n=5,
C=17,
(b1,b2,b3,b4,b5) = (4,5,10,11,13)
(p1,p2,p3,p4,p5) = (3,4,7,8,9).
La solución óptima es:
(x1,x2,x3,x4,x5) = (1,0,1,0,0) y
(r1,r2,r3,r4,r5) = (1,0,2,0,0), con beneficio 24.
Laura Cruz Reyes Programación Dinámica
64. El problema de la subsecuencia
común más larga
Dada una secuencia X = ‹x1,x2,...xm›, otra
secuencia Z=‹z1,z2,...zk› es una subsecuencia of X
si existe una secuencia de índices ‹i1,i2,...ik› de X
que incrementa estrictamente tal que para todo
j=1,2,...,k, we have xij = zj.
Por ejemplo, Z=<B,C,D,B> es una subsecuencia
de X=<A,B,C,B,D,A,B> con la correspondiente
secuencia de índices <2,3,5,7>.
Laura Cruz Reyes Programación Dinámica
65. Algoritmo para subsecuencia
común más larga
Consultar el libro de Cormen et. al
(pag. 353)
Laura Cruz Reyes Programación Dinámica
66. Bibliografía
Thomas H. Cormen, Charles E. Leiserson, Ronald L.
Rivest. Introduction to Algorithms. MIT Press, 1990.
Sara Basse, Allen Van Gelder. Algoritmos
Computacionales: Introducción al análisis y diseño. 3ª.
edición. Addison Wesley, 2002.
Mark Allen Weiss. Estructura de Datos en Java.
Addison Weasley, 2000.
Gilles Brassard y Paul Bratley. Fundamentos de
Algoritmia. Prentice Hall, 1997.
Laura Cruz Reyes Programación Dinámica