Programación Dinámica

Documentos relacionados
Programación Dinámica

Geometría. Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires. Training Camp 2012

Análisis de algoritmos. Recursividad

Programación Dinámica

Divide & Conquer. Herman Schinca. Clase de Junio de 2011

Recursividad Definición

Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2

Tema: Programación Dinámica.

Programación I Recursividad.

Recursión. Capítulo 4

Funciones recursivas

Tema: Programación Dinámica.

259. El número de combinaciones de m objetos entre un conjunto de n, denotado por n, para n 1 y 0 m n, se puede definir recursivamente por: m

Programación Dinámica

Aritmética en Haskell

Análisis de algoritmos

Tema 7: Recursividad

Trabajo Práctico 5 Estructura Repetitiva

Programación II Recursividad Dr. Mario Rossainz López

Tema 7: Problemas clásicos de Programación Lineal

Multiplicación de matrices simétricas

Complejidad de algoritmos recursivos

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Programa-Me 2013 Regional on line Problemas

Listas y Recursión. Taller de Álgebra I. Primer Cuatrimestre de 2015

Para las ecuaciones diferenciales ordinarias no lineales no existen métodos generales.

Tema: Funciones, Procedimientos y Recursividad en C#.

Tema: Funciones, Procedimientos y Recursividad en C#.

Ejemplo: El problema de la mochila. Algoritmos golosos. Algoritmos y Estructuras de Datos III. Segundo cuatrimestre 2013

Taller de Programación Dinámica. Definiciones. Caso base. Laboratorio de Algoritmos y Estructuras de Datos III. 10 de Septiembre de 2010

Programa-Me 2013 Regional on line Problemas

Diseño de algoritmos

Tema 06: Recursividad

Grafos. Leopoldo Taravilse. Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires. Training Camp 2012

TEORÍA DE DIVISIBILIDAD

RECURSIVIDAD. Prof. Ing. M.Sc. Fulbia Torres

Programación Estructurada. Complementos de Informática Tema 2: Programación Estructurada y Programación Modular. Números Amigos

Modelado con grafos. Melanie Sclar. Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires. 26 de abril de 2015

Fila: Es un conjunto de varias celdas dispuestas en sentido horizontal.

PROGRAMACION DE REDES. MODELOS DE TRANSPORTE

Para entender la recursividad primero tenemos que entender la recursividad

Cátedra I Informática Autor I Carlos Bartó

Diseño y Análisis de Algoritmos

Cuadrado Mágico de RENATO

Programación Dinámica 1

Ejercicios sobre recursividad

Lenguaje de programación S (Davis/Sigal/Weyuker) Lógica y Computabilidad. Ejemplo 1. Ejemplo 2

Del mismo modo, si el coche empieza a descender por una colina, todavía se puede determinar la pendiente.

CAPÍTULO 6 PROGRAMACIÓN DINÁMICA. Programación Dinámica

Clases e instancias. Algoritmos y Estructuras de Datos I. Clases e instancias. memoria dinámica.

Tema: Programación Dinámica.

Estrategias de pivoteo

Lista de problemas: ciclos y funciones en el lenguaje MATLAB

Grafos. AMD Grado en Ingeniería Informática. AMD Grado en Ingeniería Informática (UM) Grafos 1 / 30

INTRODUCCIÓN a DERIVE 6. PANTALLA DE EXPRESIONES ALGEBRAICAS

IN34A - Optimización

La recursividad forma parte del repertorio para resolver problemas en Computación y es de los métodos más poderosos y usados.

Microsoft Excel Tabla dinámica

4.2. El número de combinaciones de m objetos entre un conjunto de n, denotado por n, para n 1 y 0 m n, se puede definir recursivamente por: m

TEMA 5: Subprogramas, programación modular

INVESTIGACIÓN OPERATIVA

Subrutinas. Subrutinas. Erwin Meza Vega

UNIDAD Creación del Árbol Octal de un objeto sólido vía la definición CSG

