DEOPtim堆栈不平衡问题

时间:2014-02-14 09:07:53

标签: r optimization

运行以下优化任务(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(即达到无法获得的值),那么问题就会消失,但由于性能问题,我宁愿不这样做。

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

2 个答案:

答案 0 :(得分:6)

这是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);

 }

答案 1 :(得分:0)

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

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

当我将目标函数返回的变量的符号从return(-var)反转为return(var)时发生了这种情况。绕过它的方法只是改变代码中的符号。