La programación dinámica en teoría de control y teoría de sistemas informáticos es una forma de resolver problemas complejos dividiéndolos en subtareas más simples. Es aplicable a problemas con subestructura óptima, que parecen un conjunto de subproblemas superpuestos, cuya complejidad es ligeramente menor que la original. En este caso, el tiempo de cálculo, en comparación con los métodos "ingenuos", se puede reducir significativamente.
La idea clave en la programación dinámica es bastante simple. Como regla general, para resolver el problema, se requiere resolver partes separadas del problema (subproblema) y luego combinar las soluciones de las subtareas en una solución común. A menudo, muchas de estas subtareas son las mismas. El enfoque de programación dinámica consiste en resolver cada subproblema una sola vez, lo que reduce el número de cálculos. Esto es especialmente útil en casos donde el número de subtareas recurrentes es exponencialmente grande.
El método de programación dinámica desde arriba es una simple memorización de los resultados de resolver aquellos subproblemas que pueden surgir nuevamente en el futuro. La programación dinámica desde abajo implica reformular un problema complejo como una secuencia recursiva de subproblemas más simples.
La frase "programación dinámica" fue utilizada por primera vez en la década de 1940 por Richard Bellman para describir el proceso de encontrar una solución a un problema, donde la respuesta a un problema solo se puede obtener después de resolver el problema "precedente". En 1953, refinó esta definición a la moderna. El campo se fundó originalmente como análisis e ingeniería de sistemas, que fue reconocido por el IEEE . La contribución de Bellman a la programación dinámica ha sido inmortalizada en el nombre de la ecuación de Bellman , un resultado central de la teoría de la programación dinámica que reformula un problema de optimización en forma recursiva .
La palabra "programación" en la frase "programación dinámica" en realidad no tiene casi nada que ver con la programación "tradicional" (escribir código) y tiene sentido como en la frase " programación matemática ", que es sinónimo de la palabra "optimización". Por lo tanto, la palabra "programa" en este contexto significa más bien la secuencia óptima de acciones para obtener una solución al problema. Por ejemplo, un programa específico de eventos en una exposición a veces se denomina programa. El programa en este caso se entiende como una secuencia válida de eventos.
Una subestructura óptima en programación dinámica significa que se puede usar una solución óptima a subproblemas más pequeños para resolver el problema original. Por ejemplo, el camino más corto en un gráfico desde un vértice (denotado por s) a otro (denotado por t) se puede encontrar de la siguiente manera: primero, consideramos el camino más corto desde todos los vértices adyacentes a s hasta t, y luego, tomando teniendo en cuenta los pesos de las aristas que conectan s con vértices adyacentes, elegimos el mejor camino hacia t (por qué vértice es mejor pasar). En el caso general, podemos resolver un problema que tiene una subestructura óptima siguiendo los siguientes tres pasos.
Los subproblemas se resuelven dividiéndolos en subproblemas aún más pequeños, y así sucesivamente, hasta llegar al caso trivial de un problema que se puede resolver en tiempo constante (la respuesta se puede decir inmediatamente). Por ejemplo, si necesitamos encontrar n!, entonces 1! = 1 (o 0!=1).
Los subproblemas superpuestos en programación dinámica significan subproblemas que se utilizan para resolver una serie de problemas (no solo uno) de mayor tamaño (es decir, hacemos lo mismo varias veces). Un ejemplo sorprendente es el cálculo de la sucesión de Fibonacci e , incluso en un caso tan trivial, ya hemos contado dos veces los cálculos de solo dos números de Fibonacci . Si continúa más y cuenta , se contará dos veces más, ya que nuevamente y será necesario para el cálculo . Resulta lo siguiente: un enfoque recursivo simple dedicará tiempo a calcular una solución para problemas que ya ha resuelto.
Para evitar tal curso de eventos, guardaremos las soluciones de los subproblemas que ya hemos resuelto, y cuando nuevamente necesitemos la solución del subproblema, en lugar de recalcularla, simplemente la sacaremos de la memoria. Este enfoque se llama memorización . También puede realizar optimizaciones adicionales; por ejemplo, si estamos seguros de que ya no necesitamos resolver una subtarea, podemos eliminarla de la memoria y liberarla para otras necesidades, o si el procesador está inactivo y sabemos que la solución de algunas subtareas que aún no han sido calculadas, necesitamos en el futuro, podemos resolverlas con anticipación.
Resumiendo lo anterior, podemos decir que la programación dinámica utiliza las siguientes propiedades del problema:
La programación dinámica generalmente sigue dos enfoques para la resolución de problemas:
Los lenguajes de programación pueden recordar el resultado de una llamada de función con un determinado conjunto de argumentos ( memoización ) para acelerar el "cálculo por nombre". Algunos lenguajes tienen esta capacidad incorporada (por ejemplo , Scheme , Common Lisp , Clojure , Perl , D ), mientras que otros requieren extensiones adicionales ( C++ ).
Se conocen la programación dinámica serial, que se incluye en todos los libros de texto sobre investigación de operaciones , y la programación dinámica no serial (NSDP), que actualmente es poco conocida, aunque fue descubierta en la década de 1960.
La programación dinámica convencional es un caso especial de programación dinámica no serial, donde el gráfico de relación variable es solo una ruta. NSDP, al ser un método natural y general para tener en cuenta la estructura de un problema de optimización, considera un conjunto de restricciones y/o una función objetivo como una función recursivamente computable. Esto permite encontrar una solución paso a paso, en cada etapa utilizando la información obtenida en las etapas anteriores, y la eficiencia de este algoritmo depende directamente de la estructura del gráfico de relación de variables. Si este gráfico es lo suficientemente disperso, la cantidad de cálculo en cada etapa se puede mantener dentro de límites razonables.
Una de las principales propiedades de los problemas resueltos mediante programación dinámica es la aditividad . Los problemas no aditivos se resuelven por otros métodos. Por ejemplo, muchas tareas de optimización de las inversiones de una empresa no son aditivas y se resuelven comparando el valor de la empresa con y sin inversiones.
diccionarios y enciclopedias | ||||
---|---|---|---|---|
|