Mi compañía desarrolla dos modelos de vehículo eléctrico. Un modelo de 2 ruedas llamado P y otro de 4 ruedas llamado K. P está formado por 2 llantas, 1 chasis, 1 manillar; mientras que el modelo K necesita 4 llantas y 2 chasis. Todo esto se fabrica con una bobina de acero que se compra a un fabricante externo. Con cada bobina se puede fabricar 360 llantas, 280 chasis y 520 manillares. El coste de compra de cada bobina es de 100. El coste de producción del modelo P es de 25 mientras que el de K es de 40. Finalmente, la empresa cuenta con un stock inicial de 70 manillares, 110 llantas y 40 chasis.
Para mantener la empresa a flote es necesario producir un mínimo de 500 unidades por mes. Define un modelo de programación lineal, que minimice el costo total: los costos de producción de los dos vehículos y la compra de nuevas bobinas de acero.
Función objetivo:
Costo del modelo P es 25 Costo del modelo K es 40 Costo de cada bobinas es 100.
\[ Coste.total = 25P + 40K + 100B \]
CT = c(25, 40, 100)
Creamos una matriz con las restricciones:
Las filas están formadas por restricciones y las columnas por variables:
La primera fila la forman las llantas La segunda fila la forman los chasis. La tercera fila lo forman los manillares. La cuarta fila es el mínimo de producción.
Las columnas son el modela P, K y la Bobina:
\[ Matriz.de.restricciones=\begin{pmatrix} 2 & 4 & -360 \\ 1 & 2 & -280 \\ 1 & 0 & -520 \\ 1 & 1 & 0 \end{pmatrix} \]
# Matriz de restricciones:
M = matrix(c( 2, 4, -360,
1, 2, -280,
1, 0, -520,
1, 1, 0), nrow=4, byrow=TRUE)
# Restricciones de Stock y producción.
S = c(110, 40, 70, 500)
constranints_direction = c("<=", "<=", "<=", ">=")
library(lpSolveAPI)
# Primero activamos el modelo indicando el número de variables:
lprec = make.lp(4, 3)
# Indicamos el tipo de optimización:
lp.control(lprec, sense="min")
## $anti.degen
## [1] "fixedvars" "stalling"
##
## $basis.crash
## [1] "none"
##
## $bb.depthlimit
## [1] -50
##
## $bb.floorfirst
## [1] "automatic"
##
## $bb.rule
## [1] "pseudononint" "greedy" "dynamic" "rcostfixing"
##
## $break.at.first
## [1] FALSE
##
## $break.at.value
## [1] -1e+30
##
## $epsilon
## epsb epsd epsel epsint epsperturb epspivot
## 1e-10 1e-09 1e-12 1e-07 1e-05 2e-07
##
## $improve
## [1] "dualfeas" "thetagap"
##
## $infinite
## [1] 1e+30
##
## $maxpivot
## [1] 250
##
## $mip.gap
## absolute relative
## 1e-11 1e-11
##
## $negrange
## [1] -1e+06
##
## $obj.in.basis
## [1] TRUE
##
## $pivoting
## [1] "devex" "adaptive"
##
## $presolve
## [1] "none"
##
## $scalelimit
## [1] 5
##
## $scaling
## [1] "geometric" "equilibrate" "integers"
##
## $sense
## [1] "minimize"
##
## $simplextype
## [1] "dual" "primal"
##
## $timeout
## [1] 0
##
## $verbose
## [1] "neutral"
# Indicamos los valores de la función objetivo:
set.objfn(lprec, CT)
# Añadimos las restricciones al modelo:
add.constraint(lprec, M[1, ], "<=", S[1])
add.constraint(lprec, M[2, ], "<=", S[2])
add.constraint(lprec, M[3, ], "<=", S[3])
add.constraint(lprec, M[4, ], ">=", S[4])
#Debemos indicar en este caso que las variables son necesariamentes enteros.
set.type(lprec, 1, "integer")
set.type(lprec, 2, "integer")
set.type(lprec, 3, "integer")
# Ahora podemos mostrar el modelo construido:
lprec
## Model name:
## C1 C2 C3
## Minimize 25 40 100
## R1 0 0 0 free 0
## R2 0 0 0 free 0
## R3 0 0 0 free 0
## R4 0 0 0 free 0
## R5 2 4 -360 <= 110
## R6 1 2 -280 <= 40
## R7 1 0 -520 <= 70
## R8 1 1 0 >= 500
## Kind Std Std Std
## Type Int Int Int
## Upper Inf Inf Inf
## Lower 0 0 0
# Para resolver el problema simplemente:
solve(lprec)
## [1] 0
# Obtenemos la cantidad de piezas a fabricar de cada tipo
get.variables(lprec)
## [1] 500 0 3
# Y podemos recuperar el valorde la función objetivo correspondiente al mínimo coste.
get.objective(lprec)
## [1] 12800
# Se debe tener en cuenta que los límites predeterminados en la variable de decisión son
# c(0, 0, 0) y c(Inf, Inf, Inf)
get.bounds(lprec)
## $lower
## [1] 0 0 0
##
## $upper
## [1] Inf Inf Inf
#En esta hipotética situación; el mínimo coste que se tendría para alcanzar la cifra de producción de 500 unidades es de 12800. Así mismo habría que centrarse en producir llantas (500) y manillares (tan solo 3) sin la necesidad de producir más chasis usando los que tenemos en stock.