La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Programación Dinámica  La programación dinámica se suele utilizar en problemas de optimización, donde una solución está formada por una serie de decisiones.

Presentaciones similares


Presentación del tema: "Programación Dinámica  La programación dinámica se suele utilizar en problemas de optimización, donde una solución está formada por una serie de decisiones."— Transcripción de la presentación:

1

2 Programación Dinámica  La programación dinámica se suele utilizar en problemas de optimización, donde una solución está formada por una serie de decisiones.  Igual que la técnica divide y vencerás, resuelve el problema original combinando las soluciones para subproblemas más pequeños.  Sin embargo, la programación dinámica no utiliza recursividad, sino que almacena los resultados de los subproblemas en una tabla, calculando primero las soluciones para los problemas pequeños.  Con esto se pretende evitar la repetición de cálculos para problemas más pequeños.

3   Está basada en el principio de optimalidad de Bellman: “Cualquier subsecuencia de decisiones de una secuencia óptima de decisiones que resuelve un problema también debe ser óptima respecto al subproblema que resuelve.”Óptima Óptima Óptima

4   Al construir un algoritmo usando la estrategia de programación dinámica es necesario: 1. Caracterizar la estructura de una solución optima. 2. Definir recursivamente el valor de una solución óptima. 3. Computar el valor de una solución en forma bottom-up. 4. [Opcional] Construir una solución óptima a partir de la información computada.

5 DESCRIPCIÓN DEL PROBLEMA  Necesitamos calcular la matriz producto M de n matrices dadas M = M1M2...Mn minimizando el número total de multiplicaciones escalares a realizar. Nos centraremos en obtener el orden en que se deben multiplicar las matrices para que el número de multiplicaciones escalares sea el mínimo posible, obteniendo además este número. Por ser asociativa la multiplicación de matrices, existen muchas formas posibles de realizar esa operación, cada una con un coste asociado. Si cada Mi es de dimensión di–1xdi (1 ≤ i ≤ n), multiplicar Mi Mi+1 requiere di–1di di+1 operaciones.  El problema consiste en encontrar el mínimo número de operaciones necesario para calcular el producto M.

6  Por ejemplo, para n = 4 y para las matrices M1, M2, M3 y M4 cuyos órdenes son: M1(30×1), M2(1×40), M3(40×10),M4(10×25) M1(30×1), M2(1×40), M3(40×10),M4(10×25) Hay cinco formas distintas de multiplicarlas, y sus costes asociados (en términos de las multiplicaciones escalares que necesitan) son: Hay cinco formas distintas de multiplicarlas, y sus costes asociados (en términos de las multiplicaciones escalares que necesitan) son: ((M1M2)M3)M4 = 30·1·40 + 30·40·10 + 30·10·25 = 20.700 M1(M2(M3M4)) = 40·10·25 + 1·40·25 + 30·1·25 = 11.750 M1(M2(M3M4)) = 40·10·25 + 1·40·25 + 30·1·25 = 11.750 (M1M2)(M3M4) = 30·1·40 + 40·10·25 + 30·40·25 = 41.200 (M1M2)(M3M4) = 30·1·40 + 40·10·25 + 30·40·25 = 41.200 M1((M2M3)M4) = 1·40·10 + 1·10·25 + 30·1·25 = 1.400 M1((M2M3)M4) = 1·40·10 + 1·10·25 + 30·1·25 = 1.400 (M1(M2M3))M4 = 1·40·10 + 30·1·10 + 30·10·25 = 8.200 (M1(M2M3))M4 = 1·40·10 + 30·1·10 + 30·10·25 = 8.200 Como puede observarse, la mejor forma necesita casi treinta veces menos multiplicaciones que la peor, por lo cual es importante elegir una buena asociación.

7 Demostración de optimalidad:  El principio de optimalidad de Bellman dice lo siguiente: “Cualquier subsecuencia de decisiones de una secuencia de decisiones óptima que resuelva un problema también debe ser óptima para el subproblema que resuelve”.Debemos demostrar si nuestro razonamiento cumple el principio de optimalidad de Bellman. Si la solución a nuestro problema es óptima, y elegimos que la última multiplicación que se realice sea (M1... Mk ) (Mk+1... Mn) entonces se realizarán d0 x dk x dn productos más los productos necesarios para realizar las multiplicaciones de las dos subsecuencias. Como nuestra solución es óptima también deben serlo las soluciones a las dos subsecuencias de matrices. Por tanto, se cumple el principio.

