DEoptim似乎在R中冻结

时间:2016-08-06 11:39:18

标签: c r freeze differential-evolution

我遇到DEoptim似乎冻结的情况。我无法弄清楚为什么,并希望有更多C经验的人可以看看它。

创建可重现的示例相当困难,因此我只是在DEOPtim冻结之前保存整个环境50次迭代。可以找到以下文件'Envir650.Rdata' here

rm(list = ls())
library(DstarM)
library(DEoptim)

load('Envir650.Rdata') # load the environment

# Adjust one function
argsList$fun.density = DstarM::Voss.density 

argsList$control$trace = 1 # show intermediate output
argsList$control$parallelType = 0 # don't use parallel processing
.Random.seed = randomseed # set seed

out = do.call(DEoptim, argsList) # freezes at iteration 21 and crashes R.

非常感谢提前!

编辑:我希望问题现在可以重现。

1 个答案:

答案 0 :(得分:3)

问题在于rtdists包,源文件密度.c,功能集成。循环

for(x = a+0.5*step; x < b; x += step) {
    result += step * F->f(x, F->data);
}

变得无限,因为step太小了。它非常小,x+step==xx永远不会达到b。应更改integrate的代码,以使step永远不会小于EPSILON

--- orig/rtdists/src/density.c  2016-07-15 10:28:56.000000000 +0200
+++ mine/rtdists/src/density.c  2016-08-29 17:41:53.831078335 +0200
@@ -72 +72 @@
-   double step = width / N;
+   double step = fmax(width / N, EPSILON);

应用此更改后,您的示例将在迭代51结束,而不会循环或崩溃。我&#39;已经 notified rtdists作者;修复程序现在位于程序包的github version