Programación dinámica - Universidad de Buenos Aires

Anuncio
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
Descargar