Orientación básica

Para ejecutar los códigos aquí expuestos y crear nuevos, puedes indistintamente:

  1. Utilizar tu entorno RStudio, si lo tienes descargado en tu PC

  2. Trabajar en RCloud (recuerda crear un usuario)

  3. Utilizar Google Colaboratory (Video de ayuda para utilizar código R allí).

    Entre otras posibilidades (Jupyter Notebooks, etc.).

Función simplex() del package boot

Sirve para problemas de tamaño no muy grande (leer Nota en la ayuda).

Instalar y cargar package previamente. [Fuente]

Función: simplex(a, A1, b1, A2, b2, A3, b3, maxi, n.iter, eps)

Argumentos:

Devuelve: un objeto de la clase simplex, que es una lista con componentes (entre otros):

etc.

Ejemplos

[Fuente enunciados]

library(boot)
#a coef. función objetivo
a=c(5,6)
#A1 matriz de coef. desigualdades <=
A1=matrix(c(3,2,4,6),2,2,byrow=TRUE)
#b1 términos indep. de desigualdades <=
b1=c(120,260)
simplex1<- simplex(a, A1, b1, maxi=TRUE )
simplex1
## 
## Linear Programming Results
## 
## Call : simplex(a = a, A1 = A1, b1 = b1, maxi = TRUE)
## 
## Maximization Problem with Objective Function Coefficients
## x1 x2 
##  5  6 
## 
## 
## Optimal solution has the following values
## x1 x2 
## 20 30 
## The optimal value of the objective  function is 280.
library(boot)
#a coef. función objetivo
a=c(3,6)
#A1 matriz de coef. desigualdades <=
A1=matrix(c(1,1),1,2,byrow=TRUE)
#b1 términos indep. de desigualdades <=
b1=20
#A2 matriz de coef. desigualdades >=
A2=matrix(c(4,1,1,1),2,2,byrow=TRUE)
#b2 términos indep. de desigualdades <=
b2=c(20,10)
simplex2<- simplex(a, A1, b1, A2, b2, maxi=FALSE )
simplex2
## 
## Linear Programming Results
## 
## Call : simplex(a = a, A1 = A1, b1 = b1, A2 = A2, b2 = b2, maxi = FALSE)
## 
## Minimization Problem with Objective Function Coefficients
## x1 x2 
##  3  6 
## 
## 
## Optimal solution has the following values
## x1 x2 
## 10  0 
## The optimal value of the objective  function is 30.
library(boot)
#a coef. función objetivo
a=c(3,-2, 2)
#A1 matriz de coef. desigualdades <=
A1=matrix(c(1,1,1,2,1,2,5,2,3),3,3,byrow=TRUE)
#b1 términos indep. de desigualdades <=
b1=c(15,26,43)
simplex3<- simplex(a, A1, b1, maxi=TRUE )
simplex3
## 
## Linear Programming Results
## 
## Call : simplex(a = a, A1 = A1, b1 = b1, maxi = TRUE)
## 
## Maximization Problem with Objective Function Coefficients
## x1 x2 x3 
##  3 -2  2 
## 
## 
## Optimal solution has the following values
## x1 x2 x3 
##  2  0 11 
## The optimal value of the objective  function is 28.
library(boot)
#a coef. función objetivo
a=c(1.5,1,2.5)
A1=0
b1=0
#A2 matriz de coef. desigualdades >=
A2=matrix(c(0.5,0.6,0.4,0.2,0.1,0.3),2,3,byrow=TRUE)
#b2 términos indep. de desigualdades >=
b2=c(6,3.1)
simplex4<- simplex(a, A1, b1, A2, b2, maxi=FALSE )
simplex4
## 
## Linear Programming Results
## 
## Call : simplex(a = a, A1 = A1, b1 = b1, A2 = A2, b2 = b2, maxi = FALSE)
## 
## Minimization Problem with Objective Function Coefficients
##  x1  x2  x3 
## 1.5 1.0 2.5 
## 
## 
## Optimal solution has the following values
##   x1   x2   x3 
## 15.5  0.0  0.0 
## The optimal value of the objective  function is 23.25.

Función lp() del package lpSolve

Se trara de otra función para resolver PPLs, pero más completa pues admite variables enteras (programación entera) y variables binarias (programación 0-1).

Para usarla hay que instalar y cargar el package previamente. [Fuente]

Función: lp (direction, objective.in, const.mat, const.dir, const.rhs, int.vec, binary.vec)

Argumentos:

Devuelve: un objeto de la clase lp, que es una lista con componentes (entre otras):

