Documentos de Académico
Documentos de Profesional
Documentos de Cultura
La tcnica de Programacin dinmica fue inventada como un mtodo e o a e general de optimizacin de procesos de decisin por etapas. o o La tcnica de programacin dinmica es adecuada para resolver problemas e o a cuya solucin puede caracterizarse recursivamente (como con la tcnica o e divide y vencers) y en la que los subproblemas que aparecen en la a recursin se solapan de algn modo, lo que signicar una repeticin de o u a o clculos inaceptable si se programara la solucin recursiva de manera a o directa. La aplicacin de la tcnica de programacin dinmica evita la repeticin de o e o a o clculos mediante la memorizacin de la solucin de cada subproblema en a o o una tabla, de manera que no haya que calcularlo ms de una vez. a
ww w.
at em
at
ic
a1
.c
om
Denir la estructura de datos para memorizar las soluciones de los subproblemas y escribir el algoritmo que va calculando los valores de esa estructura de datos siguiendo la caracterizacin de la solucin o o denida en la fase 1, pero sin repetir el clculo de soluciones de a subproblemas.
ww w.
at em
at
a1
.c
om
Combinatoria
Cuntos subconjuntos de n elementos pueden formarse con un conjunto a de m elementos? (n m) Denominemos S(m, n) a ese nmero: u Si n = 0 entonces slo puede formarse el conjunto vac S(m, 0) = 1 o o: Si n > 0, el nmero de subconjuntos queda caracterizado por el u siguiente razonamiento: Tomemos un elemento x del conjunto de m elementos. Por un lado estn todos los subconjuntos que contienen a a x y, por otro lado, todos los que no.
u En el primer caso, el nmero de subconjuntos es S(m 1, n 1) ya que x es uno de los elementos elegidos y los otros n 1 han de ser elegidos de entre m 1 elementos. En el segundo caso, hay que elegir n elementos de la coleccin de o m 1 restantes (al quitar x), as que su nmero debe ser S(m 1, n). u
ww w.
Por lo tanto, S(m, n) = S(m 1, n 1) + S(m 1, n) cuando n > 0 Es evidente que la programacin recursiva directa de esta recurrencia o produce multitud de clculos repetidos. a
at em
at
ic
a1
.c
om
Combinaciones(m, n)
Denimos una estructura de datos adecuada para memorizar las soluciones de los subproblemas: Una tabla T (0..m, 0..n) tal que T (i, j) guardar S(i, j). a Un algoritmo que calcula esos valores, segn dicta la recurrencia denida u para S(m, n), desde los casos bsicos a los generales, es el siguiente: a func Combinaciones(m, n) return natural for i in 0 . . . m loop T (i, 0) 1 for j in 1 . . . m 1, n) loop n(i T (i, j) T (i 1, j 1) + T (i 1, j) end loop if i n then T (i, i) 1 end loop return T (m, n) a Anlisis: Obviamente, (mn) en tiempo y en espacio extra.
ww w.
at em
at
ic
a1
.c
om
at em
at
ic
a1
.c
om
func CombinacionesFM(m, n) return natural if T (m, n) = 0 then return T (m, n) if n = 0 n = m then T (m, n) 1 return T (m, n) {n = 0 n = m T (m, n) no calculado } T (m, n) CombinacionesFM(m 1, n 1) + CombinacionesFM(m 1, n) return T (m, n) a a Anlisis: Bsicamente, se rellena la misma tabla de valores que con Combinaciones(m, n) (algunos valores menos) y cada casilla se rellena con un coste de O(1); as que (mn) en tiempo y en espacio extra.
ww w.
at em
at
ic
a1
.c
om
Principio de optimalidad: En toda secuencia ptima de decisiones para o resolver el problema, cualquier subsecuencia es ptima para resolver el o subproblema correspondiente.
ww w.
at em
at
ic
a1
.c
om
Un requisito para el uso de la programacin dinmica en la resolucin de o a o problemas de optimizacin es que el problema en cuestin satisfaga el o o
Caracterizar la estructura de una solucin optimal (asegurar que se o satisface el principio de optimalidad). Escribir el algoritmo que calcula la funcin de optimizacin sin repetir o o clculos de soluciones de subproblemas. a Escribir el algoritmo que construye una solucin optimal del problema, o a partir de la informacin calculada en el paso anterior. o
ww w.
La fase 4 no se realiza cuando slo se busca el valor de la funcin de o o optimizacin. Si hay que realizar la fase 4, en la fase 3 debe considerarse el o clculo de informacin adicional. a o
at em
at
ic
a1
om
En general, las soluciones a problemas de optimizacin obtenidas con la o tcnica de programacin dinmica pueden imaginarse como compuestas de e o a una serie de opciones tomadas en estados sucesivos. Para abordar las fases 1 y 2, mencionadas antes, puede ayudar la tctica de a suponer que se ha tomado una de esas opciones para llegar a la solucin y o analizar qu subproblemas quedar todav pendientes para ser resueltos e an a y cmo se combinar para solucionar el original de manera ptima. o an o Obsrvese que, seguramente, esa opcin inicial no es unica y que e o interesar estudiar las dems posibilidades, quedndonos con la mejor. a a a
ww w.
at em
at
ic
a1
.c
om
ww
w.
Disponemos de n objetos de valores vi (i : 1 . . . n) y pesos pi (i : 1 . . . n), respectivamente. Queremos cargar una mochila con una coleccin de esos o objetos que maximice la suma de los valores transportados. La capacidad mxima de la mochila es M 0. a
at em at ic a1
.c om
at em
at
ic
a1
.c
om
Primer intento B(C ) = Mximo benecio que puede llevarse en la mochila de capacidad a C (contando con los objetos dados)
at em at ic a1
.c om
ww
at em
at
ic
a1
.c
om
at em
at
ic
a1
.c
om
Aadimos unas marcas en el algoritmo, que nos indicarn la opcin que n a o se tom en tal estado. o T picamente, la estructura para las marcas es una estructura paralela a la que guarda los resultados. objetos(C , k) = true T (C , k 1) < vk + T (C pk , k 1) Signica que en el estado (C , k) interesa tomar el objeto k
ww w.
at em
at
ic
a1
.c
om
at em
at
ic
a1
.c
om
func Cons Mochila(C , k) return conjunto if k = 0 C = 0 then return { } else if objetos(C , k) = false then return Cons Mochila(C , k 1) else return {k} Cons Mochila(C pk , k 1) Nos interesa el valor de Cons Mochila(M, n). Anlisis: (n) a
at em
at
ic
a1
Una subsecuencia de una secuencia S se obtiene retirando de S cualquier nmero de elementos de cualesquiera posiciones. u Por ejemplo: sedante es una subsecuencia de estupendamente. El problema que queremos resolver es el de calcular una subsecuencia comn, lo ms larga posible, de dos secuencias dadas R y S. u a Por ejemplo:
ww w.
at em
at
ic
a1
.c
om
La siguiente funcin recursiva f (R, S) dene (por casos) una subsecuencia o comn de longitud maximal de dos secuencias R y S: u
.c om
f (R, ) = f (a R, a S) = a f (R, S) si a = b
ww
at em
at
f (, S) =
ic
a1
Dadas las secuencias R(1..m) y S(1..n) L(i, j) = longitud de la subsecuencia ms larga de R(i..m) y S(j..n) a
a1 at ic
L(m + 1, j) = 0 j
at em
L(i, n + 1) = 0 i
ww w.
L(i, j) = 1 + L(i + 1, j + 1) si R(i) = S(j) i m j n L(i, j) = max{L(i + 1, j), L(i, j + 1)} si R(i) = S(j) i m j n
M
.c
om
at em
at
ic
a1
.c
om
at em
at
ic
a1
.c
om
ww
w.
at em
at
Considrese un grafo dirigido con pesos no negativos asociados a las e aristas. Cual es la distancia m nima entre cada par de nodos?
ic a1
.c
om
Para cada par de nodos a, b, un camino m nimo est compuesto de una a sucesin de aristas. o La longitud del camino puede ser 1 (la arista que va del nodo origen a al nodo destino b) o mayor que 1. En este segundo caso, habr que pasar por algn nodo intermedio k. a u Evidentemente, el trozo de camino que va del origen a hasta k debe ser un camino m nimo, y lo mismo para el trozo de camino que va de k al destino b.
ww w.
at em
at
ic
a1
.c
om
P(i, i) = si no existe la arista (i, j) Primer intento: D(i, j) = Distancia m nima del nodo i al nodo j D(i, j) = min{P(i, j), D(i, k) + D(k, j) | 1 k n k = i k = j} D(i, j) est mal denida: en su denicin aparece D(i, k), que a su vez a o necesitar D(i, j) a
ww w.
a1
.c
om
Segundo intento
Aadimos un parmetro ms a la funcin, que representa una nocin de n a a o o etapas en las que subdividimos el problema. D(i, j, k) = Distancia m nima de i a j cuando podemos pasar por los nodos {1. . . k}. Si k = 0 signica que no podemos pasar por ningn nodo intermedio. u Cuando podemos pasar por los nodos {1..k}, hay dos opciones: No pasar por k, y por lo tanto utilizar slo los restantes {1..k 1} o nodos. Pasar por k, y por lo tanto realizar el camino de i a k de forma m nima usando slo los restantes {1..k 1} nodos, y anlogamente o a de k a j. D(i, j, 0) = P(i, j) D(i, j, k) = min{D(i, j, k 1), D(i, k, k 1) + D(k, j, k 1)}
ww w.
at em
at
ic
a1
.c
om
Hay que observar que, en la etapa k, se satisface que D(i, k, k) = D(i, k, k 1) D(k, j, k) = D(k, j, k 1) La la y columna k no se modica en la etapa k. Por lo tanto nos basta una sola matriz D(i, j) que se va actualizando en cada etapa segn la recurrencia denida. u
ww w.
at em
at
.c
om
func Floyd (P(1..n, 1..n)) return matriz D(1..n, 1..n) P(1..n, 1..n) for k in 1..n loop for i in 1..n loop for j in 1..n loop D(i, j) min(D(i, j), D(i, k)+D(k, j)) return D(1..n, 1..n) Anlisis: (n3 ) en tiempo y (n2 ) en espacio extra a
ww w.
at em
at
ic
a1
.c
om
at em
at
ic
a1
.c
om
at em
at
ic
a1
.c
om