def test_sumt1(): def costfunc(x): x1 = x[0] x2 = x[1] return x1**4 - 2.*x1**2*x2 + x1**2 + x1*x2**2 - 2.*x1 + 4. constraints_string = """ x1**2 + x2**2 - 2. = 0. 0.25*x1**2 + 0.75*x2**2 - 1. <= 0. """ ndim = 2 x0 = [3., 2.] npop = 25 # print("constraints equations:%s" % (constraints_string.rstrip(),)) from mystic.solvers import DifferentialEvolutionSolver from mystic.solvers import NelderMeadSimplexSolver from mystic.termination import VTR #solver = DifferentialEvolutionSolver(ndim, npop) solver = NelderMeadSimplexSolver(ndim) solver.SetInitialPoints(x0) term = VTR() #FIXME: sumt, issolution no longer take constraints strings end_solver = sumt(constraints_string, ndim, costfunc, solver,\ term, disp=True) soln = end_solver.Solution() assert issolution(constraints_string, soln)
def run(self): print('Start local optimization...') maxf = self.request_data['optimization']['parameters']['maxf'] xtol = self.request_data['optimization']['parameters']['xtol'] ftol = self.request_data['optimization']['parameters']['ftol'] solver = NelderMeadSimplexSolver(len(self.initial_values)) solver.SetInitialPoints(self.initial_values) solver.SetStrictRanges([i[0] for i in self.bounds], [i[1] for i in self.bounds]) solver.SetEvaluationLimits(evaluations=maxf) solver.SetTermination(CRT(xtol=ftol, ftol=ftol)) # Inverting weights (*-1) to convert problem to minimizing solver.Solve( self.evaluate_single_solution, ExtraArgs=([weight * -1 for weight in self.weights]), callback=self.callback ) solver.enable_signal_handler() #Finally self.callback( individual=solver.Solution(), final=True ) return
def test_sumt2(): def costfunc(x): return (x[0] - 1.)**2 + (x[1] - 2.)**2 + (x[2] - 3.)**4 x0 = [0., 0., 0.] ndim = 3 constraints_string = """ x2 > 5. 4.*x1-5.*x3 < -1. (x1-10.)**2 + (x2+1.)**2 < 50. """ print "constraints equations:%s" % (constraints_string.rstrip(), ) from mystic.solvers import DifferentialEvolutionSolver from mystic.solvers import NelderMeadSimplexSolver from mystic.termination import VTR #solver = DifferentialEvolutionSolver(ndim, npop) solver = NelderMeadSimplexSolver(ndim) solver.SetInitialPoints(x0) term = VTR() #FIXME: sumt, issolution no longer take constraints strings end_solver = sumt(constraints_string, ndim, costfunc, solver,\ term, disp=True) soln = end_solver.Solution() print "final answer:", soln print "constraints satisfied:", issolution(constraints_string, soln) print "expected: [ 6.25827968 4.999961 5.20662288]", "\n"
def optimize_linear(self, initial_values: List[float], function) -> List[float]: """ Function to optimize one solution linear by using the mystic library Args: initial_values: the initial solution that the solver starts with function: the callback function that sends out the task to the database, awaits the result and takes it back in Returns: solution: a linear optimized solution """ solver = NelderMeadSimplexSolver(dim=len(initial_values)) solver.SetInitialPoints(x0=initial_values) solver.SetStrictRanges(self.low, self.up) solver.SetEvaluationLimits(generations=self.maxf) solver.SetTermination(CRT(self.xtol, self.ftol)) solver.Solve(function) return list(solver.Solution())
def run(self): self.logger.info('Start local optimization...') maxf = self.request_data['optimization']['parameters']['maxf'] xtol = self.request_data['optimization']['parameters']['xtol'] ftol = self.request_data['optimization']['parameters']['ftol'] solver = NelderMeadSimplexSolver(len(self.initial_values)) solver.SetInitialPoints(self.initial_values) solver.SetStrictRanges([i[0] for i in self.bounds], [i[1] for i in self.bounds]) solver.SetEvaluationLimits(evaluations=maxf) solver.SetTermination(CRT(xtol=ftol, ftol=ftol)) solver.Solve( self.evaluate_single_solution, callback=self.callback ) solver.enable_signal_handler() self.callback( individual=solver.Solution(), final=True ) return
# draw frame and exact coefficients plot_exact() # select parameter bounds constraints from numpy import inf min_bounds = [0, -1, -300, -1, 0, -1, -100, -inf, -inf] max_bounds = [200, 1, 0, 1, 200, 1, 0, inf, inf] # configure monitors stepmon = VerboseMonitor(100) evalmon = Monitor() # use Nelder-Mead to solve 8th-order Chebyshev coefficients solver = NelderMeadSimplexSolver(ndim) solver.SetInitialPoints(x0) solver.SetEvaluationLimits(generations=999) solver.SetEvaluationMonitor(evalmon) solver.SetGenerationMonitor(stepmon) solver.SetStrictRanges(min_bounds, max_bounds) solver.enable_signal_handler() solver.Solve(chebyshev8cost, termination=CRT(1e-4,1e-4), \ sigint_callback=plot_solution) solution = solver.bestSolution # get solved coefficients and Chi-Squared (from solver members) iterations = solver.generations cost = solver.bestEnergy print "Generation %d has best Chi-Squared: %f" % (iterations, cost) print "Solved Coefficients:\n %s\n" % poly1d(solver.bestSolution)