8  EXPLICACIÓN En primer lugar, vamos a suponer que cada Mi es de dimensión di– 1xdi (1 ≤ i ≤ n), y por tanto realizar la multiplicación Mi Mi+1 va a requerir un total de di1didi+1 operaciones. Llamaremos M(i,j) al número mínimo de multiplicaciones escalares necesarias para el cómputo del producto de Mi Mi+1... Mj con 1 ≤ i ≤ j ≤ n. Por consiguiente, la solución al problema planteado coincidirá con M(1,n). En primer lugar, vamos a suponer que cada Mi es de dimensión di– 1xdi (1 ≤ i ≤ n), y por tanto realizar la multiplicación Mi Mi+1 va a requerir un total de di1didi+1 operaciones. Llamaremos M(i,j) al número mínimo de multiplicaciones escalares necesarias para el cómputo del producto de Mi Mi+1... Mj con 1 ≤ i ≤ j ≤ n. Por consiguiente, la solución al problema planteado coincidirá con M(1,n). Para plantear la ecuación en recurrencia que define la solución, supongamos que asociamos las matrices de la siguiente manera: Para plantear la ecuación en recurrencia que define la solución, supongamos que asociamos las matrices de la siguiente manera: (Mi Mi+1... Mk) (Mk+1 Mk+2... Mj). (Mi Mi+1... Mk) (Mk+1 Mk+2... Mj). Aplicando el principio de óptimo, el valor de M(i,j) será la suma del número de multiplicaciones escalares necesarias para calcular el producto de las matrices Mi Mi+1...Mk, que corresponde a M(i,k), más el número de multiplicaciones escalares para el producto de las matrices Mk+1Mk+2...Mj que es M(k+1,j), más el producto que corresponde a la última multiplicación entre las matrices de dimensiones (di–1 dk) y (dk dj) es decir, di–1dkdj. En consecuencia, el valor de M(i,j) para la asociación anteriormente expuesta viene dado por la expresión: Aplicando el principio de óptimo, el valor de M(i,j) será la suma del número de multiplicaciones escalares necesarias para calcular el producto de las matrices Mi Mi+1...Mk, que corresponde a M(i,k), más el número de multiplicaciones escalares para el producto de las matrices Mk+1Mk+2...Mj que es M(k+1,j), más el producto que corresponde a la última multiplicación entre las matrices de dimensiones (di–1 dk) y (dk dj) es decir, di–1dkdj. En consecuencia, el valor de M(i,j) para la asociación anteriormente expuesta viene dado por la expresión: M(i,j) = M(i,k) + M(k+1,j) + di–1dk dj M(i,j) = M(i,k) + M(k+1,j) + di–1dk dj

9 Pero k puede tomar cualquier valor entre i y j–1, y por tanto M(i,j) deberá escoger el más favorable de entre todos ellos, es decir: M(i, j) = Min {M(i,k ) + M(k +1, j) + di−1dkd j} (i≤k<j) lo que nos lleva a la siguiente relación en recurrencia:

10  Para resolver tal ecuación en un tiempo de complejidad polinómico es necesario crear una tabla en la que se vayan almacenando los valores M(i,j) (1 ≤ i ≤ j ≤ n) y que permita a partir de las condiciones iniciales reutilizar los valores calculados en los pasos anteriores. Esta tabla se irá rellenando por diagonales sabiendo que los elementos de la diagonal principal son todos cero. Esta tabla se irá rellenando por diagonales sabiendo que los elementos de la diagonal principal son todos cero.  Cada elemento M[i,j] será el valor mínimo de entre todos los pares (M[i,k] + M[k+1,j]) más la aportación correspondiente a la última multiplicación (di–1dkdj).  Al ir rellenando la tabla por diagonales se asegura que esta información (M[i,k],M[k+1,j]) está disponible cuando se necesita, pues cada M[i,j] utiliza para su cálculo todos los elementos anteriores de su fila y todos los de su columna por debajo suya.

