Bibliografía: (Horowitz,97) (Brassard,97) (Cormen,91) 4. Ejemplos. 3. Esquema iterativo. 2. Esquema recursivo. 1. Introducción PROGRAMACIÓN DINÁMICA Solución: Secuencia de decisiones Ejemplos: Cambio de monedas, Mochila, Camino mínimo en un grafo. - Restricciones - Función objetivo. Problemas de optimización. 1. Introducción – 11x1000 (11 billetes) – 5x2000+1x1000 (6 billetes) – 2x5000+1x1000 (3 billetes) • La estrategia voraz consiste en coger el billete más grande que se pueda cada vez. • Suministrar la cantidad de billetes solicitada de forma que el número total de billetes sea mínimo. • Ejemplo: M=11000 pts, B={1000, 2000, 5000} Ejemplo: Cajero automático –A veces no hay solución; p.e. Si M=3000 y no hay billetes de 1000 –A veces no la encuentra; p.e. M=11000 y no hay billetes de 1000 –A veces encuentra una factible pero no óptima; p.e. B={100, 500, 1100, 5000} y M=6500. La solución que se obtendría sería: 1x5000+1x100+4x100 (6 billetes) i =1 i i ∑ p ⋅x N N i =1 con la restricción de que los objetos quepan en la mochila ∑ wi ⋅ xi ≤ M Obtener el máximo beneficio Resultado: (x1.. xN ), 0 ≤ xi ≤ 1 Datos: (p1.. pN ), (w1.. wN ), M Problema: ¿Qué objetos debemos introducir en la mochila para que el valor total sea máximo? Se permite que se fraccionen los elementos. Sea una mochila de capacidad M y N objetos. Cada objeto tiene un volumen wi y un valor pi, 1≤i≤N. El problema de la mochila con fraccionamiento a) b) c) d) (1/2, 1/3, 1/4) (1, 2/15, 0) (0, 2/3, 1) (0, 1, 1/2) SOLUCION 16.50 20.00 20.00 20.00 PESO 24.25 28.20 31.00 31.50 VALOR Criterio de selección de los objetos que se van metiendo: - El de mayor relación valor/peso La solución óptima debe llenar la mochila completamente. Sólo se fracciona el último. Soluciones factibles: Ejemplo: M=20, w=(18,15,10) p=(25,24,15) Mochila con fraccionamiento (cont) Solución= (1, 0, 10/15, 1) Beneficio= 25+10/15*12+10=42.99; - Selección: El de mayor relación valor/peso pi / wi =(5/30, 13/18,12/15,10/10) Peso=50; Ejemplo: M=50, w=(30,18,15,10) p=(25,13,12,10) Mochila con fraccionamiento (cont) ∀ ( x1 , x2 ,..., xn ) max i i i =1 ∑ b ⋅x n Solución: (x1,x2,…,xn) i =1 i i ∑ p ⋅x n 0 xi = 1 ≤M Conjunto n de objetos con pesos (pi) y beneficios (bi) Mochila de capacidad M. Encontrar el subconjunto de objetos que caben en la mochila y que maximizan el beneficio. Mochila sin fraccionamiento 2 2 4 5 6 3 3 4 1 8 4 5 6 6 F=6 Solución: Coste(6) i =1 0 cos te(i ) = { cos te( j ) + c ( j , i )} 1 < i ≤ F ∀j∈min pred ( i ) 1 3 Ejemplo: Problema del Rio Congo 2 2 4 5 6 3 3 4 1 8 4 5 6 6 F=6 Solución: Coste(1) i=F 0 cos te(i ) = { cos te( j ) + c (i, j )} 1 ≤ i < F ∀jmin ∈suc ( i ) 1 3 Problema del Rio Congo fsi fPDR sino PDR:= x ∈alternativas(A) opt {calculo(PDR(x),coste(A, x))} si contorno(A) entonces PDR:=trivial(A) esquema PDR (A:λ): R Esquema recursivo: X '∈ X X * = arg max F ( X ' ) Hay que encontrar la secuencia X*∈X, tal que F(X*) sea óptima. Sea un problema cuyo conjunto de soluciones es X, y la función objetivo F:X→ R+ 2. Esquema recursivo. Coste(4) Coste(1) 1 2 3 Coste(1) Coste(2) Coste(5) Coste(4) 2 4 5 6 3 3 Coste(1) 4 1 8 4 5 6 6 Coste(1) Coste(1) Coste(2) Coste(1) Coste(2) Coste(1) Coste(1) Coste(2) Coste(3) Coste(2) Coste(1) Coste(2) Coste(3) Coste(3) Coste(6) 2 2 4 5 6 3 3 4 1 8 4 5 6 6 T[1]:=0 T[2]:= min{T[1]+c(1,2)}=0+2=2 T[3]:= min {T[1]+c(1,3), T[2]+c(2,3)}= min{0+3, 2+4}=3 T[4]:= min {T[2]+c(2,4), T[3]+c(3,4)}= min{2+5, 3+3}=6 T[5]:= min {T[2]+c(2,5), T[4]+c(4,5)}= min{2+6, 6+1}=7 T[6]:= min {T[3]+c(3,6), T[4]+c(4,6), T[5]+c(5,6)}= min {3+8, 6+4, 7+6}= 10 Ordenación de subproblemas: 1,2,3,4,5,6 Tabla de almacenamiento T: vector [1..F] de R 1 3 2 2 0 1 3 3 4 6 6 7 10 5 fpara cmin:=T[F ]; ffunción. j∈ pred ( i ) T [i ] := min {T [ j ] + c( j , i )} para i:= 2 hasta F hacer Algoritmo iterativo función cmin (G=(V,A)):R; var T: vector [ 1..F ] of R; T [1] :=0; fPDI PDI:=T[pn]; fpara fsi sino T[p i ]: = x ∈alternativa(p i ) opt i i {calculo(T[p ], coste(x, p ))} si pi ∈contorno(A) entonces T[pi]:=trivial(pi) para i:=1 hasta n hacer var T: Tabla[p] de R ; i:N; fvar /* Sea n el número de subproblemas */ /* Sean pi los “nombres” nombres de los subproblemas ordenados pi ≤pi+1*/ Esquema PDI(A: λ): R 3. Esquema iterativo T 2 2 0 1 3 3 4 6 5 6 7 10 C 1 -1 T[i] := T[jmejor]+c(jmejor,i); C[i] :=jmejor; fpara L:=insertar (listavacia, F); i:=F; mientras C [i] <>-1 hacer L:= insertar (L, C [i] ); i:= C [i]; fmientras; cmin:=(T[F ],L); ffunción j∈ pred ( i ) jmejor := min {T [ j ] + c( j , i )} T [1] :=0; C [1]:=−1; para i:= 2 hasta F hacer 2 1 3 1 Algoritmo iterativo función cmin (G=(V,A)):(R, Lista de N); var T: vector [ 1..F ] of R; C: vector [ 1..F ] of N; L:Lista de N; 4 3 5 4 6 4 (0,0) (i,j) (i,j-1) (i-1,j) (i-1,j-1) 1) Camino óptimo. 4. EJEMPLOS (I,J) Solución: coste(I,J) 0 cos te(i, j − 1) + d[(i, j),(i, j − 1)] cos te(i − 1, j) + d[(i, j),(i − 1, j)] cos te(i, j) = cos te(i, j − 1) + d[(i, j),(i, j − 1)], − + − min cos te ( i 1 , j ) d [( i , j ),( i 1 , j )], cos te(i − 1, j − 1) + d[(i, j),(i − 1, j − 1) (i > 1) ∧ ( j = 1) (i > 1) ∧ ( j = 1) (i = 1) ∧ ( j = 1) (i = 1) ∧ ( j > 1) (1,1) (i,j) (i,j-1) (i-1,j) (i-1,j-1) (I,J) 1 2 3 4 5 6 7 1 2 T: matriz[1..I,1..J] de R; 3 4 5 6 7 fpara fpara coste:=T[I,J]; fin T[i − 1, j ] + d [(i , j ), (i − 1, j )], T[i , j ]: = min T[i , j − 1] + d [(i , j ), (i , j − 1)], T[i − 1, j − 1] + d [(i , j ),(i − 1, j − 1)] T[1,1]:=0 para j:=2 hasta J hacer T[1,j]:=T[1,j-1]+d[(1,j),(1,j-1)] fpara para i:=2 hasta I hacer T[i,1]:=T[i-1,1]+d[(i,1),(i-1,1)] para j:=2 hasta J hacer Función coste (I,J:N):R; var T: matriz[1..I,1..J] de R; 1 2 3 4 5 6 7 1 2 T: matriz[1..I,1..J] de R; 3 4 5 6 7 1 2 3 4 5 6 7 1 V1 V2 2 V1 V2 V1,V2: vector[1..J] de R; 3 4 5 6 7 fpara V1:=V2; fpara coste:=V2[J]; fin V 1[ j ] + d [(i, j ), (i − 1, j )], V 2[ j ] := min V 2[ j − 1] + d [(i, j ), (i, j − 1)], V 1[ j − 1] + d [(i, j ), (i − 1, j − 1)] V1[1]:=0 para j:=2 hasta J hacer V1[j]:=V1[j-1]+d[(1,j),(1,j-1)] fpara para i:=2 hasta I hacer V2[1]:=V1[1]+d[(i,1),(i-1,1)] para j:=2 hasta J hacer Función coste (I,J:N):R; var V1,V2: vector[1..J] de R; Reducción del coste espacial (1) fpara iant:=(iant+1)mod 2; isig:= (isig+1) mod 2; fpara coste:=T[isig,J]; fin T[0,1]:=0 para j:=2 hasta J hacer T[0,j]:=T[0,j-1]+d[(1,j),(1,j-1)] fpara iant:=0; isig:=1; para i:=2 hasta I hacer T[isig,1]:=T[iant,1]+d[(i,1),(i-1,1)] para j:=2 hasta J hacer T [iant , j ] + d [(i, j ), (i − 1, j )], T [isig , j ] := min T [isig , j − 1] + d [(i, j ), (i, j − 1)], T [iant , j − 1] + d [(i, j ), (i − 1, j − 1)] Función coste (I,J:N):R; var T: matriz [0,1,1..J] de R; Reducción del coste espacial (2) 1 iant iant isig isig 0 (1,1) (i,j) (i,j-1) (i+1,j-1) (i-1,j) (i-1,j-1) Camino óptimo permitiendo diversos puntos de salida y llegada (I,J) fpara fpara coste:= min{T [i, J ]} 1≤i≤ I fin ; T [i − 1, j ] + d [(i, j ), (i − 1, j )], T [i , j − 1] + d [(i, j ), (i , j − 1)], T [i, j ] := min − − + − − T i j d i j i j [ 1 , 1 ] [( , ), ( 1 , 1 )] T [i + 1, j − 1] + d [(i , j ), (i + 1, j − 1)] para i:=1 hasta I hacer T[i,1]:=0 fpara para j:=2 hasta I hacer T[1,j]:= min{T[1,j-1]+d[(1,j),(1,j-1)], T[2,j-1]+d[(2,j),(1,j-1)]} T[I,j]:= min{T[I-1,j-1]+d[(I-1,j),(I,j-1)], T[I,j-1]+d[(I,j),(I,j-1)], T[I-1,j]+d[(I-1,j),(I,j)]} para i:=2 hasta I-1 hacer Función coste (I,J:N):R; var T: matriz[1..I,1..J] de R; Ejemplo de aplicación: Sean n recursos que deben asignarse a r proyectos. Si j (0<=j<=n) recursos se asignan al proyecto i, el beneficio resultante es N(i,j). El problema es asignar los recursos a los r proyectos de modo que se maximice el beneficio total. 2) Asignación de recursos. Grafo multietapa. (1,1) 1 K=1 5 6 9 (3,2) 4 (2,2) 3 (1,2) 2 K=2 2 7 1 3 4 (2,3) 6 (1,3) 5 K=3 5 3 (1,4) 7 K=4 min {c[( j, k − 1), (i, k )] + T [ j, k − 1]} 1≤ j ≤ nk −1 ( G ) fpara fpara Gmultietapa:=T[1,K(G) ]; fin T [i, k ] := T[1,1] :=0; para k:=2 hasta K(G) hacer para i:=1 hasta nk(G) hacer T: matriz [1..max_vertices_etapa, 1..K(G) ] de R; Función Gmultietapa (G(V,A):grafo):R; { K(G): número de etapas; ni (G): vertices de la etapa i c:A--->R; } β=acbbb aabb s acbbb i Ejemplo: acbbb Transformación Γ de α en β:Secuencia de reglas de error aplicadas. Sustitución: ∀a∈∑ α1aα2 -------> α1xα2 x∈∑ Inserción: α1α2 -------> α1xα2 x∈∑ Borrado: α1xα2 -------> α1α2 x∈∑ Modelo de error α=aabb 3) Distancia entre cadenas de caracteres ∀Γ min ( N s ( Γ ) + N i ( Γ ) + N B ( Γ )) b b a a c a Ejemplo: b b b a c a a b b b b b Como sólo se puede aplicar una regla de error a un carácter, una tranformación corresponde con una “alineamiento” entre las dos cadenas. d(α , β)= Distancia: Mínimo número de reglas de error para convertir la cadena α en β. a c b b b Borrado Inserción a a b b a c b b b a a b b Sustitución a a b b a c b b b Alineamiento asociado a cada regla: aabb bbb abb abb bbb bbb aabb abb cbbb cbbb abb cbbb I abb bbb S aabb bb bbb abb cbbb aabb acbbb bb cbbb B Arbol de todas las transformaciones abb cbbb abb acbbb bb cbbb bb acbbb β11 β22 ….. βj−1 j−1 βjj …….βm α1 α2 ….. αi−1 αi …….αn ββ11 ββ22….. …..ββj−1 j−1 β βjj …….βm …..ααi−1 αi i …….αn i−1α αα11 αα22….. βj−1 ββjj …….βm 2 ….. β1β1β2β….. βj−1 …..ααi−1i−1 ααii …….αn αα1 1αα2 2….. d (i-1,j)+ Borr (αi) d (i,j-1)+ Ins (βj) d (i-1,j-1)+ Sust (αi, βj) Obtención de la solución recursiva: ¿Cuál es la mejor forma de haber alineado hasta el carácter i de la cadena α y el carácter j de la cadena β?. 0 d (i − 1, j ) + Borr (αi ) d (i , j − 1) + Ins( β j ) d (i − 1, j ) + Borr (α ) i d (i , j ) = min d (i , j − 1) + Ins( β j ) d (i − 1, j − 1) + Sust (αi , β j ) j=0 j=0 j>0 i > 0∧ j > 0 i = 0∧ i > 0∧ i = 0∧ i b b a α a aa cc bb j b b T[i,j]:=min{T[i-1,j-1]+Sust(αi,βj), T[i,j-1]+Ins(βj), T[i-1,j]+Borr(αi) } aa β B S I para j:=1 hasta |β| hacer T[0,j]:=T[0,j-1]+Ins(βj); para i:=1 hasta |α| hacer T[i,j]:=min{T[i-1,j-1]+Sust(αi,βj), T[i,j-1]+Ins(βj), T[i-1,j]+Borr(αi) } fpara fpara Distancia:=T[|α| , |β| ]; fin T[0.0]:=0; para i:=1 hasta |α| hacer T[i,0]:=T[i-1,0]+Borr(αi) var T:matriz[ 0..|α|, 0..|β| ] de N; Función Distancia(α,β):N; ∀ ( x1 , x2 ,..., xn ) max i i i =1 ∑ b ⋅x n Solución: (x1,x2,…,xn) i =1 i i ∑ p ⋅x n 0 xi = 1 ≤M Conjunto n de objetos con pesos (pi) y beneficios (bi) Mochila de capacidad M. Encontrar el subconjunto de objetos que caben en la mochila y que maximizan el beneficio. 4) Mochila sin fraccionamiento 1 1 0 1 1 0 0 1 1 0 0 1 0 0 x3 x2 x1 1 1 3 Ejemplo: 0 4 7 1 6 1 0 P=(4,6,2,5) 3 0 4 4 3 1 6 9 8 5 1 5 b=(3,5,4,6) 6 0 0 4 1 M=9 2 0 0 0 0 0 x3 x2 X1 0 −∞ mochila (m, i ) = −∞ mochila (m, i − 1) + 0, max mochila (m − p , i − 1) + b i i i > 0∧m > 0 i = 0∧m = 0 m<0 i = 0∧m > 0 m 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 T[m,i]= min{T[m,i-1]+0, T[m-pi,i-1]+bi} P=(4,6,2,5) b=(3,5,4,6) M=9 fin mochila:= max ∀m , 0 ≤ m ≤ M {T[m, n]} para i:=1 hasta n hacer para m:=0 hasta M hacer si (m-pi)<0 entonces T[m,i]:=T[m,i-1] sino si (T[m,i-1]+0)<(T[(m-pi),i-1]+bi) entonces T[m,i]:= (T[(m-pi),i-1]+bi) sino T[m,i]:= (T[m,i-1]+0) fsi fsi fpara fpara para m:=1 hasta M hacer T[m,0]:=-∞; T[0,0]:=0; var T: matriz[0..M,0..n] de R; Función mochila (p,v:lista de R, n:N,M:R):R; (I;J) i = 0∨ j = 0 1 ncam(i , j ) = ncam(i − 1, j ) + ncam(i , j − 1) i > 0 ∨ j > 0 (0,0) 5) Número de caminos para i:=1 hasta I hacer para j:=1 hasta J hacer T[i,j]:=T[i-1,j]+T[i,j-1]; fpara fpara ncaminos:=T[I,J]; fin; para i:=0 hasta I hacer T[i,0]:=1; para j:=0 hasta J hacer T[0,j]:=1; var T:matriz[0..I,0..J] de N; función ncam (I,J:N):N; si n<=1 entonces fib:=1 sino f1:=1; f2:=1; para i:=2 hasta n hacer f3:=f1+f2; f1:=f2; f2;=f3; fpara fib:=f3; fin; función fib(n:N)N; var f1,f2,f3:N; 1 n = 0∨n = 1 fib( n) = n >1 fib( n − 1) + fib( n − 2) 6) Fibonacci n = m∨m = 0 1 f ( n, m) = n>m f ( n − 1, m − 1) + f ( n − 1, m) 7) Combinaciones k k Φ(ik , jk ) siendo li la longitud de la palabra i. n = ik Φ(ik , jk ) = ( M − ( ∑ ln + ( jk − ik )) 2 jk es un valor asociado a la línea k, siendo ik y las palabras inicial y final de la línea k. Una posible definición de φ es donde k =1 ∑ Φ(i , j ) K jk Sea W un texto compuesto por la secuencia de palabras w1,w2,…,wn. Queremos que aparezca en K líneas de M caracteres cada líneay ajustado a izquierda y derecha. Para ello podemos introducir espacios en blanco entre las palabras. Una medida de lo “buena” que es una solución podría ser: 8) Ajuste de líneas en un texto k=2 k=1 w2 w2w3 w1 w2..wn w3 w1w2 w1w2 w3 w4w5 Arbol de soluciones w1 w2w3 w4w5 Ejemplos de soluciones w1w2w3 w4 w5 w1..wn w5 w4w5 w5 w3w4w5 w4w5 w5 Nota: Se considera que Φ (i,j) es infinito si no caben las palabras en la línea k =1 Φ (1, i ) f (i , k ) = min { f ( j , k − 1) + Φ ( j + 1, i )} k > 1 ∀j ,1≤ j <i w3 w3w4 w1w2 w1w2w3 w4 w2 w2w3 w2w3w4 w1 Ejemplo: ¿Cómo haber alineado hasta la palabra j con k líneas? 2 1 w1w2w3w4 4 w1w2w3 3 w1w2 w1 1 2 3 4 5 6 7 1≤ j < i T [i , k ]: = min{T [ j , k − 1] + Φ ( j + 1, i )} Error de contorno: No se ha tenido en consideración que la última línea no genera distorsión. fpara fpara ajustar:=T[n,K]; fin. 1≤ j < i T [i , k ]: = min{T [ j , k − 1] + Φ ( j + 1, i )} para i:=1 hasta n hacer T[i,1]:=Φ (1,i) fpara; para k:=2 hasta K hacer para i:=k hasta n hacer función ajustar(l:lista de N; n:N; K:N):N; var T: matriz[1..n,1..K] de N; 0 w2 w2 w1 w1 2 w2 w1 1 w2 w1 3 w3 w3 w3 4 w3 w4 w4 5 w4 w4 Es un problema de segmentación. 6 w5 w5 w5 w5 w6 w6 w6 w6 0≤ j <i V [i ] := min {V [ j ] + Φ ( j + 1, i )} Problema: Alinear un texto de n palabras sin fijar el número de líneas.