Prácticas de SAGE (caldum) 19 de Enero de 2012

Programa de Acceso Inclusivo, Equidad y Permanencia. PAIEP, Universidad de Santiago

Nos muestra el contenido de la celda activa, es decir, la casilla donde estamos situados.

MATE Método Simplex maximización estándar

LibreOffice Calc II INTRODUCCIÓN A LAS TECNOLOGÍAS INFORMÁTICAS

Estrategias de Diseño de Algoritmos

INTRODUCCIÓN DEL TEMA 2 ESPACIOS VECTORIALES

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

MICROSOFT WORD. Más opciones de edición de documentos

Examen escrito de Programación 1

Programación Dinámica

Descripción del problema:

Materia: Matemática de Tercer Año Tema: Pendiente

Diagramas. En computación existen básicamente dos tipos de diagramas: diagramas de entradaproceso salida

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Configuración de página e Impresión. Excel 2007

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACION

Figura 1: Esquema de las tablas simplex de inicio y general.

Carlos A. Rivera-Morales. Precálculo 2

Recursividad... un análisis posterior. Aurelio Sanabria Introducción a la programación

Capitulo 2. Programación Modular

Método de diferencias finitas para ecuaciones diferenciales parciales elípticas. (Parte II)

El determinante de una matriz se escribe como. Para una matriz, el valor se calcula como:

UNIDAD 2. writer USANDO TABLAS. CURSO: LibreOffice

TEMA 1: Algoritmos y programas

1. Para los siguientes ejercicios haga una prueba de escritorio de los fragmentos de código y responda las preguntas cuál es la salida?

Transcripción:

Leopoldo Taravilse Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires Training Camp 2012 Leopoldo Taravilse (UBA) TC 2012 1 / 34

Contenidos 1 Recursión Principio de Optimalidad Ejemplos 2 Juegos El juego de las piedras Juegos Combinatorios Leopoldo Taravilse (UBA) TC 2012 2 / 34

Contenidos Recursión 1 Recursión Principio de Optimalidad Ejemplos 2 Juegos El juego de las piedras Juegos Combinatorios Leopoldo Taravilse (UBA) TC 2012 3 / 34

Sucesión de Fibonacci Recursión Sucesión de Fibonacci La sucesión de Fibonacci se define como f 0 = 1, f 1 = 1y f n+2 = f n + f n+1 para todo n 0 Leopoldo Taravilse (UBA) TC 2012 4 / 34

Sucesión de Fibonacci Recursión Sucesión de Fibonacci La sucesión de Fibonacci se define como f 0 = 1, f 1 = 1y f n+2 = f n + f n+1 para todo n 0 Cómo podemos computar el término 100 de la sucesión de Fibonacci? Leopoldo Taravilse (UBA) TC 2012 4 / 34

Sucesión de Fibonacci Recursión Sucesión de Fibonacci La sucesión de Fibonacci se define como f 0 = 1, f 1 = 1y f n+2 = f n + f n+1 para todo n 0 Cómo podemos computar el término 100 de la sucesión de Fibonacci? Cómo podemos hacerlo eficientemente? Leopoldo Taravilse (UBA) TC 2012 4 / 34

Algoritmos recursivos Recursión Definición Un algoritmo se dice recursivo si calcula instancias de un problema en función de otras instancias del mismo problema hasta llegar a un caso base, que suele ser una instancia pequeña del problema, cuya respuesta generalmente está dada en el algoritmo y no es necesario calcularla. Leopoldo Taravilse (UBA) TC 2012 5 / 34

Algoritmos recursivos Recursión Definición Un algoritmo se dice recursivo si calcula instancias de un problema en función de otras instancias del mismo problema hasta llegar a un caso base, que suele ser una instancia pequeña del problema, cuya respuesta generalmente está dada en el algoritmo y no es necesario calcularla. Ejemplo Para calcular el factorial de un número, un posible algoritmo es calcular Factorial(n) como Factorial(n 1) n si n 1 o 1 si n = 0 Leopoldo Taravilse (UBA) TC 2012 5 / 34

