def test_rosen_ask_tell(): popsize = 31 dim = 5 testfun = Rosen(dim) sdevs = [1.0] * dim max_eval = 100000 limit = 0.00001 for _ in range(5): wrapper = Wrapper(testfun.fun, dim) es = cmaes.Cmaes(testfun.bounds, popsize=popsize, input_sigma=sdevs) iters = max_eval // popsize for j in range(iters): xs = es.ask() ys = [wrapper.eval(x) for x in xs] stop = es.tell(ys) if stop != 0: break ret = OptimizeResult(x=es.best_x, fun=es.best_value, nfev=wrapper.get_count(), nit=es.iterations, status=es.stop) if limit > ret.fun: break assert (limit > ret.fun) # optimization target not reached assert (max_eval + popsize >= ret.nfev) # too much function calls assert (max_eval / popsize + 2 > ret.nit) # too much iterations
def test_ask_tell(problem, num): best = math.inf t0 = time.perf_counter(); for i in range(num): es = cmaes.Cmaes(bounds = problem.bounds) iters = 3000 for _ in range(iters): xs = es.ask() ys = [problem.fun(x) for x in xs] stop = es.tell(ys) if stop != 0: break best = min(es.best_value, best) print("{0}: time = {1:.1f} best = {2:.1f} f(xmin) = {3:.1f}" .format(i+1, dtime(t0), best, es.best_value))
def minimize(self, fun, bounds, guess=None, sdevs=0.3, rg=Generator(MT19937()), store=None): es = cmaes.Cmaes(bounds, popsize=self.popsize, input_sigma=sdevs, rg=rg) iters = self.max_eval_num(store) // self.popsize evals = 0 for j in range(iters): xs = es.ask() ys = [fun(x) for x in xs] evals += len(xs) stop = es.tell(ys) if stop != 0: break return es.best_x, es.best_value, evals