From a3250ddc75375348c4c9a9490836bb686305ae16 Mon Sep 17 00:00:00 2001 From: stevenj Date: Wed, 18 Nov 2009 01:18:57 -0500 Subject: [PATCH] bug fix in ISRES; it seems to work, albeit worse than CRS2 darcs-hash:20091118061857-c8de0-60c4151d03f119b56a96db1f830c23c06602cee3.gz --- isres/isres.c | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/isres/isres.c b/isres/isres.c index e6bf7aa..b9a052d 100644 --- a/isres/isres.c +++ b/isres/isres.c @@ -212,29 +212,31 @@ nlopt_result isres_minimize(int n, nlopt_func f, void *f_data, } } memcpy(x0, xs, n * sizeof(double)); - for (k = 0; k+1 < survivors; ++k) { /* differential variation */ - int rk = irank[k]; - for (j = 0; j < n; ++j) - xs[rk*n+j] += GAMMA * (x0[j] - xs[(k+1)*n+j]); - } - /* standard mutation for last survivor and for any - survivor components that are now outside the bounds */ - for (k = 0; k < survivors; ++k) { + for (k = 0; k < survivors; ++k) { /* differential variation */ double taup_rand = taup * nlopt_nrand(0,1); int rk = irank[k]; - for (j = 0; j < n; ++j) if (k == survivors - 1 - || xs[rk*n+j] < lb[j] - || xs[rk*n+j] > ub[j]) { - double sigmamax = (ub[j] - lb[j]) / sqrt(n); + for (j = 0; j < n; ++j) { double xi = xs[rk*n+j]; - double sigi = sigmas[rk*n+j]; - sigmas[rk*n+j] *= exp(taup_rand + tau*nlopt_nrand(0,1)); - if (sigmas[rk*n+j] > sigmamax) - sigmas[rk*n+j] = sigmamax; - do { - xs[rk*n+j] = xi + sigmas[rk*n+j] * nlopt_nrand(0,1); - } while (xs[rk*n+j] < lb[j] || xs[rk*n+j] > ub[j]); - sigmas[rk*n+j] = sigi + ALPHA * (sigmas[rk*n+j] - sigi); + if (k+1 < survivors) + xs[rk*n+j] += GAMMA * (x0[j] - xs[(k+1)*n+j]); + if (k+1 == survivors + || xs[rk*n+j] < lb[j] || xs[rk*n+j] > ub[j]) { + /* standard mutation for last survivor and + for any survivor components that are now + outside the bounds */ + double sigmamax = (ub[j] - lb[j]) / sqrt(n); + double sigi = sigmas[rk*n+j]; + sigmas[rk*n+j] *= exp(taup_rand + + tau*nlopt_nrand(0,1)); + if (sigmas[rk*n+j] > sigmamax) + sigmas[rk*n+j] = sigmamax; + do { + xs[rk*n+j] = xi + + sigmas[rk*n+j] * nlopt_nrand(0,1); + } while (xs[rk*n+j] < lb[j] || xs[rk*n+j] > ub[j]); + sigmas[rk*n+j] = sigi + + ALPHA * (sigmas[rk*n+j] - sigi); + } } } } -- 2.30.2