2017-12-07 58 views
1

とループの入れ子になったを交換してください。私のモデルの制約の1つはXl(i、j、t)< = D(i、j、t)です。私は小さな次元(16X16X6)で入れ子のforループでこれを行うことができます。しかし、私は2500X2500X60のようにもっと大きなモデルを私のモデルで使いたいと思っています。私はメモリを節約し、ネストされたforループより速く実行する必要があります。私は適用を使用することについて考えたが、私はそれを動作させる方法を知らない。どんな助けでも大歓迎です!は私がモデルを解決するためにRスタジオのCPLEXを使用して、線形計画に取り組んでいますR.で初心者です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はゼロで空です。 – 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、地平線< - 60を切り替えると、私はメモリが足りなくなりました。スパース行列を調べるべきですか?それとももっと良い提案がありますか? – pkjli