Método geométrico

Análisis gráfico

Ejemplo

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 $

Ejercicio

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.

Método simplex

Programación lineal en R

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