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

Leave a Reply

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

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

Close

Meta