Algoritmos c5-diap

Post on 06-Jul-2015

738 views 0 download

description

Programación dinámica

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.