Ejemplo de Relajación Lagrangeana en Programación Entera

El método de Relajación Lagrangeana (o Relajación Lagrangiana) consiste básicamente en un Método de Descomposición cuya idea se basa en descomponer un problema original restringido, en principio complejo de resolver, de modo de reemplazarlo por otro problema que permita simplificar la resolución. Esto se logra incorporando aquellas restricciones que se consideran difíciles (las que hacen compleja la resolución directa del problema) a la función objetivo, donde cada una de éstas tendrá asociada un Multiplicador de Lagrange \lambda que permitirá (iterativamente) penalizar el incumplimiento de las mismas al ser establecidos distintos valores para los multiplicadores. De esta forma se espera que las restantes restricciones (las que no se incorporan mediante penalizaciones en la función objetivo) permitan verificar un problema cuya resolución sea fácil (o al menos más sencilla que el problema en su estructura original).

El problema asociado a encontrar los valores de \lambda que permitan minimizar la función LR(\lambda) (que en sí es un problema de maximización) se conoce como el Problema Dual Lagrangeano. En general puede resultar un problema tedioso de resolver, no obstante, a continuación se enumeran una serie de pasos que permiten una aproximación a la implementación del método de Relajación Lagrangeana.

Supongamos que el problema original es de Maximización y que la o las restricciones relajadas son inecuaciones del tipo \leqslant:

  1. Comenzar con cada \lambda igual a cero. Definir inicialmente (y de forma arbitraria) un Paso de magnitud k.
  2. Resolver LR(\lambda) de modo de alcanzar la solución óptima en términos de x.
  3. Para cada restricción violada por x, incrementar el correspondiente \lambda por k.
  4. Si han transcurrido m iteraciones desde que se alcanzo la última relajación para el problema dual lagrangeano, disminuir k a la mitad.
  5. Ir al Paso 2.

Para ilustrar el procedimiento anterior consideremos un Problema de la Mochila como el que se describe a continuación:

ejemplo relajación lagrangeana

Luego de resolver el problema de Programación Entera propuesto haciendo uso de Solver de Excel se alcanza la Solución Óptima: x_{1}=0, x_{2}=0, x_{3}=1, x_{4}=1 con Valor Óptimo: V(PE)=13.

Relajaremos las Restricciones 1 y 2 incorporando éstas a la función objetivo y dejando exclusivamente las condiciones de binarios para las variables de decisión. Esto da origen a nuestro problema de Relajación Lagrangeana LR(\lambda):

relajación lagrangeana programación entera

Consideraremos inicialmente \lambda_{1}=0 y \lambda_{2}=0. La resolución de dicha instancia es trivial obteniéndose como Solución Óptima: x_{1}=1, x_{2}=1, x_{3}=1, x_{4}=1 y Valor Óptimo: LR(\lambda)=22. Notar que la solución alcanzada no satisface la Restricción 1 (sin embargo, se satisface la Restricción 2).

Penalizaremos la Restricción 1 al considerar \lambda_{1}=0,5 (penalización arbitrariamente definida como punto de partida) y manteniendo \lambda_{2}=0 (dado que la Restricción 2 se satisface). La Solución Óptima es x_{1}=1, x_{2}=1, x_{3}=1, x_{4}=1 con Valor Óptimo de LR(\lambda)=20. En consecuencia, la penalización establecida resulto ser insuficiente para que se evitara la violación (incumplimiento) de la Restricción 1.

Sea \lambda_{1}=1 (aumentamos nuevamente en 0,5 la penalización de la Restricción 1) y \lambda_{2}=0. La Solución Óptima se mantiene: x_{1}=1, x_{2}=1, x_{3}=1, x_{4}=1 con Valor ÓptimoLR(\lambda)=18.

Sea \lambda_{1}=1,5 y \lambda_{2}=0. La Solución Óptima se mantiene: x_{1}=1, x_{2}=1, x_{3}=1, x_{4}=1 con Valor Óptimo: LR(\lambda)=16. Se sigue violando la Restricción 1.

Sea \lambda_{1}=2 y \lambda_{2}=0. La Solución Óptima ahora es: x_{1}=0, x_{2}=1, x_{3}=0, x_{4}=0 con Valor ÓptimoLR(\lambda )=15. Ahora se satisfacen las Restricciones 1 y 2, teniendo éstas holguras de 5 y 1, respectivamente. Luego si se decide disminuir la penalización de la Restricción 1 a \lambda_{1}=1,5 se vuelve al mismo punto de la iteración anterior. En consecuencia se disminuye la magnitud del paso (penalización) a 0,25 de modo que \lambda_{1}=1,75 y \lambda_{2}=0. La Solución Óptima es: x_{1}=1, x_{2}=1, x_{3}=1, x_{4}=0 con Valor Óptimo: LR(\lambda)=15.

No obstante, la Restricción 2 no se satisface para esta nueva solución y de esta forma se establecen nuevas penalizaciones: \lambda_{1}=1,75 y \lambda_{2}=0,25 y  que dan origen a la Solución Óptima: x_{1}=1, x_{2}=1, x_{3}=1, x_{4}=1 con Valor Óptimo: LR(\lambda)=15.

El procedimiento continua de esta forma disminuyendo la magnitud del paso (penalización) cuando resulta necesario. Notar que de esta forma las respectivas penalizaciones pueden aumentar o disminuir al cabo de una iteración. El detalle de las iteraciones realizadas se muestra a continuación:

iteraciones relajación lagrangeana

Para cada iteración k se muestra la penalización aplicada para la Restricción 1 y 2 respectivamente, el criterio para la actualización del Paso, el valor de la función objetivo de la Relajación Lagrangeana LR(\lambda ), la Solución Óptima alcanzada para el problema (destacado con color amarillo), el valor que representa dicha solución óptima al ser evaluada en la función objetivo original V(PE), la holgura de la Restricción 1 (2) (con color rojo se destaca cuando se viola la restricción en una determinada magnitud) y si la solución óptima alcanzada en la iteración k-ésima es factible en el problema original PE).

convergencia dual lagrangeano

Según se señala en un tutorial  por Michael A. Trick (donde se ha tomado este ejemplo y se ha extendido a un número mayor de iteraciones con ciertas variaciones en la aplicación de las mismas) las penalizaciones “óptimas” (luego de seguir iterando) corresponderán aproximadamente a \lambda_{1}=1,83 y \lambda_{2}=0,33, alcanzando LR(\lambda )=14,67 que constituye una cota superior del valor óptimo del problema original. La Solución Óptima asociada a este escenario es x_{1}=0, x_{2}=1, x_{3}=1, x_{4}=0 que es factible en el problema original y reporta un valor en la función objetivo de 11. Notar que la Solución Óptima del PE) es x_{1}=0, x_{2}=0, x_{3}=1, x_{4}=1 con Valor Óptimo de 13.

Problema de la Mochila en Programación Entera resuelto con OpenSolver

El Problema de la Mochila (conocido también como Knapsack Problem o simplemente KP) es un problema clásico de la Investigación de Operaciones y en particular de la Programación Entera. Consiste en un excursionista que debe preparar su mochila, la cual tiene una capacidad limitada y por tanto no le permite llevar todos los artículos que quisiera tener en la excursión. Cada artículo que el excursionista puede incluir en la mochila le reporta una determinada utilidad. Luego el problema consiste en seleccionar un subconjunto de objetos de forma tal que se maximice la utilidad que el excursionista obtiene, pero sin sobrepasar la capacidad de acarrear objetos.

problema de la mochila

En este contexto existen varias aplicaciones que guardan una similitud conceptual con el Problema de la Mochila y en consecuencia nos podemos beneficiar de la formulación y resolución de un modelo de optimización matemática para dicho propósito. Consideremos el siguiente ejemplo:

Problema de la Mochila

Un armador tiene un carguero con capacidad de hasta 700 toneladas. El carguero transporta contenedores de diferentes pesos para una determinada ruta. En la ruta actual el carguero puede transportar algunos de los siguientes contenedores:

tabla-toneladas-contenedore

El analista de la empresa del armador desea determinar el envío (conjunto de contenedores) que maximiza la carga transportada. Para ello se propone el siguiente modelo de Programación Entera:

Variables de Decisión:

variables-problema-mochila

Función Objetivo: Consiste en maximizar la carga que transportará el carguero.

funcion-objetivo-mochila

Restricciones: El peso de la carga transportada no puede exceder la capacidad máxima del carguero.

restricciones-mochila

Al implementar computacionalmente el problema anterior haciendo uso de OpenSolver se alcanzan los siguientes resultados:

solucion-optima-problema-mo

La solución óptima consiste en transportar los contenedores C1, C2, C3, C4, C8, C9 y C10, con un valor óptimo de 700 (toneladas), es decir, se utiliza la capacidad completa del carguero. Notar que otra solución óptima consiste en transportar los contenedores C1, C3, C4, C5, C6, C7, C8 y C9 lo que reporta un similar valor en la función objetivo.

¿Quieres tener el archivo Excel con la resolución en OpenSolver de este problema?. Recomiéndanos en Facebook o Google+ utilizando la herramienta de redes sociales a continuación y accede de forma gratuita e inmediata a la descarga del archivo.

[sociallocker]Problema Mochila[/sociallocker]