¿Cuál es la diferencia entre programación dinámica y programación lineal?

Esto es un poco confuso porque hay dos cosas diferentes que comúnmente se conocen con el nombre de “programación dinámica”: un principio de diseño de algoritmos y un método para formular un problema de optimización. Me voy a concentrar en comparar los dos métodos de optimización.

Un programa lineal es un problema de optimización en el que queremos minimizar una función lineal sujeta a algunas restricciones lineales. Vea el primer ejemplo en Wikipedia para un problema de programación lineal muy simple.

En un programa dinámico, queremos tomar una serie de decisiones de tal manera que se maximice alguna función. La clave es que el conjunto de decisiones disponibles para nosotros en cualquier momento depende de lo que ya hayamos decidido hacer anteriormente. El ejemplo más simple que conozco es el problema óptimo de consumo y ahorro descrito en Wikipedia.

La diferencia clave entre los dos es que en la programación dinámica estamos tomando una decisión a la vez, mientras que en la programación lineal estamos tomando todas las decisiones por adelantado.

La programación dinámica es una forma de resolver problemas dividiéndolos en subproblemas más simples. Es esencialmente una recursión ‘inteligente’. A menudo, el trabajo adicional no tiene que repetirse si las soluciones a los subproblemas se almacenan en caché después de que se resuelven. La programación dinámica tiene un nombre confuso que se remonta a sus raíces como un campo estudiado por investigadores de operaciones.

La programación lineal es un método matemático (y algoritmos asociados) para maximizar o minimizar una función sujeta a una serie de restricciones lineales.