Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INFORMÁTICA
FACULTAD DE INGENIERÍA GEOLÓGICA, MINERA Y METALÚRGICA
Universidad Nacional de Ingeniería
Definición:
La Programación Dinámica es un método de optimización de extraordinaria versatilidad.
Si bien fue desarrollada especialmente para la resolución de problemas en Procesos de
Decisión en Múltiples Pasos, diferentes investigaciones han mostrado que las mismas
ideas pueden utilizarse en otro tipo de problemas de matemática aplicada, e incluso
pueden ser útiles en el planteo de algunas cuestiones teóricas.
Habiendo surgido en los inicios de la época de las computadoras, la Programación
Dinámica fue, además, concebida con un ojo puesto en esta potente herramienta. La
Ecuación Funcional que se obtiene, para cada problema, a través del uso del Principio de
Optimalidad de Bellman permite, con mayor o menor esfuerzo dependiendo del caso,
establecer una recurrencia que es, en sí misma, un algoritmo que resuelve el problema en
cuestión.
Historia:
Durante la Segunda Guerra Mundial la investigación matemática se extendió hacia zonas
que hasta entonces le habían sido ajenas. Si bien la participación de la ciencia, y de la
matemática en particular, en los enfrentamientos bélicos, puede remontarse a la
organización, por parte de Arquímedes, de las defensas de Siracusa, lo cierto es que,
hasta la Segunda Guerra, no habían existido políticas consecuentes de aplicación
específica de la matemática a problemas de importancia en esta materia.
En realidad, este fenómeno comenzó en los años previos al estallido de la guerra.
Alemania, Inglaterra, Estados Unidos y la U.R.S.S. formaron equipos de investigación,
cuyos trabajos fueron la base de muchos de los inventos que aparecieron en
funcionamiento durante la guerra (el radar, por ejemplo) y que abrieron las nuevas ramas
de la matemática que se desarrollarían enormemente después de 1945.
La primera gran disciplina que surgió a partir del abordaje matemático de los problemas
específicos de la guerra fue, seguramente, la Investigación Operativa1.
El término Operations Research fue utilizado por primera vez en Inglaterra, en 1941. Las
investigaciones realizadas en los centros de Investigación Operativa de la Royal Air Force
y otros organismos militares británicos permitieron, entre otras cosas, incrementar la
eficacia de la los patrullajes aéreos en busca de submarinos alemanes, y
consecuentemente, la cantidad de submarinos dañados o hundidos.
Rápidamente se hizo evidente que las mismas técnicas utilizadas en el ámbito militar
podían servir en otras áreas de aplicación. En los años posteriores a la Guerra se abrieron
nuevos temas de investigación y se plantearon nuevos problemas, que fueron abordados
desde una perspectiva matemática. Entre estos nuevos temas se encontraba la teoría de
los Procesos de Decisión en Múltiples Pasos, que Richard Bellman (1920 - 1984) abordó
alrededor de 1952, y para los cuales fue pensada originalmente la Programación
Dinámica.
Después de desarrollar el método en el área específica de los problemas de decisión
discretos, Bellman y sus colaboradores se dedicaron a la ardua tarea de formular
diferentes problemas en los términos de la Programación Dinámica. Como resultado de
esta labor, encontraron que las ideas centrales del método, en particular, el Principio de
Optimalidad, podían ser aplicadas satisfactoriamente en muchos de los problemas
abordados.
Descubrieron también las limitaciones de esta técnica y hallaron modos de sobreponerse
a ellas, para algunos problemas puntuales. La Programación Dinámica es, hoy en día, un
recurso imprescindible de Matemática Aplicada y, también, una importante herramienta
teórica.
Definiciones necesarias:
Etapa: es la parte del problema que posee un conjunto de alternativas mutuamente
excluyentes, de las cuales se seleccionará la mejor alternativa.
Estado: es el que refleja la condición o estado de las restricciones que enlazan las
etapas. Representa la “liga” entre etapas de tal manera que cuando cada etapa se
optimiza por separado la decisión resultante es automáticamente factible para el problema
completo.
Principio de Optimalidad:
Cuando hablamos de optimizar nos referimos a buscar alguna de las mejores soluciones
de entre muchas alternativas posibles. Dicho proceso de optimización puede ser visto
como una secuencia de decisiones que nos proporcionan la solución correcta.
Si, dada una subsecuencia de decisiones, siempre se conoce cuál es la decisión que
debe tomarse a continuación para obtener la secuencia óptima, el problema es elemental
y se resuelve trivialmente tomando una decisión detrás de otra, lo que se conoce
como estrategia voraz.
En otros casos, aunque no sea posible aplicar la estrategia voraz, se cumple el principio
de optimalidad de Bellman que dicta que «dada una secuencia óptima de decisiones, toda
subsecuencia de ella es, a su vez, óptima».
En este caso sigue siendo posible el ir tomando decisiones elementales, en la confianza
de que la combinación de ellas seguirá siendo óptima, pero será entonces necesario
explorar muchas secuencias de decisiones para dar con la correcta, siendo aquí donde
interviene la programación dinámica.
Contemplar un problema como una secuencia de decisiones equivale a dividirlo en
problemas más pequeños y por lo tanto más fáciles de resolver como hacemos en Divide
y Vencerás, técnica similar a la de programación dinámica. La programación dinámica se
aplica cuando la subdivisión de un problema conduce a:
Si llamamos, por ejemplo, a fib (5) , produciremos un árbol de llamadas que contendrá
funciones con los mismos parámetros varias veces:
1. fib(5)
2. fib(4) + fib(3)
3. (fib(3) + fib(2)) + (fib(2) + fib(1))
4. ((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) +
fib(1))
5. (((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) +
fib(0)) + fib(1))
Suponemos que la tabla se introduce por primera vez correctamente inicializada, con
todas las posiciones con un valor inválido, como por ejemplo -1, que se distingue por no
ser uno de los valores que computa la función.
Coeficientes binomiales
El algoritmo recursivo que calcula los coeficientes binomiales resulta ser de complejidad
exponencial por la repetición de los cálculos que realiza. No obstante, es posible diseñar
un algoritmo con un tiempo de ejecución de orden O (nk) basado en la idea del Triángulo
de Pascal, idea claramente aplicable mediante programación dinámica. Para ello es
necesaria la creación de una tabla bidimensional en la que ir almacenando los valores
intermedios que se utilizan posteriormente.
La idea recursiva de los coeficientes binomiales es la siguiente:
La idea para construir la tabla de manera eficiente y sin valores inútiles es la siguiente:
0 1 2 3 ... k-1 k
0 1
1 1 1
2 1 2 1
3 1 3 3 1
0 si i = j
C(i, j)=
Min(T(i,k) + C(k,j), T(i,j)) si i < k <= j