【问题标题】:DEoptim stack imbalance problemsDEoptim 堆栈不平衡问题
【发布时间】:2014-03-13 13:25:27
【问题描述】:

运行以下优化任务时(R v.3.0.2)

library(DEoptim)

x <- seq(-6,6,length=100); y <- tanh(x)
goal <- function(par) return(1-abs(cor(x*par,y,method='spearman')))

ctrl <- DEoptim::DEoptim.control(VTR=0, trace=FALSE)

res <- DEoptim::DEoptim(goal,lower=-1,upper=1, ctrl)                  

我收到堆栈不平衡警告

Warning: stack imbalance in '<-', 14 then 13
Warning: stack imbalance in 'withVisible', 7 then 6

unprotect() 错误。如果VTR 设置为低于 0(即无法获得的值),那么问题就会消失,但由于性能问题,我宁愿不这样做。

尽管出现错误,结果仍会返回,但我担心它可能不稳定/不正确。任何想法如何解决这个问题?

【问题讨论】:

    标签: r optimization


    【解决方案1】:

    这是 C 代码中的问题,不是您可以修复的。但这是我可以解决的问题,并且在 R-Forge 上的修订版 116 中已修复。这是补丁:

    Index: DEoptim/src/de4_0.c
    ===================================================================
    --- DEoptim/src/de4_0.c (revision 115)
    +++ DEoptim/src/de4_0.c (working copy)
    @@ -423,7 +423,6 @@
    
         /*------Trial mutation now in t_tmpP-----------------*/
         /* evaluate mutated population */
    -    if(i_iter > 1) UNPROTECT(1);  // previous iteration's sexp_t_tmpC
         PROTECT(sexp_map_pop = popEvaluate(l_nfeval, sexp_t_tmpP,  fnMap, rho, 0));
         memmove(REAL(sexp_t_tmpP), REAL(sexp_map_pop), i_NP * i_D * sizeof(double));
         UNPROTECT(1);  // sexp_map_pop
    @@ -458,6 +457,7 @@
    
           }
         } /* End mutation loop through ensemble */
    +    UNPROTECT(1);  // sexp_t_tmpC
    
         if (d_c > 0) { /* calculate new meanCR and meanF */
           meanCR = (1-d_c)*meanCR + d_c*goodCR;
    @@ -555,7 +555,7 @@
       *gt_bestC = t_bestC;
    
       PutRNGstate();
    -  UNPROTECT(P+1); // +1 is for last iteration's sexp_t_tmpC
    +  UNPROTECT(P);
    
     }
    

    【讨论】:

      【解决方案2】:

      我使用的是第 118 版,但遇到了类似的问题:

      Warning: stack imbalance in '.Call', 13 then 12
      Warning: stack imbalance in '<-', 11 then 10
      

      当我将目标函数返回的变量的符号从return(-var) 反转为return(var) 时,就会发生这种情况。解决方法就是在之前的代码中更改符号。

      【讨论】:

      • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。 - From Review
      • @Trilarion “解决方法就是更改之前代码中的符号。”不是答案?
      • @JiriTousek 这是问题的答案吗?
      • @Trilarion 我不是 R 专家,所以我不知道这是否是一个正确的答案,但在我看来它是 an 的答案。不过我可能是错的。
      • 如果您不确定,请将其作为评论发布,因为它可以让用户验证,然后您可以添加作为答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      相关资源
      最近更新 更多