NMinimize Strange Results

*To*: mathgroup at smc.vnet.net*Subject*: [mg55502] NMinimize Strange Results*From*: "Marcelo Mayall" <mmayall at bol.com.br>*Date*: Sat, 26 Mar 2005 02:39:40 -0500 (EST)*Sender*: owner-wri-mathgroup at wolfram.com

NMinimize Strange Results: It's always interesting to reduce the amount of times that a certain function needs to be executed along an optimization process. However, after doing some optimization tests, I observed that small changes in the input parameters syntax of the NMinimize function took to a substantial increase of the processing time and until then, I still didn't understand perfectly what is happening. My impression is that in some occasions although defining the option "PostProcess" as False, internally the function NMinimize continues doing local optimizations ("PostProcess" -> True). And in some cases with restrictions, the impression that I had is that the function NMinimize executes 2 times the objective function to find the value of the penalty ("PenaltyFunction"), reducing so the performance of the code. Below, I put some simple cases that exemplify such situations. Does anybody have any idea of what is going on? ___________________________________________________ The function f[x] below is defined in such a way that the counter "i" counts how many times f[x] was executed. And the counter "j" counts how many times the NMinimize EvaluationMonitor indicates that it executed the function f[x]. If we consider the simple case of minimization by a genetic algorithm without pos-processing: in[1]:= f[x_?NumericQ]:=(i++;x^2) in[2]:= i=0;j=0; NMinimize[ f[x] , x , Method->{"DifferentialEvolution","PostProcess"->False},EvaluationMonitor:>j++]; Print[i, " ", j]; out[2]:= 511 511 Correctly it's observed that, as for the counter "i" as for the counter "j", the function f[x] was called 511 times. However, introducing a simple restriction a strange result is verified: in[3]:= i=0;j=0; NMinimize[{ f[x] , x > -1000 }, x , Method->{"DifferentialEvolution","PostProcess"->False},EvaluationMonitor:>j++] Print[i, " ", j]; out[3]:= 1752 511 Similarly, introducing "f[{x}]": in[4]:= Remove[f] f[{x_?NumericQ}] := (i++; x^2) i=0;j=0; NMinimize[ f[{x}] , x , Method->{"DifferentialEvolution","PostProcess"->False},EvaluationMonitor:>j++]; Print[i, " ", j]; out[4]:= 1022 511 In other words, while the function NMinimize indicates that f[x] was executed only 511 times the counter "i" indicates that the function f[x] was executed a lot more (1752 and 1022 times). Any Ideas?