Ejemplo

lpSolveasume que todas las variables son no negativas.

Si queremos tener una variable libre, es necesario hacer la siguiente transformación: Xn = XnA - XnB, donde XnA y XnB son no negativas. [Fuente]

library(lpSolve)
objective.in <- c(1, 9, 3) 
const.mat <-  matrix (c(1, 2, 3, 3, 2, 2), nrow=2, 
                               byrow=TRUE)
const.dir <- c(">=", "<=") 
const.rhs <- c(1, 15)
lpmax <- lp ("max", objective.in, const.mat, 
            const.dir, const.rhs, compute.sens=TRUE, 
            int.vec=c(2:3), binary.vec=c(1))
#ver si hubo éxito y valor hallado:
lpmax
## Success: the objective function is 63
#ver donde se alcanza el óptimo:
lpmax$solution
## [1] 0 7 0
library(lpSolve)
objective.in <- c(1, 9, 3) 
const.mat <-  matrix (c(1, 2, 3, 3, 2, 2), nrow=2, 
                               byrow=TRUE)
const.dir <- c(">=", "<=") 
const.rhs <- c(1, 15)
lpmax2 <- lp ("max", objective.in, const.mat, 
            const.dir, const.rhs, compute.sens=TRUE)
#ver si hubo éxito y valor hallado:
lpmax2
## Success: the objective function is 67.5
#ver donde se alcanza el óptimo:
lpmax2$solution
## [1] 0.0 7.5 0.0

Ahora un ejemplo sin solución (Región disjunta, fuente: Grossman):

Funcionalidad específica para el transporte:

Función lp.transport() del package lpSolve

Debemos construir la Matriz de costo.

En esta matriz cada elemento [i,j]nos dice cuál es costo unitario de transporte desde "i" a "j".

Ejemplo:

La empresa “España” dedicada al tratamiento, recuperación y transformación de RAEE dispone de 2 plantas de operación (ubicadas en Madrid y Zaragoza) y 8 almacenes en los cuales se depositan los residuos hasta agotar su capacidad de acopio (situados en Madrid, Zaragoza, Bilbao, Barcelona, Valencia, Alicante, Albacete y Pamplona).

Los almacenes, solicitan a las plantas les envíe un transporte para trasladar los residuos para su tratamiento. El objetivo de la empresa es siempre minimizar los costos de transporte considerando las siguientes restricciones:

1-Satisfacer la mayor cantidad de demanda de vaciado de los almacenes.

2-No sobrepasar la capacidad de operación disponible=ofrecida por las plantas.

Se solicita: Determinar cuántas toneladas se trasladarán por cada vía almacén-planta y cuál es el costo total mínimo hallado, utilizando la siguiente tabla de datos:

-Plantas de tratamiento (filas).

-Almacenes de acopio (columnas).

-Límite de acopio de cada almacén (total de residuos que se demanda recoger = total de la columna “almacén #”).

-Límite de capacidad de tratamiento de cada planta (total de capacidad ofrecida disponible= total de la fila “planta #”).

-Costos unitarios (ton) de traslado por la vía que une cada planta-almacén.

Datos:

Modelización Matemática:

En este problema se interpreta a las plantas de tratamiento como proveedoras de servicios y a los almacenes como demanda (o clientes) del servicio de tratamiento.

Código:

La salida mostrará el valor de la función objetivo y en $solution se mostrará una matriz que reflejará cuántas toneladas RAEE se trasladarán desde el almacén columna "j" hasta la planta fila "i"

library(lpSolve)
# especificamos la matriz de costos
cost.mat <- matrix(nrow=2,ncol=8)
cost.mat[1,] <- c(14,24,21,20,21.5,19,17,30)
cost.mat[2,] <- c(24,15,28,20,18.5,19.5,24,28)

# no se puede exceder la capacidad de las plantas
row.signs <- rep("<=",2)
row.rhs <- c(100,45)

# la demanda de los almacenes debe ser satisfecha
col.signs <- rep(">=",8)
col.rhs <- c(22,14,18,17,15,13,15,20)

# problema de minimización
direction = "min"

distribucion <- lp.transport(cost.mat,direction,
                         row.signs,row.rhs,
                         col.signs, col.rhs)

#ver el costo mínimo total alcanzado:
distribucion
## Success: the objective function is 2583.5
#ver distribución matricial planta-almacén (proveedor-cliente):
distribucion$solution
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
## [1,]   22    0   18   17    0   13   15    4
## [2,]    0   14    0    0   15    0    0   16

Aquí otro, Ejemplo sencillo

Para conocer más: