2017-12-07 50 views
1

저는 R의 초보자입니다. 저는 R studio의 Cplex를 사용하여 선형 분석을 수행하여 모델을 풀고 있습니다. 제 모델의 제약 조건 중 하나는 X1 (i, j, t) < = D (i, j, t)입니다. 작은 치수 (16X16X6)의 중첩 for 루프를 사용하여이 작업을 수행 할 수 있습니다. 하지만 내 모델을 2500X2500X60처럼 더 큰 모델로 운영하고 싶습니다. 메모리를 저장하고 중첩 된 for 루프보다 빠르게 실행해야합니다. 나는 apply를 사용하는 것에 대해 생각했지만 어떻게 작동하게하는지 모른다. 어떤 도움이라도 대단히 감사하겠습니다!은 중첩 된 for 루프를 mapply로 대체합니다.

location <-16 
horizon <-6 
Amat <- NULL 
Xe_null <- array(0, dim = c(locations, locations, horizon)) 
Xl_null <- array(0, dim = c(locations, locations, horizon)) 
Xl  <- array(0, dim = c(locations, locations, horizon)) 
Xl <- Xl_null 
for (t in 1:horizon) { 
    for (j in 1:locations) { 
    for (i in 1:locations) { 
     Xl[i,j,t] <- 1 
     Amat <- rbind(Amat, c(as.vector(Xe_null), as.vector(Xl))) 
     Xl <- Xl_null 
} } } 
dim(Amat) # 1536 3072 

또 다른 제약 조건이 있습니다.

R  <- array(, dim=c(locations, horizon, horizon)) 
R_null <- array(, dim=c(locations, horizon, horizon)) 
R <- R_null 
Xe <- Xe_null 
Xl <- Xl_null 
# 
for (t in 1:(horizon-1)) { 
    for (tp in (t+1):horizon) { 
    for (j in 1:locations)  { 
     for (i in 1:locations)  { 
     if ((tp-t) ==Travel_time[i,j]) 
     { 
      Xe[i,j,t]=1 
      Xl[i,j,t]=1 
     } 
     } 
     R[j,tp,t] = 1 
     R[j,tp,t+1] = -1 
     Amat <- rbind(Amat, c(as.vector(Xe), as.vector(Xl),as.vector(R))) 
     } 
    } 
} 

나는이 작업을 수행하려고 :

Xl = function(ii,jj,tt){1} 
t =c(1:horizon) 
i =c(1:locations) 
j =c(1:locations) 
output_Xl = apply(expand.grid(i,j,t),1,function(x,y,h) Xl(x[1],x[2],x[3])) 
Xl_new <- array(output_Xl, dim = c(locations, locations, horizon)) 
Amat <- rbind(Amat, c(as.vector(Xe_null), as.vector(Xl_new))) 
dim(Amat) # 1 3072 
+0

'Xl_null'와'Xe_null' 같은 객체인가, 아니면 'Xe_null'는 원래 데이터입니다 (?"<<-" 참조)? – Llopis

+0

예, Xl_null 및 Xe_null은 0으로 비어 있습니다. – pkjli

답변

2

당신은

T <- horizon*locations*locations 
Bmat <- cbind(matrix(0, nrow=T, ncol=T), diag(1, nrow=T, ncol=T)) 
identical(Amat, Bmat) 
# TRUE 
2

과 같은 출력을 얻을 수 있습니다 나는 당신이 (동일한 출력을 제공하는 벡터화 기능을 확인하는 것입니다 필요 생각 ?Vectorize 참조). 아래의 코드는 귀하의 500 배입니다. 당신의 진짜 문제에서
는, 어쩌면 당신이 <<- 대신 <-으로 사용할 필요가

my_func <- function(a, b, c){ 
    Xl[a, b, c] <- 1 
    c(as.vector(Xe_null), as.vector(Xl)) 
} 

vectorized_my_func <- Vectorize(my_func, c("a", "b", "c")) 

arg_df <- expand.grid(1:locations, 1:locations, 1:horizon) 
res <- vectorized_my_func(arg_df[,1], arg_df[,2], arg_df[,3]) 

identical(Amat, t(res)) # TRUE 

# your code 
## user system elapsed 
## 77.538 18.293 97.056 

# my code 
## user system elapsed 
### 0.137 0.051 0.189 
+0

내 게시물을 편집하는 것에 대한 도움과 제안에 감사드립니다. 매우 도움이된다! 감사합니다 :) – pkjli

+0

안녕하세요, 나는 단지 후속 질문이 있습니다. <-2500, horizon <-60의 위치를 ​​전환 할 때 메모리가 부족합니다. 스파 스 매트릭스를 조사해야합니까? 아니면 더 좋은 제안이 있습니까? – pkjli