以下のコードの何が問題なのか、専門家に尋ねたいと思います。
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コアを使用すると問題が発生し、両方のバージョンで上記のコードブロックを使用しました