1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación IV Tema: Programación Dinámica. Objetivos Específicos Definir brevemente el concepto de programación dinámica. Interpretar un algoritmo y pasarlo a sintaxis de C#. Aplicar Recursividad al ejemplo de la práctica. Materiales y Equipo Guía Número 6. Computadora con programa Microsoft Visual C#. Introducción Teórica Para que un problema pueda ser resuelto con la técnica de programación dinámica, debe cumplir con ciertas características: El problema puede ser dividido en etapas. Cada etapa tiene un número de estados asociados a ella. La decisión óptima de cada etapa depende solo del estado actual y no de las decisiones anteriores. La decisión tomada en una etapa determina cual será el estado de la etapa siguiente. Para resolver un problema de programación dinámica debemos al menos: Identificación de etapas, estados y variable de decisión: Cada etapa debe tener asociado una o más decisiones, cuya dependencia de las decisiones anteriores está dada exclusivamente por las variables de estado. Cada estado debe contener toda la información relevante para la toma de decisión asociada al período.
2 Programación IV, Guía 6 Las variables de decisión son aquellas sobre las cuales debemos definir su valor y modificar el estado de la próxima etapa. Descripción de ecuaciones: Nos deben indicar como se acumula la función (función objetivo) y como varían las funciones de estado de una etapa a otra. Para el caso del diseño de un algoritmo de Programación Dinámica debemos seguir los siguientes pasos: 1. Planteamiento de la solución como una sucesión de decisiones y verificación de que ésta cumple el principio de óptimo. 2. Definición sucesiva de la solución (función objetivo). 3. Cálculo del valor de la solución óptima mediante una tabla en donde se almacenan soluciones a problemas parciales para reutilizar los cálculos (evitar funciones recursivas). 4. Construcción de la solución óptima haciendo uso de la información contenida en la tabla anterior. Como ejemplo, una solución en programación dinámica para la secuencia fibonacci. En esta, la sucesión se puede expresarse de manera recursiva. Pero con esto perdería mucho potencial dado que la forma recursiva repite cálculos innecesariamente, la estructura matemática es la siguiente: En esta se tienen tres estados posibles: El primero es cuando n = 0, se toma la decisión que se guardará 1 en la secuencia. En el segundo, cuando n = 1, se decide guardar 1 en la secuencia. En el tercero, cuando n > 1, se decide guardar la suma de los dos últimos valores de la secuencia. Con esta descripción se tiene el siguiente algoritmo de programación dinámica: FUNCION Fibonacci (N: ENTERO): ARREGLO [N] DE ENTEROS
3 VARIABLES secuencia: ARREGLO [N] DE ENTEROS i: ENTERO INICIO PARA i = 0 HASTA n HACER SI i <= 1 ENTONCES secuencia[i] = 1 SINO secuencia[i] = secuencia[i-1] + secuencia[i-2] FINSI FINPARA retornar secuencia[n] FIN Como puede verse: Se basa en una tabla de resultados. Se tiene una sucesión de etapas. Cada etapa tiene un estado asociado. A partir de ese estado se toma una decisión la cual afectará o no al siguiente estado. Se evita hacer cálculos innecesarios (recursividad). Procedimiento Ejemplo 1. Adaptando a C# el algoritmo de la secuencia fibonacci con programación dinamica, quedaria como sigue: public static int[ ] fibonacci(int n) { int[ ] secuencia = new int[n]; for(int I = 0; I < n; i++) { if(i <= 1) { secuencia[i] = 1; //se engloban dos estados else
4 Programación IV, Guía 6 { secuencia[i] = secuencia[i-1] + secuencia[i-2]; //tercer estado return secuencia; Análisis de resultados Realice un programa en C# para implementar la función de la secuencia fibonacci en una interfaz gráfica de formulario (Windows Forms). Haga también una implementación con funciones recursivas en una interfaz gráfica de formulario (Windows Forms). Deduzca el porqué su implementación con arreglos tiene un mejor desempeño que la forma recursiva. Investigación Complementaria Para la siguiente semana: Investigue el problema del cambio de moneda (este es implementado en cajeros automáticos), y realice su solución con programación dinámica implementado con Visual C# en una interfaz gráfica de formulario (Windows Forms).
5 Guía 6: Programación Dinámica Hoja de cotejo: 6 Alumno: Máquina No: Docente: GL: Fecha: EVALUACIÓN % 1-4 5-7 8-10 Nota CONOCIMIENTO Del 20 al 30% deficiente de los y explicación incompleta de los completo y explicación clara de los APLICACIÓN DEL CONOCIMIENTO Del 40% al 60% ACTITUD Del 15% al 30% No tiene actitud proactiva. Actitud propositiva y con propuestas no aplicables al contenido de la guía. Tiene actitud proactiva y sus propuestas son concretas. TOTAL 100%