11 Razonamiento  Como estructura de datos utilizaremos una tabla matrices [1..n,1..n]. Siguiendo la recurrencia podemos deducir que para calcular el valor de una casilla (i, j) necesitamos los resultados de la tabla de la misma fila, y las columnas anteriores (para la primera llamada recursiva), y de la misma columna, y las filas posteriores (para la segunda llamada recursiva). Por eso, iremos haciendo el recorrido por diagonales, y sólo necesitaremos la parte de la tabla que queda por encima de la diagonal principal.

12  Como la i y la j cumplen que 1 <= i <= j <= n solo vamos a utilizar la mitad superior derecha de la tabla en donde se cumple la restricción. En las Mij donde la i=j, se cumple que Mij=0. Tal y como hemos definido Mij es el número de multiplicaciones escalares necesarias para obtener el resultado de multiplicar desde la matriz i hasta la j, si i y j son iguales significa que no se realiza ninguna operación porque solo tenemos una matriz. La tabla empleada para realizar los cálculos tendría la forma que muestra la imagen. 1234 10M 12 M 13 M 14 20M 23 M 24 30M 34 40

13 Ejemplo A(13  5), B(5  89), C(89  3) y D(3  34) A(13  5), B(5  89), C(89  3) y D(3  34) Se tiene d=(13,5,89,3,34). Se tiene d=(13,5,89,3,34). Para s=1: m 12 =5785, m 23 =1335, m 34 =9078. Para s=1: m 12 =5785, m 23 =1335, m 34 =9078. Para s=2: Para s=2: Para s=3:

14 La matriz es: La matriz es:

15 ALGORITMO fun Mult_Mat_PD(dimMatriz[0..n]: ent) dev sol:ent // n dimensión de la matriz var //solución es decir número de matrices a solucionar var //solución es decir número de matrices a solucionar matrizSol[1..n,1..n]: ent; // Matriz solución matrizSol[1..n,1..n]: ent; // Matriz solución fvar fvar para i=1 hasta n hacer para i=1 hasta n hacer matrizSol[i][i]=0; // Inicializa la diagonal principal em cero matrizSol[i][i]=0; // Inicializa la diagonal principal em cero fpara fpara para diagonal=1 hasta n-1 hacer para diagonal=1 hasta n-1 hacer para i=0 hasta n-diagonal hacer para i=0 hasta n-diagonal hacer matrizSol[i,i+diagonal]=minProd(dimMatriz,matrizSol,i,i+diagonal); matrizSol[i,i+diagonal]=minProd(dimMatriz,matrizSol,i,i+diagonal); fpara // en cada casilla de cada diagonal escribe su correspondiente fpara // en cada casilla de cada diagonal escribe su correspondiente fpara // mínimo de multiplicaciones necesarias fpara // mínimo de multiplicaciones necesarias dev matrizSol[0,n]); dev matrizSol[0,n]);ffun

16 fun minProd(dimMatriz[1..n]: ent,matrizSol[1..n,1..n]: ent,i,j: ent) dev minP:ent var var aux: ent; aux: ent; fvar fvar minP=+infinito; minP=+infinito; para k=i hasta j-1 hacer para k=i hasta j-1 hacer aux=matrizSol[i,k]+matrizSol[k+1,j]+(dimMatriz[i1]*dimMatriz[k]*dim Matriz[j]; aux=matrizSol[i,k]+matrizSol[k+1,j]+(dimMatriz[i1]*dimMatriz[k]*dim Matriz[j]; si (aux<minP) entonces si (aux<minP) entonces minP=aux; // actualiza si el número de multiplicacione es menor minP=aux; // actualiza si el número de multiplicacione es menor fsi fsi fpara fpara dev minP; dev minP;ffun

17 PLANTEAMIENTO DE LA COMPLEJIDAD TEMPORAL DE LA SOLUCIÓN  Observando el método matriz vemos que existe un bucle externo que se repite desde diagonal = 1 hasta n – 1, y en su interior un bucle dependiente de la iteración estudiada y del valor de diagonal, y que se ejecuta desde 1 hasta n – diagonal. En el interior de este bucle hay una llamada al método mínimo que tiene una complejidad del orden del valor de la diagonal, y por tanto el tiempo de ejecución del algoritmo es: por lo que concluimos que su complejidad temporal es de orden O(n3).


Descargar ppt "Programación Dinámica  La programación dinámica se suele utilizar en problemas de optimización, donde una solución está formada por una serie de decisiones."

Presentaciones similares


Anuncios Google