Algoritmos recursivos Recursión Definición Un algoritmo se dice recursivo si calcula instancias de un problema en función de otras instancias del mismo problema hasta llegar a un caso base, que suele ser una instancia pequeña del problema, cuya respuesta generalmente está dada en el algoritmo y no es necesario calcularla. Ejemplo Para calcular el factorial de un número, un posible algoritmo es calcular Factorial(n) como Factorial(n 1) n si n 1 o 1 si n = 0 Veamos como calcular el n-ésimo fibonacci con un algorimto recursivo Leopoldo Taravilse (UBA) TC 2012 5 / 34

Recursión Cálculo Recursivo de Fibonacci 1 int fibo(int n) 2 { 3 if(n<=1) 4 return 1; 5 else 6 return fibo(n 2)+fibo (n 1); 7 } Leopoldo Taravilse (UBA) TC 2012 6 / 34

Recursión Cálculo Recursivo de Fibonacci 1 int fibo(int n) 2 { 3 if(n<=1) 4 return 1; 5 else 6 return fibo(n 2)+fibo (n 1); 7 } Notemos que fibo(n) llama a fibo(n 2), pero después vuelve a llamar a fibo(n 2) para calcular fibo(n 1), y a medida que va decreciendo el parámetro que toma fibo son más las veces que se llama a la función fibo con ese parámetro. Leopoldo Taravilse (UBA) TC 2012 6 / 34

Problemas de la recursión Recursión La función que usamos para calcular Fibonacci tiene un problema. Leopoldo Taravilse (UBA) TC 2012 7 / 34

Problemas de la recursión Recursión La función que usamos para calcular Fibonacci tiene un problema. Llamamos muchas veces a la misma función con los mismos parámetros Leopoldo Taravilse (UBA) TC 2012 7 / 34

Problemas de la recursión Recursión La función que usamos para calcular Fibonacci tiene un problema. Llamamos muchas veces a la misma función con los mismos parámetros Podemos solucionar esto? Podemos hacer que la función sea llamada pocas veces para cada parámetro? Leopoldo Taravilse (UBA) TC 2012 7 / 34

Problemas de la recursión Recursión La función que usamos para calcular Fibonacci tiene un problema. Llamamos muchas veces a la misma función con los mismos parámetros Podemos solucionar esto? Podemos hacer que la función sea llamada pocas veces para cada parámetro? Para lograr resolver este problema, vamos a introducir el concepto de programación dinámica Leopoldo Taravilse (UBA) TC 2012 7 / 34

Contenidos 1 Recursión Principio de Optimalidad Ejemplos 2 Juegos El juego de las piedras Juegos Combinatorios Leopoldo Taravilse (UBA) TC 2012 8 / 34

Programación dinámica La programación dinámica es una técnica que consiste en: Leopoldo Taravilse (UBA) TC 2012 9 / 34

Programación dinámica La programación dinámica es una técnica que consiste en: Dividir un problema en dos o más subproblemas o reducirlo a una instancia más fácil de calcular del problema. Leopoldo Taravilse (UBA) TC 2012 9 / 34

Programación dinámica La programación dinámica es una técnica que consiste en: Dividir un problema en dos o más subproblemas o reducirlo a una instancia más fácil de calcular del problema. Resolver las instancias de cada subproblema de la misma manera (dividiendo en subproblemas o reduciendo a otra instancia) hasta llegar a un caso base. Leopoldo Taravilse (UBA) TC 2012 9 / 34

Programación dinámica La programación dinámica es una técnica que consiste en: Dividir un problema en dos o más subproblemas o reducirlo a una instancia más fácil de calcular del problema. Resolver las instancias de cada subproblema de la misma manera (dividiendo en subproblemas o reduciendo a otra instancia) hasta llegar a un caso base. Guardar el resultado de cada instancia del problema la primera vez que se calcula, para que cada vez que se vuelva a necesitar el valor de esa instancia ya esté almacenado, y no sea necesario calcularlo nuevamente. Leopoldo Taravilse (UBA) TC 2012 9 / 34

