Optimización lineal con restricciones difusas realizada en R con FuzzyLP

El uso del paquete FuzzyLP en R ha demostrado una optimización lineal simple de un problema lineal bien definido usando la función crispLP en una publicación anterior. En ese ejemplo, se aplicó el algoritmo simplex básico para resolver el problema.

En esta publicación, se debe resolver un problema de optimización lineal con restricciones difusas. El problema es un problema de maximización y se indica a continuación:

Al resolver este problema con el paquete FuzzyLP, se debe definir el problema en sintaxis de matriz vectorial. Se debe aplicar la siguiente plantilla:

c es el vector de coeficientes de la función objetivo. x  es el vector que contiene las variables de optimización. A es la matriz de coeficientes de las restricciones lineales y b  es el vector que contiene los valores de restricción. t  son los valores máximos de violación de restricción que pueden ocurrir (por eso el problema es difuso).

La función FCLP.classicObjective comprendida por el paquete FuzzyLP resolverá este problema garantizando un cierto valor mínimo de función objetivo. la función FCLP.classicObjective intentará maximizar la beta, mientras que al mismo tiempo garantizará un límite inferior del valor de la función objetivo. En este ejemplo, quiero que el solucionador garantice un valor de función objetivo de al menos 7.

En el siguiente ejemplo de codificación, modelo y resuelvo el problema en R, usando FCLP.classicObjective de FuzzyLP:


#install.packages("FuzzyLP")
library(FuzzyLP)

# definir vectores y matrices que describen el problema en cuestión
c <- c(3,4)
A <- matrix(c(1,2,2,1,3,-1),nrow=3)
dir <- c("<=","<=","<=")
b <- c(1,1,1)
t <- c(4,5,3)

# resolver el problema
solution <- FCLP.classicObjective(objective = c,
                      A = A,
                      dir = dir,
                      b = b,
                      t = t,
                      z0=7,
                      maximum=TRUE)
## Bound reached, FCLP.fixedBeta with beta = 0.2413793 may obtain better results.
solution
##           beta       x1        x2 objective
## [1,] 0.2413793 1.827586 0.3793103         7

Los desarrolladores de este paquete recomiendan utilizar otra función, llamada FCLP.fixedBeta, después de haber ejecutado FCLP.classicObjective. FCLP.fixedBeta tomará un valor fijo para beta y ejecutará simplex básico para la optimización.

En el siguiente ejemplo, puede ver cómo uso FCLP.fixedBeta, usando el valor beta identificado por la ejecución de optimización FCLP.classicObjective:

# resuelve el problema usando FCLP.fixedBeta
solution <- FCLP.fixedBeta(objective = c,
                           A = A,
                           dir = dir, 
                           b = b, 
                           t = t,
                           beta = 0.24, 
                           maximum=TRUE)
## [1] "Solution is optimal."
solution
##      beta   x1   x2 objective
## [1,] 0.24 1.83 0.38      7.01

Una ejecución de referencia con beta = 0 devuelve un valor de función objetivo óptimo de 8,75. Eso significa que para beta = 0.24, el valor de la función objetivo no se maximiza. Esto se debe a que FCLP.classicObjective garantiza un cierto límite inferior y maximiza la beta. No optimiza la beta para determinar un valor máximo de función objetivo.

Hay otros enfoques para realizar la optimización de un problema como el que nos ocupa. En algunas de mis siguientes publicaciones proporcionaré algunos ejemplos adicionales.

You May Also Like

Leave a Reply

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.