Programación lineal con variables enteras en R, usando la librería lpSolve

En la publicación anterior ( https://www.supplychaindataanalytics.com/es/resolver-un-problema-de-programacion-lineal-simple-usando-lpsolve-en-r/ ) detallamos cómo modelar y resolver un problema de optimización lineal usando el paquete lpSolve en R. Este problema tenía como función objetivo 2x + 3y, sujeta a la restricción x + y <= 3. Cuando ambas variables son continuas no negativas, la solución es y = 3 con el valor óptimo de la función objetivo igual a 9.

En esta publicación, agregaremos el modelamiento con variables enteras al incluir la restricción que y debe ser un número entero. Además, modificamos la restricción inicial, ahora x + y <= 3.9. Utilizando el paquete lpSolve en R, podemos incluir la restricción de la variable entera con el parámetro int.vec, que representa un vector con los índices de las variables enteras a ser consideradas por el problema. En este caso, el índice es 2, ya que y es un número entero.

Luego, resolvemos el problema de programación lineal similar al ejemplo anterior, solo que se tiene x + y <= 3.9 (en lugar de 3.0). La función objetivo no ha cambiado, por lo tanto, este es el problema no entero (que sirve como punto de referencia):

library(lpSolve)
f.obj <- c(2,3)                           # vector de coeficiente de la función objetivo

f.con <- matrix(c(1,1),nrow=1,byrow=TRUE) # matriz de coeficientes para la matriz de restricciones

f.dir <- c("<=")                          # vector de dirección de la restricción

f.rhs <- c(3.9)                           # valores de la restricción

#f.intvec <- NA                         # índices de las variables que deben ser enteros


solution <- lp(direction = "max",
               objective.in = f.obj,
               const.mat = f.con, 
               const.dir = f.dir, 
               const.rhs = f.rhs#,
               #int.vec = f.intvec,    # especificar este parámetro de función indica qué variables son enteros
               #all.int = FALSE
               )

solution
## Success: the objective function is 11.7

La solución óptima al problema no entero con la restricción x + y <= 3.9 tiene el siguiente óptimo (= máximo).

solution$solution
## [1] 0.0 3.9

Finalmente, modelamos y resolvemos el problema anterior, ahora definiendo y como una variable entera.

library(lpSolve)
f.obj <- c(2,3)                           # vector de coeficiente de la función objetivo

f.con <- matrix(c(1,1),nrow=1,byrow=TRUE) # matriz de coeficientes para la matriz de restricciones

f.dir <- c("<=")                          # vector de dirección de restricción

f.rhs <- c(3.9)                        # valores de restricción

f.intvec <- c(2)                       # índices de las variables que deben ser enteros

solution <- lp(direction = "max",
               objective.in = f.obj,
               const.mat = f.con, 
               const.dir = f.dir, 
               const.rhs = f.rhs,
               int.vec = f.intvec#,    # especificar este parámetro de función indica qué variables son enteros
               #all.int = FALSE
               )

solution
## Success: the objective function is 10.8

El valor máximo de la función objetivo, considerando la restricción de entero adicional, se ha reducido. El punto óptimo es ahora:

solution$solution
## [1] 0.9 3.0

Como se puede observar, la solución óptima ya no es y igual a 3.9, ahora y es igual a 3, ¡que de hecho es un valor entero!

Si está interesado en la programación lineal, te invitamos a consultar otras publicaciones de blog sobre este tema. Además, puedes revisar publicaciones sobre programación  no lineal y cuadrática en Python, usando el módulo SciPy.

Editado y traducido por: Ricardo Caballero, M.Sc.
Revisado por: Oswaldo Almonacid

You May Also Like

Leave a Reply

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.