Una pequeña empresa vende dos productos, denominados producto 1 y producto 2. Cada tonelada de producto1 consume 30 horas de trabajo, y una del Producto 2 consume 20 horas de trabajo. La empresa tiene un máximo de 2.700 horas de trabajo para el período considerado. En cuanto a las horas de máquina, cada tonelada de productos 1 y 2 consume 5 y 10 horas de máquina, respectivamente. Hay 850 horas de máquina disponibles. Cada tonelada de producto 1 produce 20$ de beneficio, mientras que el producto 2 rinde 60 dólares por cada tonelada vendida. Por razones técnicas, la empresa debe producir un mínimo de 95 toneladas en total entre ambos productos. Necesitamos saber cuántas toneladas de producto 1 y 2 se deben producir para maximizar el beneficio total. \[ min Z: 0.3P_1+0.9P_2 \]
Sujeto a: \[ P_1 + P_2 \geq 800 \\ 0.21P_1 - 0.30P_2 \leq 0 \\ 0.03P_1 - 0.01P_2 \geq 0 \\ \]
Con las condiciones de negatividad de \[ P_1, P_2\geq 0 \]
Para empezar a resolver el problema debemos de installar y habilitar los siguientes paquetes
library("lpSolve")
## Warning: package 'lpSolve' was built under R version 3.5.2
library("lpSolveAPI", character.only=TRUE)
## Warning: package 'lpSolveAPI' was built under R version 3.5.2
library("ggplot2")
## Warning: package 'ggplot2' was built under R version 3.5.2
Una vez habilitados se procede a elaborar las gráficas
Empezando por definr las funciones que representan a cada una de las restricciones
# Obseve que todas las funciones fueron modificadas para poder ser empresadas como $ P_2(P_1) $
P_2R1 <- function(P_1) 0.03/0.01*P_1
P_2R2 <- function(P_1) 0.21/0.3*P_1
P_2R3 <- function(P_1) 800 -1*P_1
Posteriormente se procede a elaborar las gráficas cada una de las restricciones ** Empezamos por el dominio**
x1 = seq(0,800)
Posteriormente empezamos a graficar
mydf = data.frame(x1, P_21=P_2R1(x1), P_22=P_2R2(x1),P_23= P_2R3(x1))
mydf <- transform(mydf, z = pmax(P_21,pmin(P_22, P_23)))
ggplot(mydf, aes(x = x1)) +
geom_line(aes(y = P_21), colour = 'blue') +
geom_line(aes(y = P_22), colour = 'green') +
geom_line(aes(y = P_23), colour = 'red')
Como se puede observar en el gráfico, la curva de la restricción 3 (línea roja) se intersecciona con las otras dos, por lo que se procede a encontrar los puntos de intersección
Interseccion entre R_3 y R_2
Se resuelve de manera matricial como ;
\[\begin{pmatrix} P_1 + P_2 = 800 \\ 0.21P_1 - 0.30P_2 = 0 \\ \end{pmatrix} \]
entonces las matrices A y B quedan como:
[ A= \[\begin{pmatrix} 1 & 1 \\ 0.21 & -0.30 \\ \end{pmatrix}\] ; B= \[\begin{pmatrix} 800 \\ 0 \\ \end{pmatrix}\]]
Definiendo matricialmente las funciones dentro de R, quedaría como
A<-matrix(c(1,1,0.21, -0.30 ), nrow=2, ncol = 2, byrow = T)
A
## [,1] [,2]
## [1,] 1.00 1.0
## [2,] 0.21 -0.3
B<-matrix(c(800,0 ), nrow=2, ncol = 1, byrow = F)
B
## [,1]
## [1,] 800
## [2,] 0
Resolviendo nos queda como
r<-solve(t(A)%*%A)%*%t(A)%*%B
r
## [,1]
## [1,] 470.5882
## [2,] 329.4118
Interseccion entre R_3 y R_1
Se resuelve de manera matricial como ;
\[\begin{pmatrix} P_1 + P_2 = 800 \\ 0.03P_1 - 0.01P_2 = 0 \\ \end{pmatrix} \]
entonces las matrices A y B quedan como:
[ A= \[\begin{pmatrix} 1 & 1 \\ 0.03 & -0.01 \\ \end{pmatrix}\] ; B= \[\begin{pmatrix} 800 \\ 0 \\ \end{pmatrix}\]]
Definiendo matricialmente las funciones dentro de R, quedaría como
A<-matrix(c(1,1,0.03, -0.01 ), nrow=2, ncol = 2, byrow = T)
A
## [,1] [,2]
## [1,] 1.00 1.00
## [2,] 0.03 -0.01
B<-matrix(c(800,0 ), nrow=2, ncol = 1, byrow = F)
B
## [,1]
## [1,] 800
## [2,] 0
Posteriormente se resuelve como
r<-solve(t(A)%*%A)%*%t(A)%*%B
r
## [,1]
## [1,] 200
## [2,] 600
Por último se busca determinar los puntos donde la función se minimice; por lo que simplemente se evalua en la función objetivo cada uno de los puntos encontrados
Definiendo la función objetivo
Para ello escribe el código como
val<-matrix(c(470.5882, 329.4118, 200,600), nrow=2, ncol = 2, byrow=T)
val
## [,1] [,2]
## [1,] 470.5882 329.4118
## [2,] 200.0000 600.0000
FO<-matrix(c(0.3,0.9), nrow=2, ncol=1)
FO
## [,1]
## [1,] 0.3
## [2,] 0.9
r=val%*%FO
r
## [,1]
## [1,] 437.6471
## [2,] 600.0000
como se observa la solución óptima del sistema es 437.647 con las variables $ P_1=470.6 $ y $ P_2=329.4 $
Una pequeña empresa vende dos productos, denominados producto 1 y producto 2. Cada tonelada de producto1 consume 30 horas de trabajo, y una del Producto 2 consume 20 horas de trabajo. La empresa tiene un máximo de 2.700 horas de trabajo para el período considerado. En cuanto a las horas de máquina, cada tonelada de productos 1 y 2 consume 5 y 10 horas de máquina, respectivamente. Hay 850 horas de máquina disponibles. Cada tonelada de producto 1 produce 20$ de beneficio, mientras que el producto 2 rinde 60 dólares por cada tonelada vendida. Por razones técnicas, la empresa debe producir un mínimo de 95 toneladas en total entre ambos productos. Necesitamos saber cuántas toneladas de producto 1 y 2 se deben producir para maximizar el beneficio total.
Para llevar a cabo un análisis simplex de un modelo de programación, primero se realiza el siguiente planteamiento
Sea FO la función objetivo tal que
\[ MIN: \\ FO=-x_1-3x_2 \]
con las siguientes restricciones
\[x_1+x_2 \leq 6 \] \[-x_1+2x_2 \leq 8 \]
cono las condición de no negatividad de \[ x_1, x_2 \geq 0 \]
Entonces elaboramos el planteamiento como
Objetivo <- c(-1, -3)
Luego definimos la matriz de coeficientes A
A = \[\begin{pmatrix} 1 & 1\\ -1 & 2\\ \end{pmatrix}\]
Coef_Restricciones <-matrix(c(1, 1, -1, 2),
nrow = 2,
ncol = 2,
byrow = TRUE)
Coef_Restricciones
## [,1] [,2]
## [1,] 1 1
## [2,] -1 2
Así como los valores del vector B
B^{T} = \[\begin{pmatrix} 6 \\ 8 \\ \end{pmatrix}\]
Sol_Restricciones <- c(6, 8)
Sol_Restricciones
## [1] 6 8
Por último buscamos definir las restricciones, utilizando el siguiente código
Dir_Restricciones <- c("<=", "<=")
Dir_Restricciones
## [1] "<=" "<="
Ahora se instala el paquete que permite solucionar la matrices por medio del método simplex
** Se puede utilizar la ruta de Tools/Install Packages o bien el comando **
library(lpSolve)
Ahora escribimos el código siguiente
Solucion <- lp(direction = "min",
objective.in = Objetivo,
const.mat = Coef_Restricciones,
const.dir = Dir_Restricciones,
const.rhs = Sol_Restricciones)
Sol<-c(Solucion$objval, Solucion$solution)
Sol
## [1] -15.333333 1.333333 4.666667