RESOLUCIÓN DE PROBLEMAS DE PROGRAMACIÓN LINEAL, DUALIDAD Y ANÁLISIS DE SENSIBILIDAD CON LA FUNCIÓN lp DEL PAQUETE DE R lpSolve EJEMPLO 1: PROBLEMA CON SOLUCIÓN ÚNICA El siguiente problema tiene solución única x1 = 1, x2 = 1, con valor de la función objetivo 13 Min z = 5x1 + 8x2 sujeto a x1 + x2 ≥ 2 x1 + 2x2 ≥ 3 x1 , x 2 ≥ 0 Resolución con R R> library(lpSolve) R> Ejemplo1 <- lp(objective.in=c(5,8), const.mat=matrix(c(1,1,1,2),nrow=2, byrow=TRUE), + const.rhs=c(2,3), const.dir=c(“>=”,“>=”)) R> Ejemplo1 Success: the objective function is 13 R> Ejemplo1$solution [1] 1 1 EJEMPLO 2: PROBLEMA INFACTIBLE El siguiente problema tiene solución única x1 = 1, x2 = 1, con valor de la función objetivo 13 Min z = 5x1 + 8x2 sujeto a x1 + x2 ≥ 2 x1 + 2x2 ≤ 1 x1 , x 2 ≥ 0 Resolución con R R> library(lpSolve) R> Ejemplo2 <- lp(objective.in=c(5,8), const.mat=matrix(c(1,1,1,2),nrow=2, byrow=TRUE), + const.rhs=c(2,1), const.dir=c(“>=”,“<=”)) R> Ejemplo2 Error: no feasible solution found R> Ejemplo2$status [1] 2 1 EJEMPLO 3: PROBLEMA CON ÓPTIMOS ALTERNATIVOS Esta función no identifica cuando un problema tiene óptimos alternativos. Por ejemplo, para Min z = 4x1 + 8x2 sujeto a x1 + x2 ≥ 2 x1 + 2x2 ≥ 3 x1 , x 2 ≥ 0 son soluciones (1,1) y (3,0) y, por tanto, cualquier punto del segmento que los une. Sin embargo, al aplicar la función anterior a este problema, resulta: R> library(lpSolve) R> Ejemplo3 <- lp(objective.in=c(4,8), const.mat=matrix(c(1,1,1,2),nrow=2, byrow=TRUE), + const.rhs=c(2,3), const.dir=c(“>=”,“>=”)) R> Ejemplo3 Success: the objective function is 12 R> Ejemplo3$solution [1] 3 0 EJEMPLO 4: PROBLEMA CON SOLUCIÓN NO ACOTADA Cuando el problema tiene solución no acotada, da error. Por ejemplo para Máx z = 5x1 + 8x2 sujeto a x1 + x2 ≥ 2 x1 + 2x2 ≥ 3 x1 , x 2 ≥ 0 Resolución con R R> library(lpSolve) R> Ejemplo4 <- lp(direction=”max”, objective.in=c(5,8), + const.mat=matrix(c(1,1,1,2),nrow=2, byrow=TRUE), + const.rhs=c(2,3), const.dir=c(“>=”,“>=”)) R> Ejemplo4 Error: status 3 EJEMPLO 5: CASO DE VARIABLES NO NECESARIAMENTE NO NEGATIVAS Esta función no contempla el caso en que haya variables no necesariamente no negativas. La forma de abordar este problema con la función lp() es la habitual transformación previa. Min z = x1 + 10x2 sujeto a 2 x1 + x2 ≥ 2 x1 − x2 ≤ 3 x1 ≥ 0 Hacemos x2 = x3 − x4 , con x3 , x4 ≥ 0 y el problema se transforma en Min z = x1 + 10x3 − 10x4 sujeto a x1 + x3 − x4 ≥ 2 x1 − x3 + x4 ≤ 3 x1 , x 3 , x 4 ≥ 0 Resolución con R R> library(lpSolve) R> Ejemplo5 <- lp(objective.in=c(1,10,-10), + const.mat=matrix(c(1,1,-1,1,-1,1,nrow=2, byrow=TRUE), + const.rhs=c(2,3), const.dir=c(“>=”,“<=”)) R> Ejemplo5 Success: the objective function is -2.5 R> Ejemplo5$solution [1] 2.5 0.0 0.5 Y la solución al problema original es x1 = 2,5 y x2 = 0 − 0,5 = −0,5 EJEMPLO 6: DUALIDAD Y ANÁLISIS DE SENSIBILIDAD Las siguientes tablas del simplex son la tabla inicial y óptima de un problema en forma estándar de maximizar. cB 0 0 cB 15 30 TABLA INICIAL cj 15 30 20 0 0 V B x1 x2 x3 s1 s2 xB s1 1 0 1 1 0 4 s2 0,5 2 1 0 1 3 TABLA ÓPTIMA 15 30 20 0 0 cj VB x1 x2 x3 s1 s2 xB x1 1 0 1 1 0 4 0 1 0,25 −0,25 0,5 0,5 x2 zj − cj 0 0 2,5 7,5 15 Z = 75 3 a) ¿Cuál es el precio sombra asociado a la segunda restricción? ¿Qué significa? b) Determinar el rango de variación de cada uno de los coeficientes de la función objetivo para que la solución siga siendo óptima. c) Determinar el rango de variación de cada uno de los recursos para que la solución siga siendo óptima. Resolución con R R> library(lpSolve) R> Obj.Ej6<-c(15,30,20) R> Mat.Ej6<-matrix(c(1,0,1,0.5,2,1),nrow=2,byrow=TRUE) R> Dir.Ej6<-c(“<=”,“<=”) R> Rec.Ej6<-c(4,3) R> Sol.Ej6<-lp(direction=”max”,objective.in=Obj.Ej6,const.mat=Mat.Ej6,const.dir=Dir.Ej6, + const.rhs=Rec.Ej6,compute.sens=1) R> Sol.Ej6$solution [1] 4.0 0.5 0.0 R> Sol.Ej6$sens.coef.from [1] 1.25e+01 2.00e+01 -1.00e+30 R> Sol.Ej6$sens.coef.to [1] 1.00e+30 6.00e+01 2.25e+01 R> Sol.Ej6$duals [1] 7.5 15.0 0.0 0.0 -2.5 R> Sol.Ej6$duals.from [1] -8.881784e-16 2.000000e+00 -1.000000e+30 -1.000000e+30 -1.000000e+30 R> Sol.Ej6$duals.to [1] 6e+00 1e+30 1e+30 1e+30 2e+00 Las respuestas son: a) El precio sombra asociado a la segunda restricción es 15 (elemento zj − cj correspondiente a la segunda variable de holgura en la tabla óptima y se corresponde con el segundo elemento del resultado de solicitar Sol.Ej6$duals en R). Significa el incremento que se produce en el valor óptimo de la función objetivo cuando el segundo recurso se incrementa en una unidad. O bien, la contribución por unidad del segundo recurso a la variación del valor óptimo del objetivo. b) Considerando un valor c1 arbitrario para que la tabla siga siendo óptima (nuevos zj −cj ≥ 0) se debe cumplir c1 +30×0,25−20 ≥ 0 y c1 −0,25×30 ≥ 0, es decir, c1 ≥ 12,5. Dicho resultado se deduce a partir de los primeros elementos de Sol.Ej6$sens.coef.from y Sol.Ej6$sens.coef.to, 1.25e+01 (12.5) y 1.00e+30(equivalente a +∞), respectivamente. Considerando un valor c2 arbitrario para que la tabla siga siendo óptima (nuevos zj − cj ≥ 0) se debe cumplir 15 + 0,25c2 − 20 ≥ 0, 15 − 0,25c2 ≥ 0 y 0,5c2 ≥ 0, es decir, 20 ≤ c2 ≤ 60. Dicho resultado se deduce a partir de los segundos elementos de 4 Sol.Ej6$sens.coef.from y Sol.Ej6$sens.coef.to, 2.00e+01 (20) y 6.00e+01(60), respectivamente. c) Obtenemos el nuevo valor de x bB en cada uno de los casos e imponemos factibilidad Recurso 1 µ x bB = 1 0 −0,25 0,5 ¶µ bb1 3 à ¶ = bb1 −0,25bb1 + 1,5 ! Se deduce que se debe cumplir bb1 ≥ 0 y −0,25bb1 + 1,5 ≥ 0, es decir, 0 ≤ bb1 ≤ 6, en cuyo caso la solución x1 = bb1 , x2 = −0,25bb1 + 1,5 sigue siendo óptima con Z ∗ = 15 × bb1 + 30(−0,25bb1 + 1,5). El resultado 0 ≤ bb1 ≤ 6 se deduce de los primeros elementos de Sol.Ej6$duals.from y Sol.Ej6$duals.to, -8.881784e-16 (0) y 6e+00, respectivamente. Recurso 2 µ x bB = 1 0 −0,25 0,5 ¶µ 4 bb2 ¶ µ = 4 b 0,5b2 − 1 ¶ Se deduce que se debe cumplir 0,5bb2 − 1 ≥ 0, es decir, bb2 ≥ 2. Ası́, si bb2 ∈ (2, +∞), la solución x1 = 4, x2 = 0,5bb2 − 1 sigue siendo óptima con Z ∗ = 15 × 4 + 30(0,5bb2 − 1). El resultado bb2 ≥ 2 se deduce de los segundos elementos de Sol.Ej6$duals.from y Sol.Ej6$duals.to, 2.000000e+00 (2) y 1e+30 (equivalente a +∞), respectivamente. 5