Programación dinámica La programación dinámica es una técnica que consiste en: Dividir un problema en dos o más subproblemas o reducirlo a una instancia más fácil de calcular del problema. Resolver las instancias de cada subproblema de la misma manera (dividiendo en subproblemas o reduciendo a otra instancia) hasta llegar a un caso base. Guardar el resultado de cada instancia del problema la primera vez que se calcula, para que cada vez que se vuelva a necesitar el valor de esa instancia ya esté almacenado, y no sea necesario calcularlo nuevamente. Cómo hacemos para calcular una sóla vez una función para cada parámetro, por ejemplo, en el caso de Fibonacci? Leopoldo Taravilse (UBA) TC 2012 9 / 34

Cálculo de Fibonacci mediante Programación Dinámica 1 int fibo[100]; 2 int calcfibo( int n) 3 { 4 if(fibo[n]!= 1) 5 return fibo[n]; 6 fibo[n] = calcfibo(n 2)+calcFibo(n 1); 7 return fibo[n]; 8 } 9 int main() 10 { 11 for( int i=0;i<100;i++) 12 fibo[ i ] = 1; 13 fibo[0] = 1; 14 fibo[1] = 1; 15 ínt fibo50 = calcfibo(50); 16 } Leopoldo Taravilse (UBA) TC 2012 10 / 34

Ventajas de la La función que vimos recién que usa programación dinámica tiene una ventaja con respecto a la versión recursiva que vimos anteriormente. Leopoldo Taravilse (UBA) TC 2012 11 / 34

Ventajas de la La función que vimos recién que usa programación dinámica tiene una ventaja con respecto a la versión recursiva que vimos anteriormente. Llama menos veces a cada función Leopoldo Taravilse (UBA) TC 2012 11 / 34

Ventajas de la La función que vimos recién que usa programación dinámica tiene una ventaja con respecto a la versión recursiva que vimos anteriormente. Llama menos veces a cada función Para calcular calcfibo(n-1) necesita calcular calcfibo(n-2), pero ya lo calculamos antes, por lo que no es necesario volver a llamar a calcfibo(n-3) y calcfibo(n-4) Leopoldo Taravilse (UBA) TC 2012 11 / 34

Ventajas de la La función que vimos recién que usa programación dinámica tiene una ventaja con respecto a la versión recursiva que vimos anteriormente. Llama menos veces a cada función Para calcular calcfibo(n-1) necesita calcular calcfibo(n-2), pero ya lo calculamos antes, por lo que no es necesario volver a llamar a calcfibo(n-3) y calcfibo(n-4) Así podemos calcular calcfibo(50) mucho más rápido ya que este algoritmo es lineal mientras que el anterior era exponencial. Leopoldo Taravilse (UBA) TC 2012 11 / 34

Contenidos Principio de Optimalidad 1 Recursión Principio de Optimalidad Ejemplos 2 Juegos El juego de las piedras Juegos Combinatorios Leopoldo Taravilse (UBA) TC 2012 16 / 34

Otro tipo de problemas Principio de Optimalidad Hasta ahora vimos problemas en los que hay que calcular un número de terminado. Leopoldo Taravilse (UBA) TC 2012 17 / 34

Otro tipo de problemas Principio de Optimalidad Hasta ahora vimos problemas en los que hay que calcular un número de terminado. En algunos casos lo que tenemos que calcular es el menor o el mayor número que cumple con cierta propiedad. Leopoldo Taravilse (UBA) TC 2012 17 / 34

Otro tipo de problemas Principio de Optimalidad Hasta ahora vimos problemas en los que hay que calcular un número de terminado. En algunos casos lo que tenemos que calcular es el menor o el mayor número que cumple con cierta propiedad. En estos casos para poder usar programación dinámica necesitamos asegurarnos que la solución de los subproblemas es parte de la solución de la instancia original del problema. Leopoldo Taravilse (UBA) TC 2012 17 / 34

Principio de optimalidad Principio de Optimalidad Definición El principio de optimalidad de Bellman dice que la solución óptima de un subproblema es parte de una solución óptima del problema original. Leopoldo Taravilse (UBA) TC 2012 18 / 34

Principio de optimalidad Principio de Optimalidad Definición El principio de optimalidad de Bellman dice que la solución óptima de un subproblema es parte de una solución óptima del problema original. Bellman (quien descubrió la programación dinámica en 1953) afirmó que siempre que se cumple el principio de optimalidad se puede aplicar programación dinámica. Leopoldo Taravilse (UBA) TC 2012 18 / 34

! Problema El camino más corto unidireccional Archivo: camino (.c,.cpp,.pas) Problemas que requieren determinar el camino más corto aparecen en diversas áreas de ciencias de la computación. Por ejemplo, una de las restricciones en problema de ruteo en VLSI (very large scale integration) es minimizar el largo de los cables. El problema del vendedor viajero, es decir, indicar si un vendedor viajero puede realizar una ruta que visite una sola vez todas las ciudades con un límite de tiempo especificado, es uno de los problemas clásicos de las ciencias de la computación. El problema que se presenta ahora consiste en encontrar un camino mínimo que pase por los puntos de una grilla mientras se viaja sólo de izquierda a derecha. Dada una m x n matriz de enteros, se le pide escribir un programa que determine el camino con peso mínimo. Un camino comienza en cualquier fila de la primera columna (columna 1), y consiste en una secuencia de pasos terminando en la última columna (columna n). Un paso consiste en pasar de una columna i a una columna i+1 en una fila adyacente (horizontal o diagonal). La primera y última filas (filas 1 y m) de la matriz son consideradas adyacentes, i.e., la matriz se cierra de manera que representa un cilindro horizontal. El peso de un camino es la suma de enteros en cada una de las n celdas de la matriz que son visitadas. Por ejemplo, una pequeña variación da caminos diferentes como muestra la figura siguiente. 3 4 1 2 8 6 6 1 8 2 7 4 5 9 3 9 9 5 8 4 1 3 2 6 3 7 2 8 6 4 3 4 1 2 8 6 6 1 8 2 7 4 5 9 3 9 9 5 8 4 1 3 2 6 3 7 2 1 2 3 El camino mínimo es ilustrado para cada matriz. Note que el camino para la matriz a la derecha toma ventaja de la propiedad de adyacencia de la primera y última fila.!"#$%$%&'()%$*+",$-#-(-+(./%0+10$2%( 3$4"0/5+,6(

! Entrada La entrada consiste de una secuencia de especificación de matriz. Cada especificación consiste de las dimensiones de filas y columnas, seguidas por m x n enteros donde m es el número de filas y n es el número de columnas. Los enteros aparecen en la entrada en el orden de mayor orden de filas, es decir, los primeros n enteros son de la primera fila de la matriz, luego los siguientes n enteros son de la segunda fila, y sucesivamente. Los enteros en una línea serán separados de otros enteros por uno o más espacios. Notar que los enteros pueden ser negativos. Puede haber más de una especificación de matriz en un archivo de entrada. La entrada termina con el fin de archivo. Por cada especificación, los número de fila van de 1 a 10 inclusive, los números de columnas van de 1 a 100 inclusivo. Ninguno de los pesos del camino excederá valores de enteros representados usando 30 bits. Salida Dos líneas deberían ser la salida por cada especificación de matrices en el archivo de entrada, la primera representa un camino de peso mínimo, y la segunda línea es el costo del camino mínimo. El camino consiste de una secuencia de n enteros (separados por uno o más espacios) representando las filas que constituye el camino mínimo. Si hay más de un camino de peso mínimo, el camino que sea el menor lexicográficamente será el escogido. Puntuación 30 puntos. Se probarán un número de casos con matrices de una dimensión menor a 5 x 5. 30 puntos. Se probarán un número de casos con matrices de una dimensión menor a 10 x 10. 40 puntos. Se probarán un número de casos con matrices de una dimensión menor a 10 x 100. Entrada 5 6 3 4 1 2 8 6 6 1 8 2 7 4 5 9 3 9 9 5 8 4 1 3 2 6 3 7 2 8 6 4 5 6 3 4 1 2 8 6 6 1 8 2 7 4 5 9 3 9 9 5 8 4 1 3 2 6 3 7 2 1 2 3 2 2 9 10 9 10 Salida para la entrada de ejemplo 1 2 3 4 4 5 16 1 2 1 5 4 5 11 1 1 1 9!"#$%$%&'()%$*+",$-#-(-+(./%0+10$2%( 3$4"0/5+,6(

