2016-07-13 3 views
0

私は線形計画問題のシミュレーションをしようとしています。モデルにはobj関数といくつかの制約があります。この場合、正規分布からランダムに引き出された2つの値を導入しています。ループトラフRのアイテムのセット

次にforループを使用して最適化モデルを10.000回シミュレートします。私はそれが悪いことを知っているRの練習forループを使用するが、速度はこの場合私の懸念ではありません。

#List of 10000 random, normally distributed observations: 
Demand = rnorm(10000, mean=5, sd=2.5) 
Demand 

Performance = rnorm(10000, mean=100, sd=6) 
Performance 

Optimas = NULL 

#combined_list = c(Demand, Performance) 

for (i in Performance){ 
    op <- OP(objective = c(2.5, 4, i),    #Performance value[i]: works fine 
      L_constraint(L = matrix(c(1, 0, 0,  #LHS 
             0, 1, 0,  
             0, 0, 1),  
             ncol=3, nrow = 3, 
             byrow = TRUE), 
          dir = c("<=", "<=", "<="), 
          rhs = c(50, 70, Demand)), #Demand value[i]: should go here 
       maximum = TRUE, 
       types = c("B", "I", "I")) 

    Optima <- ROI_solve(op, solver = "glpk") #solve 
    print(Optima) 
    print(i) 
    Optimas = rbind(Optimas, Optima) 
} 


Optimas <- as.data.frame(Optimas) 
Optimas$objval <- as.numeric(Optimas$objval) 
hist(Optimas$objval) 

上で見たように、私のループは、同じ時間のように、私はモデルに入れなければ需要ベクトルの行(I)の需要値が欲しいトラフ一つの変数(パフォーマンスを)、行くんパフォーマンス・ベクトルのrow(i)のパフォーマンス値。

全体的な目的は、LPモデルの10.000シミュレーションを持つことです。パフォーマンス値もデマンド値も1回だけ発生します(私が既に持っているループ以外の別のループが、 2つのリスト)。

ご協力いただければ幸いです。

答えて

1

PerformanceDemandベクトルには、正確に同じ数の要素が含まれています。結果的に、単にベクトルインデックスをループし、それぞれのインデックス値を使用して関連する要素を抽出することができます。

OP機能で使用している最適化パッケージがわからないため、サンプルコードを実行できません。次のように例として、私は、入力としての性能と需要値をとる簡単なdummyFunctionを定義します:

dummyFunction <- function(perf, dem){ return (perf+dem)} 

をあなたの特定のユースケースでは、dummyFunctionは、最適化ロジックが含まれます。次に、以下のようにあなたはベクトル指数を反復することにより、必要な解を得ることができます。

Optimas = vector(mode="numeric", length=length(Performance)) 
for(idx in 1:length(Performance)){ 
    Optimas[idx] <- dummyFunction(Performance[idx], Demand[idx]) 
} 

代わりに、あなただけのforループ内であなたの最適化ロジックを配置することにより、関数定義を回避することができます。場合は、

Optimas <- dummyFunction(Performance, Demand) 

最後に:この特定の例では、あなたもちょうど次の操作を行うことができることを

Optimas <- sapply(1:length(Performance), function(idx) dummyFunction(Performance[idx], Demand[idx])) 

注:より多くの「ソリューションのようなR」については はsapply/lapply型の関数の使用を検討しますパフォーマンスが問題になる場合は、foreachdoparallelパッケージを使用して複数のコアで同時に最適化を実行することを検討してください。

library(doParallel) 
library(foreach) 
nrCores <- detectCores() 
cl <- makeCluster(nrCores); registerDoParallel(cl) 
clusterExport(cl,c("Demand", "Performance", "dummyFunction"), envir=environment()) 
Optimas <- foreach(idx=1:length(Performance), .combine="rbind") %dopar%{ 
    dummyFunction(Performance[idx], Demand[idx]) 
} 
stopCluster(cl) 
+0

回答ありがとう:-)最適化のためのROIパッケージを使用しました – MikeR

0

mapply()アプローチを考えてください。対応する要素を渡す複数のリスト/ベクトルを反復するapply関数です。最初に関数内のすべての演算をラップし、ベクトルの2つの引数を渡してmapply()を呼び出します。最後にlapply()を使用して、do.call(rbind...)で行バインドされた長いデータフレームのリストに転記してください。

Performance = rnorm(10000, mean=100, sd=6) 
Demand = rnorm(10000, mean=5, sd=2.5) 

optimizefct <- function(p, d){ 
    op <- OP(objective = c(2.5, 4, p),    # Performance 
      L_constraint(L = matrix(c(1, 0, 0,  # LHS 
            0, 1, 0,  
            0, 0, 1),  
            ncol=3, nrow = 3, 
            byrow = TRUE), 
         dir = c("<=", "<=", "<="), 
         rhs = c(50, 70, d)),  # Demand 
      maximum = TRUE, 
      types = c("B", "I", "I")) 

    Optima <- ROI_solve(op, solver = "glpk") #solve 
    print(Optima) 
    print(i) 

    return(Optima) 
} 

# WIDE FORMAT 
dfList <- mapply(optimizefct, Performance, Demand) 

# LONG FORMAT 
dfList <- lapply(1:10000, function(i) data.frame(dfList[,i])) 

# BIND TO FINAL DF 
Optimas <- do.call(rbind, dfList) 
Optimas$objval <- as.numeric(Optimas$objval) 
関連する問題