def test2(monitor, diffenv=None): if diffenv == True: #from mystic.solvers import DifferentialEvolutionSolver as DE from mystic.solvers import DifferentialEvolutionSolver2 as DE elif diffenv == False: from mystic.solvers import NelderMeadSimplexSolver as noDE else: from mystic.solvers import PowellDirectionalSolver as noDE from mystic.termination import ChangeOverGeneration as COG from mystic.tools import getch, random_seed random_seed(123) lb = [-100, -100, -100] ub = [1000, 1000, 1000] ndim = len(lb) npop = 5 maxiter = 10 maxfun = 1e+6 convergence_tol = 1e-10 ngen = 100 crossover = 0.9 percent_change = 0.9 def cost(x): ax, bx, c = x return (ax)**2 - bx + c if diffenv == True: solver = DE(ndim, npop) else: solver = noDE(ndim) solver.SetRandomInitialPoints(min=lb, max=ub) solver.SetStrictRanges(min=lb, max=ub) solver.SetEvaluationLimits(maxiter, maxfun) solver.SetEvaluationMonitor(monitor) #solver.SetGenerationMonitor(monitor) tol = convergence_tol solver.Solve(cost, termination=COG(tol, ngen)) solved = solver.Solution() monitor.info("solved: %s" % solved) func_max = -solver.bestEnergy return solved, func_max
def de_solve(CF, a4=None, a5=None): """solve with DE for given cost funciton; fix a4 and/or a5 if provided""" minrange = [0, 100, 100, 1, 1] maxrange = [100, 2000, 200, 200, 200] interval = 10 if a5 != None: minrange[4] = maxrange[4] = a5 interval = 20 if a4 != None: minrange[3] = maxrange[3] = a4 if interval == 20: interval = 1000 solver = DifferentialEvolutionSolver(ND, NP) solver.enable_signal_handler() stepmon = MyMonitor(interval) solver.SetRandomInitialPoints(min=minrange,max=maxrange) solver.SetStrictRanges(min=minrange, max=maxrange) solver.SetEvaluationLimits(generations=MAX_GENERATIONS) solver.SetGenerationMonitor(stepmon) solver.Solve(CF,termination=ChangeOverGeneration(generations=50)) solution = solver.Solution() return solution, stepmon