Final Nacional 2013 Problema D Montaña archivo: montana{.c,.cpp,.pas} Ema y Camilo disfrutan de pasear por las montañas, sin embargo, la cordillera tiene tantos cerros distintos que generalmente para moverse de un punto a otro deben subir y bajar repetidamente. Ellos están cansados de esta situación y les gustaría encontrar un camino que los lleve de un punto a otro tal que, o bien sólo suba, o bien sólo baje. También pueden mantenerse por ciertos tramos a la misma altura, ya que esto realmente no les molesta, pero si en su camino alguna vez tuvieron que bajar, quieren nunca tener que volver a subir. Similarmente, si en el caminotuvieronquesubir,quierennunca tener que volver a bajar. Camilo está seguro que siempre podrá encontrar un camino que cumpla sus requisitos, pero Ema no está tan segura. Ellos se han enterado de tu participación en las olimpiadas de informática y les gustaría tener tu ayuda para encontrar talcamino(siesqueexiste). Ema y Camilo tienen un mapa que indica la altura del terreno en cada punto. Estos puntos forman una grilla equiespaciada en el terreno. Para evitar perderse EmayCamiloquisieranquelesentregaras instrucciones muy simples. Debes indicarles cómo moverse desde el punto de partida hasta el final. Los posibles movimientos son (N)orte, (S)ur, (E)ste y (O)este (como se indica a la izquierda de la figura). Obviamente, Ema y Camilo quieren recorrer lo menos posible, por lo que tu programa deberá ser capaz de encontrar la ruta con la menor cantidad de movimeintos. En la figura (centro) se muestra un ejemplo de un posible mapa del terreno con indicaciones de alturas. El puntodepartidaeseldestacadoenla parte superior y el de llegada el destacado en la parte inferior. El dibujo en la derecha muestra dos rutas posibles con el mínimo número de pasos, 6 en este caso, ysoncaminosdesubida. O N S E 7 10 15 15 16 14 12 20 18 17 14 8 11 19 15 14 16 20 19 8 La ruta de flechas punteadas en el dibujo estaría dada por los movimientos SOSSEE, y la ruta de flechas sólidas estaría dada por los movimientos EESSSO. Entrada Cada caso de prueba contiene en la primera linea 7 números enteros, W, H, x ini, y ini, x fin, y fin, C, todos separados por un espacio en blanco. W y H corresponden al ancho y alto del mapa, respectivamente, (x ini,y ini )sonlascoordenadasdelpuntodepartida,(x fin,y fin )lascoordenadasdelpuntofinal,yc el tipo de consulta que se hará. Los valores son tales que 1 W 2000, 1 H 2000, 0 x ini <W, 0 y ini <H,0 x fin <W,0 y fin <H,yC es igual a 0 o 1. Las coordenadas en el mapa crecen en el eje x de izquierda a derecha, y en el eje y de arriba hacia abajo, ambas partiendo desde 0. Las siguientes H lineas de la entrada contienen cada una W enteros separados por un espacio, correspondientes a la altura en cada punto del mapa.