Técnicas de diseño de algoritmos Programación dinámica Dra. Elisa Schaeffer elisa.schaeffer@gmail.com PISIS / FIME / UANL Programación dinámica p. 1
Programación dinámica En programación dinámica, uno empieza a construir la solución desde las soluciones de los subproblemas más pequeños, guardando las soluciones en una forma sistemática para construir soluciones a problemas mayores. Típicamente las soluciones parciales están guardadas en un arreglo para evitar a tener que solucionar un subprobelma igual más tarde el la ejecución del algoritmo. Programación dinámica p. 2
Problema de la mochila El algoritmo pseudo-polinomial que vimos para el problema de la mochila es esencialmente un algoritmo de programación dinámica (PD). En general, la utilidad de PD está en problemas donde la solución del problema completo contiene las soluciones de los subproblemas una situación que ocurre en algunos problemas de optimización. Programación dinámica p. 3
Coeficientes binómicos Si uno lo aplica de la manera dividir y conquistar, es necesario volver a calcular varias veces algunos coeficientes pequeños, llegando a la complejidad asintótica Ω (( )) n k = Ω ( 2 n n ) Por guardar las soluciones parciales: O(nk). Sin embargo, por guardarlas, la complejidad de espacio crece. Programación dinámica p. 4
Triángulo de Pascal n k 0 1 2 3 4 5 6 7 8 0 1 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1 5 1 5 10 10 5 1 6 1 6 15 20 15 6 1 7 1 7 21 35 35 21 7 1 8 1 8 28 56 70 56 28 8 1 Programación dinámica p. 5
Triangulación Dado: Un polígono convexo de n lados en formato de la lista de los n+1 puntos finales de sus lados en la dirección del reloj. Pregunta: Cuál división del polígono a triángulos minimiza la suma de los largos de los lados de los triángulos? Programación dinámica p. 6
Ejemplo con una solución factible Programación dinámica p. 7
Observaciones El número de los puntos es n+1 Programación dinámica p. 8
Observaciones El número de los puntos es n+1 Cada uno de los n lados del polígono tiene n opciones de asignación a triángulos, incluyendo un triángulo degenerado que consiste del lado sólo Programación dinámica p. 8
Observaciones El número de los puntos es n+1 Cada uno de los n lados del polígono tiene n opciones de asignación a triángulos, incluyendo un triángulo degenerado que consiste del lado sólo Uno de estos triángulos necesariamente pertenece a la triangulación óptima. Programación dinámica p. 8
Observaciones El número de los puntos es n+1 Cada uno de los n lados del polígono tiene n opciones de asignación a triángulos, incluyendo un triángulo degenerado que consiste del lado sólo Uno de estos triángulos necesariamente pertenece a la triangulación óptima. Lo que queda es triangular el área o las áreas que quedan afuera del triángulo elegida. Programación dinámica p. 8
Las opciones Programación dinámica p. 9
Método de solución Examinar cada triangulación de cada lado, empezando del lado entre el primero y el segundo punto, y continuando recursivamente para los otros lados del polígono. El precio de un triángulo degenerado es cero. Programación dinámica p. 10
Precio de triangulación Suponemos que estamos triangulizando el polígono parcial definido por los puntos i 1,i,...,j 1,j. El precio de la triangulación óptima es T i,j = { 0, i = j mín {T i,k +T k+1,j +w(i 1,k,j)}, i j i k j 1 donde w(i 1,k,j) es el costo del triángulo definido por los tres puntos i 1, k y j. Programación dinámica p. 11
El algoritmo Guardar en la tabla de los T i,j cero T i,i, i = 1,...,n. Programación dinámica p. 12
El algoritmo Guardar en la tabla de los T i,j cero T i,i, i = 1,...,n. Completar la tabla diagonal por diagonal hasta llegar al elemento T 1,n. Programación dinámica p. 12
El algoritmo Guardar en la tabla de los T i,j cero T i,i, i = 1,...,n. Completar la tabla diagonal por diagonal hasta llegar al elemento T 1,n. T 1,n es el costo de la triangulación óptima de todo el polígono. Programación dinámica p. 12
El algoritmo Guardar en la tabla de los T i,j cero T i,i, i = 1,...,n. Completar la tabla diagonal por diagonal hasta llegar al elemento T 1,n. T 1,n es el costo de la triangulación óptima de todo el polígono. Hay que recordar cuáles w(i 1,k,j) fueron utilizados para saber de cuáles triángulos consiste la triangulación. Programación dinámica p. 12
Análisis Tiempo por elemento de la tabla: Θ(n). Programación dinámica p. 13
Análisis Tiempo por elemento de la tabla: Θ(n). Son Θ(n 2 ) elementos en total en la tabla. Programación dinámica p. 13
Análisis Tiempo por elemento de la tabla: Θ(n). Son Θ(n 2 ) elementos en total en la tabla. = El algoritmo corre en tiempo Θ(n 3 ). Programación dinámica p. 13
Distancia de edición La distancia de edición (inglés: edit distance) es una medida de similitud de sucesiones de símbolos (o sea, palabras formadas por un alfabeto). Se define como el número mínimo de operaciones de edición que uno necesita aplicar a palabra P para llegar a la palabra Q. dist(p,q) = dist(q,p) dist(p,p) = 0 Programación dinámica p. 14
Las operaciones 1. Insertar un símbolo en posición i. 2. Eliminar un símbolo de posición i. 3. Reemplazar el símbolo en posición i con otro. Típicamente todas las operaciones tienen el mismo costo (sea uno), aunque se puede dar diferentes costos a diferentes operaciones. Programación dinámica p. 15
Desigualdad de triángulo dist(p,q) dist(p,r)+dist(r,q) En el caso básico aplica, pero existen variaciones de la medida que no lo cumplen. Programación dinámica p. 16
DP: inicialización procedimiento editdist(p = [p 1,p 2,...,p k ], Q = [q 1,q 2,...,q l ) para i [0,k] dist(i,0) := i para j [0,l] dist(0,j) := j... Programación dinámica p. 17
DP: Calculación procedimiento editdist(p = [p 1,p 2,...,p k ], Q = [q 1,q 1,...,q l )... para i [1,k] para j [1,l] si p i = q j : c := 0; en otro caso : c := 1; del := dist(i 1,j)+1; ins := dist(i,j 1)+1; rep := dist(i 1,j 1)+c; dist(i,j) := mín{del, ins, rep}; devuelve dist(k, l); Programación dinámica p. 18
Ejemplo: k = 7, l = 5 D I F I C I L Programación dinámica p. 19
Ejemplo: k = 7, l = 5 D I F I C I L 0 1 2 3 4 5 6 7 F 1 Programación dinámica p. 19
Ejemplo: k = 7, l = 5 D I F I C I L 0 1 2 3 4 5 6 7 F 1 1 2 2 3 4 5 6 A 2 2 Programación dinámica p. 19
Ejemplo: k = 7, l = 5 D I F I C I L 0 1 2 3 4 5 6 7 F 1 1 2 2 3 4 5 6 A 2 2 2 3 3 4 5 6 C 3 3 3 Programación dinámica p. 19
Ejemplo: k = 7, l = 5 D I F I C I L 0 1 2 3 4 5 6 7 F 1 1 2 2 3 4 5 6 A 2 2 2 3 3 4 5 6 C 3 3 3 3 4 3 4 5 I 4 4 3 4 Programación dinámica p. 19
Ejemplo: k = 7, l = 5 D I F I C I L 0 1 2 3 4 5 6 7 F 1 1 2 2 3 4 5 6 A 2 2 2 3 3 4 5 6 C 3 3 3 3 4 3 4 5 I 4 4 3 4 3 4 3 4 L 5 5 4 4 4 Programación dinámica p. 19
Ejemplo: k = 7, l = 5 D I F I C I L 0 1 2 3 4 5 6 7 F 1 1 2 2 3 4 5 6 A 2 2 2 3 3 4 5 6 C 3 3 3 3 4 3 4 5 I 4 4 3 4 3 4 3 4 L 5 5 4 4 4 4 4 3 Programación dinámica p. 19
Ejemplo: k = 7, l = 5 D I F I C I L 0 1 2 3 4 5 6 7 F 1 1 2 2 3 4 5 6 A 2 2 2 3 3 4 5 6 C 3 3 3 3 4 3 4 5 I 4 4 3 4 3 4 3 4 L 5 5 4 4 4 4 4 3 Cómo rastrear las operaciones? Programación dinámica p. 19
PD estocástica En PD tradicional, dado el estado actual y una decisión hecha, el estado siguiente está fijo. También hay aplicaciones de PD donde en vez de conocer los dos, una solamente se conoce através de una distribución de probabilidad. Las aplicaciones de PD estocástico involucran incertidumbre de aspectos como ventas, apuestos, etcétera. Programación dinámica p. 20