Algoritmos c5-diap
-
Upload
sherlockgomez -
Category
Technology
-
view
736 -
download
0
description
Transcript of Algoritmos c5-diap
Dra. Laura Cruz ReyesInstituto Tecnológico de Ciudad Madero
México
Programación Dinámica
Laura Cruz Reyes Programación Dinámica
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
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ñon, 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
Aplicaciones de divide y vencerás
Ordenamiento• Mezcla• Quicksort• Heap
Búsqueda• Búsqueda binaria
Laura Cruz Reyes Programación Dinámica
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
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
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
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
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 matricesProblema del cambio de monedaProblema de la mochila 0-1Problema de la subsecuencia común más larga
Problema del orden de multiplicación de matrices
Laura Cruz Reyes Programación Dinámica
Multiplicación de matricesAlgoritmo 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 = 04. for (k =0; k<n; k++)5. cij += aik bkj
Laura Cruz Reyes Programación Dinámica
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 ricolumnas. 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
Número de multiplicacionesEn el algoritmo clásico de multiplicación de una matriz m x npor 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
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] respectivamenteRequiere 20*50*1=1000 multiplicacionesGenera la matriz A2A3 con dimensiones [20 x 1]
(A1 x A2A3) con dimensiones [10 x 20] [20 x 1] respectivamenteRequiere 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] respectivamenteRequiere 10*1*100=1000 multiplicaciones Genera la matriz A1A2A3A4 con dimensiones [10 x 100]
Total de multiplicaciones = 1000+200+1000=2200
Número de multiplicaciones
Laura Cruz Reyes Programación Dinámica
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
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 multiplicaciones2200 multiplicaciones
Producto obtenido con el menor número de multiplicacionesA=( ((A1(A2A3)) ((A4A5) A6))
Solución óptima y su valor
Laura Cruz Reyes Programación Dinámica
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 )
Paso 1: Caracterizar la estructura de una solución óptima
1..4
1..1 2..4
2..3 4..42..2
1..2
2..21..1
3..4
4..43..3
1..3
1..2 3..32..31..1
4..4
2..2 3..3 2..2 3..3
k=1 k=2 k=3
k=2 k=3 k=1
k=2 k=2
3..4
4..43..3k=3
k=1 k=3 k=2
La estructura debe permitir generar soluciones alternas, entre ellas la óptima
1..1 k=12..2
Laura Cruz Reyes Programación Dinámica
A1 x A2 x A3 x A4k=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 )
1..4
1..1 2..4
2..3 4..42..2
1..2
2..21..1
3..4
4..43..3
1..3
1..2 3..32..31..1
4..4
2..2 3..3 2..2 3..3
k=1 k=2 k=3
k=2 k=3 k=1
k=2 k=2
3..4
4..43..3k=3
k=1 k=3 k=2
1..1 k=12..2
Paso 1: Caracterizar la estructura de una solución óptima
Laura Cruz Reyes Programación Dinámica
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.
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 ); s[2,3]=k_óptima=2 ⇒ ((A1 ) x ((A2 ) x (A3 ))) x (A4 );
1..4
1..1 2..4 1..2 3..4
4..4
1..3
1..2 3..32..31..1
4..4
2..2 3..3
k=1 k=2 k=3
k=1
k=2
k=2
Laura Cruz Reyes Programación Dinámica
Paso 3: Definir recursivamente el valorde una solución óptima
Para calcular el número de multiplicaciones de una solución, se define un arreglo mm[[i,ji,j]] el cual contendra el costo mínimo de la subcadena AAii … AAjj usando el punto de corte óptimo k:
Ejemplo: Si k==22,, m[1,4] = m[1,2]+m[3,4]+r0r2r4
Ejemplo: Si k==33,, m[1,4] = m[1,3]+m[4,4]+r0r3r4
1..4
1..2 3..4k=2
1..4
1..3 4..4k=3
Laura Cruz Reyes Programación Dinámica
Paso 3: Definir recursivamente el valorde una solución óptima
Sea mm[[i,ji,j]] un arreglo que almacena el costo mínimo de la subcadena AAii … AAjj usando el punto de corte óptimo k. Por lo tanto, la tabla se llena con la siguiente regla:
Si ii == j== j entonces mm[[i,ji,j]] = 0, quiere decir que la cadena es de una sola matriz así que no requiere de multiplicaciones escalares.
Si i < ji < j entonces mm[[i,ji,j]] = min(mm[[i,ki,k]+ ]+ mm[[kk++11,j,j]] +ri-1rkrj), ii≤≤k<jk<j
• El término mm[[i,ki,k]] es el costo mínimo de evaluar A′ = Ai x Ai+1 x...x Ak• El término mm[[kk++11,j,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
Tamaño subcadena/nivel de procesamiento
1 m11= 0 m22= 0 m33= 0 m44= 02 m12= 10,000 m23= 1000 m34= 50003 m13= 1200 m24= 30004 m14= 2200
Paso 4: Diseñar un algoritmo para obtener la solución óptima y su valor
Abajo(button)
Arriba(up)
1..4
1..1 2..4
2..3 4..42..2
1..2
2..21..1
3..4
4..43..3
1..3
1..2 3..32..31..1
4..4
2..2 3..3 2..2 3..3
K=1 K=2 K=3
K=2 K=3 K=1
K=2 K=2
3..4
4..43..3K=3
K=1 K=3 K=2
1..1 K=12..2
Laura Cruz Reyes Programación Dinámica
0
0
0
0
4
3
2
1
Tamaño 1
Paso 4: Diseñar un algoritmo para obtener la solución óptima y su valor
Valor de solución óptima:
Matriz de costos mínimos m[i,j]
Solución óptima:
Matriz de cortes óptimos ks[i,j]
Laura Cruz Reyes Programación Dinámica
0
50000
10000
100000
4
33
22
11
Tamaño 2Tamaño 1
Paso 4: Diseñar un algoritmo para obtener la solución óptima y su valor
Valor de solución óptima:
Matriz de costos mínimos m[i,j]
Solución óptima:
Matriz de cortes óptimos ks[i,j]
Laura Cruz Reyes Programación Dinámica
0
50000
300010000
1200100000
4
33
222
111
Tamaño 2
Tamaño 3
Tamaño 1
Paso 4: Diseñar un algoritmo para obtener la solución óptima y su valor
Valor de solución óptima:
Matriz de costos mínimos m[i,j]
Solución óptima:
Matriz de cortes óptimos ks[i,j]
Laura Cruz Reyes Programación Dinámica
0
50000
300010000
22001200100000
4
33
222
3111
Tamaño 2
Tamaño 3
Tamaño 4
Tamaño 1
Paso 4: Diseñar un algoritmo para obtener la solución óptima y su valor
Valor de solución óptima:
Matriz de costos mínimos m[i,j]
Solución óptima:
Matriz de cortes óptimos ks[i,j]
Laura Cruz Reyes Programación Dinámica
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 riSalidas: 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)-12 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 * rj9 if q < mij10 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
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
Complejidad del algoritmo
Laura Cruz Reyes Programación Dinámica
Complejidad del algoritmo
211 13
2 1 1 2 1 1( ) 1 1 ( )
i ljn n l n n l
l i k l i kT n n n
+ −−− + − +
= = = = = =
= + = = Θ∑ ∑ ∑ ∑ ∑ ∑
Operación básica: número de subproblemas evaluados*
T(n)=subproblemas de tamaño 1+ suproblemas de tamaños 2 a n
* Si se están contabilizando las evaluaciones de un mismo problema con diferentes valores de k
Laura Cruz Reyes Programación Dinámica
Matriz s[i,j]
4
33
222
3111
Solución óptima: (A1 x (A2 x A3)) x A4
A1…A4: s14=3(A1x A2xA3)x (A4)
A1…A3: s13=1 A4…A4: s44=4(A1)x(A2x A3) (A4)
A1…A1: s11=1 A2…A3: s23=2(A!) (A2)x(A3)
A2…A2: s22=2 A3…A3: s33=3(A2) (A3)
Paso 5: Diseñar un algoritmo para extraer la solución óptima
Laura Cruz Reyes Programación Dinámica
Algoritmo para calcular un productousando 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 óptimai,j delimitan una subcadena contenida en A
Salidas: producto de la cadena de matrices
1 if j > i2 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
Algoritmo multiplicaCadenaMatrices(A,S,1,6)if 6>1
X = multiplicaCadenaMatrices(A,S,i=1,s1,6=3) R1Y = multiplicaCadenaMatrices(A,S,s1,6+1=4,j=6) R3
return (multiplicar (X, Y))
Algoritmo para calcular un productousando el mínimo número de operaciones
Laura Cruz Reyes Programación Dinámica
R1R1Algoritmo 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))
Algoritmo para calcular un productousando el mínimo número de operaciones
Laura Cruz Reyes Programación Dinámica
R2R2Algoritmo 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)
Algoritmo para calcular un productousando el mínimo número de operaciones
Laura Cruz Reyes Programación Dinámica
R1R1Algoritmo 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))
Algoritmo para calcular un productousando el mínimo número de operaciones
Laura Cruz Reyes Programación Dinámica
Algoritmo multiplicaCadenaMatrices(A,S,1,6)if 6>1
X = multiplicaCadenaMatrices(A,S,1,3)(A1(A2A3))Y = multiplicaCadenaMatrices(A,S,4,6)R3return (multiplicar (X,Y))
Algoritmo para calcular un productousando el mínimo número de operaciones
Laura Cruz Reyes Programación Dinámica
R3Algoritmo multiplicaCadenaMatrices(A,S,4,6)
if 6>4
X = multiplicaCadenaMatrices(A,S,4,5) R4Y = multiplicaCadenaMatrices(A,S,6,6) A6return (multiplicar (X,Y))
Algoritmo para calcular un productousando el mínimo número de operaciones
Laura Cruz Reyes Programación Dinámica
R4Algoritmo 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)
Algoritmo para calcular un productousando el mínimo número de operaciones
Laura Cruz Reyes Programación Dinámica
R3Algoritmo 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)
Algoritmo para calcular un productousando el mínimo número de operaciones
Laura Cruz Reyes Programación Dinámica
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)
Algoritmo para calcular un productousando el mínimo número de operaciones
Laura Cruz Reyes Programación Dinámica
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éntesisSalidas: A es la cadena de matrices con paréntesis
12345
Laura Cruz Reyes Programación Dinámica
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 riSalidas: M es la matriz de costos mínimos
1 if i = j then2 return 03 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 < mij7 then mij ← q8 return mij
Laura Cruz Reyes Programación Dinámica
Complejidad del algoritmo recursivo
1
1
1
0 para 1( )
1 ( ( ) ( ) 1) para 1
0 para 1( )
2 ( ) para 1
n
k
n
i
nT n
T k T n k n
nT n
T i n n
−
=
=
=⎧⎪= ⎨ + + − + >⎪⎩
==
+ >
∑
1
1
1
( ) 2( ) (2 )
n
n
T nT n
−
−
−
⎧⎪⎨⎪⎩
≥
= Ω
∑
El número de subproblemas evaluados es al menos exponencial en n
Laura Cruz Reyes Programación Dinámica
Versión memorizada del programa recursivo
Variación de la programación dinámica quecombina el enfoque natural de los algoritmosrecursivos con la eficiencia de la programacióndiná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 quese prende cuando esta ha sido calculada.
Laura Cruz Reyes Programación Dinámica
Versión memorizada del programa recursivo
LOOKUP-CHAIN(p,i,j)1 if i = j2 then return 03 m[i,j] ← ∞4 for k ← 1 to j -15 do q ← LOOKUP-CHAIN
(p,i,k)+ LOOKUP-CHAIN
(p,k+1,j) + pi-1pkpj
6 if q < m[i,j]7 then m[i,j] ← q8 return m[i,j]
MEMOIZED-MATRIX-CHAIN(p)1 n ← length[p] - 12 for i ← 1 to n3 do for j ← 1 to n4 do m[i,j] ← ∞5 return LOOKUP-CHAIN(p,1,n)
Laura Cruz Reyes Programación Dinámica
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.
Complejidad del algoritmo recursivo-memorizado
Problema del cambio de moneda
Laura Cruz Reyes Programación Dinámica
Problema del cambio de moneda
Dada una divisa (unidad monetaria de un país) con monedas de u1, u2,…,un, y Cunidades que deben ser devueltas a un cliente.
Se busca el número mínimo de monedasque se necesitan para devolver las Cunidades de cambio.
Laura Cruz Reyes Programación Dinámica
Árbol de problemas
C=10U=1,5, 10, 15, 21,25
m=1S=10
u=1C=5
u=5C=0
u=1C=4
u=1C=3
u=1C=2
u=1C=1
u=1C=0
u=1C=9
u=1C=8
u=1C=7
u=1C=6
C=10
u=5C=5
u=10C=0
u=5C=0
m=5
m=4
m=3
m=2
m=5
m=4
m=3
m=2
m=1
m=1
m=1
m=1
m=6
m=2
…
…
…
…
Laura Cruz Reyes Programación Dinámica
Árbol de problemas
C=7U=1,5, 10, 15, 21,25
m=3S=1,1,5
m=1
C = 7
u=1 u=5
C=6 C=2
u=1 u=5
C=5 C=1
u=1 u=5 u=1
u=1
C=4 C=0
C=3
u=1
C=2
u=1
C=1
u=1
u=1
C=1
u=1
m=1
m=2
m=3
m=1
m=2
m=2
m=3
m=4
m=1
m=3
m=2
C=0 C=0
C=0
m=5
Laura Cruz Reyes Programación Dinámica
Sea mm[[CC]] 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 C = 0 entonces mm[[CC]] = 0, quiere decir que no se requiere ninguna moneda para devolver una cantidad igual a cero.
Si C > C > 00 entonces mm[[CC]] = min(1+ mm[[CC--uu]), ]), ∀ ∀ 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.
Valor de una solución óptima
Laura Cruz Reyes Programación Dinámica
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
Complejidad del algoritmo
Laura Cruz Reyes Programación Dinámica
Algoritmo para cambio de monedas
Consultar el libro de Mark Allen (pag. 201)
Problema de la mochila 0-1
Laura Cruz Reyes Programación Dinámica
El Problema de la Mochila 0-1Se 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 nelementos 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
El Problema de la Mochila 0-1Dada 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
∑ p i x i ≤ Ci=1
Laura Cruz Reyes Programación Dinámica
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
Valor de una solución óptima
Sea mm[[i,ji,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 mm[[n,Cn,C]. La tabla se llena con la regla:
Si j=j=00 entonces mm[[ii,,0]0] = 0, quiere decir que ningún objeto se puede acomodar en una mochila de capacidad cero.
Si j>j>00 entonces mm[[i,ji,j]] = max (mm[[ii--11, j, j], ], mm[[ii--11, j, 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
Valor de una solución óptima
capacidad de la mochila C=11Peso de los objetos P=1,2,5,6,7Beneficio de los objetos B=1,6,18,22,28
5
4
3
2
1
11109876543210
4035342928221877610
4029292824221877610
2525252524191877610
777777777610
111111111110
Laura Cruz Reyes Programación Dinámica
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
Complejidad del algoritmo
Laura Cruz Reyes Programación Dinámica
Algoritmo para la mochila 0-1
Consultar el libro de Brassard et.al(pag. 201)
Laura Cruz Reyes Programación Dinámica
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.
Problema de la subsecuencia común
más larga
Laura Cruz Reyes Programación Dinámica
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 Xsi existe una secuencia de índices ‹i1,i2,...ik› de Xque 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
Algoritmo para subsecuenciacomún más larga
Consultar el libro de Cormen et. al (pag. 353)
Laura Cruz Reyes Programación Dinámica
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.