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 的优化参数,第二个循环将使用优化的参数打印出模拟值。上面的代码是我对使其并行化以加快处理速度的看法,第一个 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 时出现问题,两个版本我都使用了上面的代码块

4

0 回答 0