想请教高手,下面的代码可能有什么问题:
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 的优化参数,第二个循环将使用优化的参数打印出模拟值。上面的代码是我对使其并行化以加快处理速度的看法,第一个 for 循环一次接收与服务器上的内核一样多的 Varieties。
预期输出:
存储在“resultOptimization”列表中的优化参数
我得到什么:
resultOptimization[1] = V1
resultOptimization[2] = V1
resultOptimization[3] = V1
等等,什么时候应该
resultOptimization[1] = V1
resultOptimization[2] = V2
resultOptimization[3] = V3
问题是这样的:
当我按顺序运行这个循环时,它会产生正确的结果——每个品种的优化参数(使用 rgenoud),但是当我像上面的代码块中那样并行化它时,输出似乎只是一遍又一遍地重复的第一个品种;
这很奇怪,因为我 100% 确定在每次 genoud() 调用之前加载了正确的值,并且程序的顺序版本可以正常工作。有谁熟悉这个问题?
另外,当我说顺序时,我的意思是 1 core,当我使用 >1 core 时出现问题,两个版本我都使用了上面的代码块