1

以下のコードの何が問題なのか、専門家に尋ねたいと思います。

resultOptimization <- foreach(i = 1:length(varietyNames) , .combine = rbind, .init = resultOptimization) %dopar% {
    variety <- varietyNames[i]


  subsetVarietyNames <<- subset(observedValues, Variety == variety)
  rowNumberOfObservedValues <<- nrow(subsetVarietyNames)

  inputTrait <<- subsetVarietyNames[,c("Site", "Latitude", "Longitude", "Altitude", "Flooding", 
                                       "Transplanting", "DDTransplantingShock", "Z", "LAIMax", 
                                       "POP", "PLAini", "LRGRMax", "SowingDate")]



  resultOptimTrait <- genoud(fn = minimizationFunction, nvars = numberOfParametersToBeEstimated, max = FALSE,
                             Domains = optimizedParametersBounds, pop.size = 2, max.generations = 2, 
                             wait.generations = 2, hard.generation.limit = TRUE, MemoryMatrix = TRUE, 
                             starting.values = NULL, default.domains = 10, solution.tolerance = 0.001, 
                             gr = NULL, boundary.enforcement = 0, lexical = FALSE, gradient.check = TRUE, 
                             BFGS = FALSE, data.type.int = FALSE, hessian = TRUE, unif.seed = 812821, 
                             int.seed = 53058, extra_arg = fMeteo)


  estimatedParameters <- resultOptimTrait$par
  sumOfErrors <- resultOptimTrait$value

  #In case of abrupt system failure, save preliminary results 
  capture.output(c(variety, estimatedParameters, sumOfErrors),file = "PRE_optim_values.txt",append = (if(i==1) {FALSE} else{ TRUE}))

  resultLine <- c(variety, estimatedParameters, sumOfErrors)

}

私がやっていること:

いくつかの種類の植物のパラメーターを最適化しようとしています.最初のループは品種1〜Nの最適化されたパラメーターを取得し、2番目のループは最適化されたパラメーターを使用してシミュレートされた値を出力します. 上記のコードは、処理を高速化するために並列化するという私の考えです。最初の for ループは、サーバー上のコアと同じ数の種類を一度に取り込みます。

期待される出力:

リスト「resultOptimization」に格納された最適化されたパラメータ

私が得るもの:

resultOptimization[1] = V1
resultOptimization[2] = V1
resultOptimization[3] = V1

など、いつすべきか

resultOptimization[1] = V1
resultOptimization[2] = V2
resultOptimization[3] = V3

問題はこれです:

このループを順番に実行すると、正しい結果が生成されます-各種類の最適化されたパラメーター (rgenoud を使用) ですが、上記のコード ブロックのように並列化すると、出力は最初の種類だけが何度も繰り返されるようです。 ;

各 genoud() 呼び出しの前に正しい値がロードされ、プログラムの順次バージョンが正しく動作することを 100% 確信しているため、これは奇妙です。この問題に詳しい人はいますか?

さらに、シーケンシャルと言ったときは1コアを意味し、>1コアを使用すると問題が発生し、両方のバージョンで上記のコードブロックを使用しました

4

0 に答える 0