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

Ingeniero industrial especializado en optimización y simulación (R, Python, SQL, VBA)
Leave a Reply