Introducción Problema Solución Conclusiones Programación dinámica Algoritmos y Estructura de Datos III Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires 03 de Abril de 2013 Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Repaso I Aplica a problemas de optimización donde obtenemos una solución utilizando una serie de decisiones. Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Repaso I Aplica a problemas de optimización donde obtenemos una solución utilizando una serie de decisiones. I A medida que tomamos decisiones, subproblemas con la misma forma van surgiendo Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Repaso I Aplica a problemas de optimización donde obtenemos una solución utilizando una serie de decisiones. I A medida que tomamos decisiones, subproblemas con la misma forma van surgiendo I La clave es guardar el resultado de cada subproblema, en caso de que reaparezca Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Repaso I Aplica a problemas de optimización donde obtenemos una solución utilizando una serie de decisiones. I A medida que tomamos decisiones, subproblemas con la misma forma van surgiendo I La clave es guardar el resultado de cada subproblema, en caso de que reaparezca I Es una combinación entre algoritmos golosos y algoritmos de fuerza-bruta Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Repaso I Al igual que Dividir y Conquistar, resuelve un problema combinando la solución óptima de varios subproblemas Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Repaso I Al igual que Dividir y Conquistar, resuelve un problema combinando la solución óptima de varios subproblemas I Los subproblemas tienen un solapamiento. Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Repaso I Al igual que Dividir y Conquistar, resuelve un problema combinando la solución óptima de varios subproblemas I Los subproblemas tienen un solapamiento. I Cada subproblema es independiente. Solo interesan los resultados. Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Repaso I Al igual que Dividir y Conquistar, resuelve un problema combinando la solución óptima de varios subproblemas I Los subproblemas tienen un solapamiento. I Cada subproblema es independiente. Solo interesan los resultados. I Optimalidad: Una solución óptima esta conformada por subsoluciones óptimas. Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Cambio mínimo Problema Dados los valores de las monedas V =< v1 , v2 , . . . , vk > y el monto a devolver, N. Quiero saber la mínima cantidad de monedas necesarias para devolver el cambio de manera exacta. Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Cambio mínimo Problema Dados los valores de las monedas V =< v1 , v2 , . . . , vk > y el monto a devolver, N. Quiero saber la mínima cantidad de monedas necesarias para devolver el cambio de manera exacta. Ejemplo V =< 3, 4, 5, 7 > N = 10 S =< 7, 3 > S =< 5, 5 > Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Caracterizar una solución I Probar cualquier combinación de monedas. Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Caracterizar una solución I Probar cualquier combinación de monedas. I Hasta cuantas veces uso cada moneda? Cuál sería la complejidad final? Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Caracterizar una solución I Probar cualquier combinación de monedas. I Hasta cuantas veces uso cada moneda? Cuál sería la complejidad final? I O(2... ). Feo de implementar, y costoso. Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Pensar recursivamente I Definamos la función Cambio(N, V ) Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Pensar recursivamente I Definamos la función Cambio(N, V ) I El V es estático, nunca cambia, lo podemos olvidar por un momento... Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Pensar recursivamente I Definamos la función Cambio(N, V ) I El V es estático, nunca cambia, lo podemos olvidar por un momento... I Ahora pensemos si se puede resolver Cambio(N) usando soluciones a instancias más chicas. Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Pensar recursivamente I Definamos la función Cambio(N, V ) I El V es estático, nunca cambia, lo podemos olvidar por un momento... I Ahora pensemos si se puede resolver Cambio(N) usando soluciones a instancias más chicas. I Puedo resolver Cambio(N) sabiendo Cambio(i), i < N ? Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Pensar recursivamente I Definamos la función Cambio(N, V ) I El V es estático, nunca cambia, lo podemos olvidar por un momento... I Ahora pensemos si se puede resolver Cambio(N) usando soluciones a instancias más chicas. I Puedo resolver Cambio(N) sabiendo Cambio(i), i < N ? I La cantidad minima de monedas para devolver i esta relacionada con la cantidad minima para devolver i + 3? Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Pensar recursivamente I Definamos la función Cambio(N, V ) I El V es estático, nunca cambia, lo podemos olvidar por un momento... I Ahora pensemos si se puede resolver Cambio(N) usando soluciones a instancias más chicas. I Puedo resolver Cambio(N) sabiendo Cambio(i), i < N ? I La cantidad minima de monedas para devolver i esta relacionada con la cantidad minima para devolver i + 3? I Qué valores podría tener la ’última’ moneda usada? Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Pensar recursivamente Teorema Sea S =< s1 , . . . , sm > el cambio mínimo para N. Luego, Si =< s1 , . . . , si > es óptimo. Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Pensar recursivamente Teorema Sea S =< s1 , . . . , sm > el cambio mínimo para N. Luego, Si =< s1 , . . . , si > es óptimo. Prueba Supongamos que hay otra solución S ∗ mejor que Si : P ∗ P I S = Si ∧ |S ∗ | < |Si |. Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Pensar recursivamente Teorema Sea S =< s1 , . . . , sm > el cambio mínimo para N. Luego, Si =< s1 , . . . , si > es óptimo. Prueba Supongamos que hay otra solución S ∗ mejor que Si : P ∗ P I S = Si ∧ |S ∗ | < |Si |. I Definimos S 0 = S ∗ · < si+1 , . . . , sm > (reemplazar Si por S ∗ ). Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Pensar recursivamente Teorema Sea S =< s1 , . . . , sm > el cambio mínimo para N. Luego, Si =< s1 , . . . , si > es óptimo. Prueba Supongamos que hay otra solución S ∗ mejor que Si : P ∗ P I S = Si ∧ |S ∗ | < |Si |. I Definimos S 0 = S ∗ · < si+1 , . . . , sm > (reemplazar Si por S ∗ ). I P S0 = P S∗ + P < si+1 , . . . , sm >= P Si + P < si+1 , . . . , sm >= N Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Pensar recursivamente Teorema Sea S =< s1 , . . . , sm > el cambio mínimo para N. Luego, Si =< s1 , . . . , si > es óptimo. Prueba Supongamos que hay otra solución S ∗ mejor que Si : P ∗ P I S = Si ∧ |S ∗ | < |Si |. I Definimos S 0 = S ∗ · < si+1 , . . . , sm > (reemplazar Si por S ∗ ). I P I |S 0 | = |S ∗ |+| < si+1 , . . . , sm > | < |Si |+| < si+1 , . . . , sm > | = |S| S0 = P S∗ + P < si+1 , . . . , sm >= P Si + P < si+1 , . . . , sm >= N Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Pensar recursivamente Teorema Sea S =< s1 , . . . , sm > el cambio mínimo para N. Luego, Si =< s1 , . . . , si > es óptimo. Prueba Supongamos que hay otra solución S ∗ mejor que Si : P ∗ P I S = Si ∧ |S ∗ | < |Si |. I Definimos S 0 = S ∗ · < si+1 , . . . , sm > (reemplazar Si por S ∗ ). I P I |S 0 | = |S ∗ |+| < si+1 , . . . , sm > | < |Si |+| < si+1 , . . . , sm > | = |S| I Absurdo, pues |S| es mínimo por hipótesis. S0 = P S∗ + P < si+1 , . . . , sm >= P Si + P < si+1 , . . . , sm >= N Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Ejemplo 10 3 4 7 4 3 1 0 6 7 3 4 5 3 2 0 5 5 3 0 3 2 3 5 3 4 3 4 7 5 3 4 1 2 1 0 0 3 0 Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Ejemplo 10 3 4 7 4 3 1 0 6 7 3 4 5 3 2 0 5 5 3 0 3 2 3 5 3 4 3 4 7 5 3 4 1 2 1 0 0 3 0 Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Algoritmo-CambioMinimo (top-down) Algorithm 1: CambioMinimo Data: V =< v1 , . . . , vk >,N Result: |S| if N == 0 then return 0 if res[N] ya calculada then return res[N] res[N] = ∞ for i ← 1 to k do if N ≥ vi then res[N] = MIN(res[N], 1 + CambioMinimo(N − vi )) ; return res[N] Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Algoritmo-CambioMinimo (bottom-up) Algorithm 2: CambioMinimo Data: V =< v1 , . . . , vk >,N Result: |S| for i ← 1 to N do res[i] = ∞; res[0] = 0; for i ← 1 to N do for j ← 1 to k do res[i] = MIN(res[i], res[i − vj ] + 1) return res[N] Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Conclusiones I Primero entender el problema, y pensar en la solución (aunque sea con algoritmos de fuerza-bruta) Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Conclusiones I Primero entender el problema, y pensar en la solución (aunque sea con algoritmos de fuerza-bruta) I Pensar en funciones recursivas, y que parametros necesitarian. Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Conclusiones I Primero entender el problema, y pensar en la solución (aunque sea con algoritmos de fuerza-bruta) I Pensar en funciones recursivas, y que parametros necesitarian. I Demostrar correctitud del algoritmo. Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica Introducción Problema Solución Conclusiones Conclusiones I Primero entender el problema, y pensar en la solución (aunque sea con algoritmos de fuerza-bruta) I Pensar en funciones recursivas, y que parametros necesitarian. I Demostrar correctitud del algoritmo. I Hacer muchos ejercicios. Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires Programación dinámica