2014-02-14 4 views
5

Wenn die Aufgabe (R v.3.0.2) folgende Optimierung läuftDEoptim Stapel Ungleichgewicht Probleme

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)     

ich Stapel Ungleichgewicht Warnungen

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

und unprotect() Fehler. Wenn VTR unter 0 gesetzt ist (d. H. Auf einen Wert, der nicht erhalten werden kann), verschwindet das Problem, aber ich möchte dies aufgrund von Leistungsproblemen lieber nicht tun.

Das Ergebnis wird trotz der Fehler zurückgegeben, aber ich fürchte, es könnte instabil/falsch sein. Irgendwelche Ideen, wie man das löst?

Antwort

6

Es ist ein Problem im C-Code, nicht etwas, das Sie beheben können. Aber es ist etwas, was ich beheben kann, und es ist seit Revision 116 auf R-Forge behoben. Hier ist der Patch:

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

} 
+0

Danke für die Behebung und das Löschen. – dratewka

0

ich verwende Revision 118 und ich hatte ein ähnliches Problem:

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

Das geschah, als ich das Vorzeichen der Variablen invertiert, dass die Zielfunktion zurückkehrt, return(-var)-return(var) . Der Weg dahin war nur, das Zeichen im Code vorher zu ändern.

+0

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag - du kannst deine eigenen Beiträge jederzeit kommentieren, und sobald du genügend [Reputation] (http://stackoverflow.com/help/whats-reputation) hast, wirst du das tun in der Lage sein [jeden Beitrag kommentieren] (http://stackoverflow.com/help/privileges/comment). - [Aus Bewertung] (/ review/low-quality-posts/10440963) – Trilarion

+1

@Trilarion "Der Weg dahin war nur, das Zeichen im Code vorher zu ändern." ist keine Antwort? –

+0

@JiriTousek Ist es die Antwort auf die Frage? – Trilarion