[R-es] Paquetes en R de programación lineal con muchas restricciones

Sergio Castro castro.rodriguez.sergio en gmail.com
Lun Abr 27 08:37:48 CEST 2015


Buenos días Alex,

Yo tambien estoy generando problemas de programación lineal y utilizo
los paquetes lpSolve y lpSolveAPI. Utilizo un número considerable de
datos y no estoy teniendo problemas. Te paso los enlaces a estos dos
paquetes:

http://cran.r-project.org/web/packages/lpSolve/lpSolve.pdf

http://cran.r-project.org/web/packages/lpSolveAPI/lpSolveAPI.pdf

Espero que te sirva.

Un saludo.

El día 25 de abril de 2015, 13:22, Alex J. Zambrano
<alexjzc en gmail.com> escribió:
> Hola a tod en s.
>
> Quisiera saber si conocen algún paquete además de boot que permita realizar
> programación lineal con muchas restricciones. A continuación escribo el
> codigo que estoy utilizando
>
> rm(list = ls())
>
> #Función para generar las variables independientes
> gen<-function(n,a=0,b=1){
>   X<-matrix(0,ncol=3,nrow=n)
>   #Muestras distribuidas entre -1 y 1 cuyo radio sea menor que 1
>   for(i in 1:n){
>     m<-0
>     while(m==0){
>       U<-runif(3,min=-1,max=1)
>       R<-t(U)%*%U
>       if(R<=1){
>         X[i,]<-U/sqrt(R)
>         m<-1
>       }
>     }
>   }
>   #Transformación de muestras según la matriz correlación
>   V<-diag(rep(sqrt(1/3),3))
>   C=matrix(c(1,0.03,-0.06,0.03,1,-0.28,-0.06,-0.28,1),ncol=3)#Matriz de
> correlación
>   S<-V%*%C%*%V
>   B<-chol(solve(S))
>   Z<-X%*%t(solve(B))
>   #Transformación de muestras para rango 0 y 1
>   Y<-(Z-min(Z))/(max(Z)-min(Z))
>   #Transformación de muestras entre a y b
>   Y<-(b-a)*Y+a
>   return(Y)
> }
>
> set.seed(25042015)
>
> #Prueba
> X<-gen(10000,a=-10,b=10)
> summary(X)
> cor(X)
>
> #Caso laplace
> library(VGAM)#Se debe cargar está librería independiente del boot (genera
> problemas)
> X<-gen(20,-10,10)
> e<-rlaplace(20,location=0,scale=1)
> Yest<-16+4*X[,1]+X[,2]+0.25*X[,3] # Valores a estimar 4, 1, 0.25
> Y<-Yest+e
>
> n<-length(Y)
> p<-dim(X)[2]
> r<-n*(n-1)/2
> H<-cbind(rep(1,n-1),-diag(1,n-1))
> for(i in 1:(n-2)){
>   h<-cbind(matrix(0,n-1-i,i),rep(1,n-1-i),-diag(1,n-1-i))
>   H<-rbind(H,h)
> }
>
> library(boot) # Librería de programación
>
> #MINSADBED
> a<-c(rep(0,p),rep(0,n),rep(1,r),rep(1,r))
> A31<-cbind(X,diag(1,n),matrix(0,n,r),matrix(0,n,r))
> A32<-cbind(matrix(0,r,p),H,-diag(r),diag(r))
> A3<-rbind(A31,A32)
> b3<-c(Y,matrix(0,r,1))
>
>
> simplex(a,A3=A3,b3=b3)
>
>
> #MINSADBAD
> a<-c(rep(0,p),rep(0,n),rep(1,r),rep(1,r))
> A31<-cbind(X,diag(1,n),matrix(0,n,r),matrix(0,n,r))
> A32<-cbind(-X,diag(1,n),matrix(0,n,r),matrix(0,n,r))
> A33<-cbind(matrix(0,r,p),H,diag(r),-diag(r))
> A3<-rbind(A31,A32,A33)
> b3<-c(Y,-Y,matrix(0,r,1))
>
> simplex(a,A3=A3,b3=b3)
>
>
> La idea es estimar unos parámetros de un modelo de regresión, utilizando
> métodos de programación. La matriz X tiene cierta estructura de
> correlación, y los errores en el modelo son no normales.
>
> Al realizar la solución por MINSADBED con la función simplex del paquete
> boot, me arroja las estimaciones de Beta_1, Beta_2 y Beta_3 se encuentran
> en la solución optima de los primeros tres valores. Pero noten que se tiene
> una matriz de restricciones demasiado grande.
>
> Al realizar la solución por MINSADBAD las estimaciones de Beta_1, Beta_2 y
> Beta_3 no se logran obtener debido a que es una solución no factible.
>
> Al realizar está misma en paquete de programación winqsb la solución si
> logra obtener, pero construir esa matriz de restricciones es demasiado
> engorroso y más aún si de desea realizar un proceso de simulación.
>
> Agradezco me puedan ayudar.
>
> Saludos.
>
> --
> Alex Johann Zambrano Carbonell
> http://experienceinstatistics.blogspot.com/
>
>         [[alternative HTML version deleted]]
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es



Más información sobre la lista de distribución R-help-es