Source code for neurotune.optimizers

"""
Optimizer objects live here.
"""

import os
from inspyred import ec
from inspyred.ec import observers
from inspyred.ec import terminators
from inspyred.ec import selectors
from inspyred.ec import replacers
from inspyred.ec import variators
from random import Random
from time import time
import logging


class __Optimizer(object):
    """
    Base optimization class
    """

    def __init__(self,
                 max_constraints,
                 min_constraints,
                 evaluator,
                 mutation_rate,
                 maximize,
                 seeds,
                 population_size):

        self.max_constraints=max_constraints
        self.min_constraints=min_constraints
        self.evaluator=evaluator
        self.population_size=population_size
        self.maximize=maximize
        self.mutation_rate=mutation_rate
        self.seeds=seeds

    def uniform_random_chromosome(self,random,args):
        chromosome = []
        for lo, hi in zip(self.max_constraints, self.min_constraints):
            chromosome.append(random.uniform(lo, hi))
        return chromosome

    def print_report(self,final_pop,do_plot,stat_file_name):
        print(max(final_pop))
        #Sort and print the fittest individual, which will be at index 0.
        final_pop.sort(reverse=True)
        print('\n  Fittest individual:\n  %s'%final_pop[0])

        if do_plot:
            from inspyred.ec import analysis
            try:
                stat_file = open(stat_file_name, "r")
                analysis.generation_plot(stat_file, errorbars=False)
            finally:
                stat_file.close()
            


[docs]class CustomOptimizerA(__Optimizer): def __init__(self,max_constraints, min_constraints, evaluator, mutation_rate=0.2, max_evaluations=100, population_size=10, num_selected=None, tourn_size=2, num_elites=1, maximize=False, num_offspring=None, seeds=[], verbose=False): super(CustomOptimizerA, self).__init__(max_constraints,min_constraints, evaluator,mutation_rate, maximize,seeds,population_size) self.max_evaluations=max_evaluations self.tourn_size=tourn_size self.num_elites=num_elites self.mutation_rate=mutation_rate self.verbose = verbose if num_selected==None: self.num_selected=population_size else: self.num_selected=num_selected if num_offspring==None: self.num_offspring=population_size-self.num_selected else: self.num_offspring=num_offspring
[docs] def optimize(self,do_plot=True,seed=int(time()), summary_dir=None): rand = Random() rand.seed(seed) if summary_dir is None: cwd=os.getcwd() summary_dir=os.path.dirname(cwd)+'/data/' if not os.path.exists(summary_dir): os.mkdir(summary_dir) stat_file_name=summary_dir+'/ga_statistics.csv' ind_file_name=summary_dir+'/ga_individuals.csv' stat_file = open(stat_file_name, 'w') ind_file = open(ind_file_name, 'w') print("Created files: %s and %s"%(stat_file_name, ind_file_name)) if self.verbose: logger = logging.getLogger('inspyred.ec') logger.setLevel(logging.DEBUG) ch = logging.StreamHandler() # ch.setLevel(logging.DEBUG) formatter = logging.Formatter('>>> EC: - %(levelname)s - %(message)s') ch.setFormatter(formatter) logger.addHandler(ch) algorithm = ec.EvolutionaryComputation(rand) algorithm.observer = observers.file_observer algorithm.terminator = terminators.evaluation_termination algorithm.selector = selectors.tournament_selection algorithm.replacer = replacers.steady_state_replacement algorithm.variator = [variators.blend_crossover, variators.gaussian_mutation] final_pop = algorithm.evolve(generator=self.uniform_random_chromosome, evaluator=self.evaluator.evaluate, pop_size=self.population_size, maximize=self.maximize, bounder=ec.Bounder(lower_bound=self.min_constraints, upper_bound=self.max_constraints), num_selected=self.num_selected, tourn_size=self.tourn_size, num_elites=self.num_elites, num_offspring=self.num_offspring, max_evaluations=self.max_evaluations, mutation_rate=self.mutation_rate, statistics_file=stat_file, seeds=self.seeds, individuals_file=ind_file) stat_file.close() ind_file.close() self.print_report(final_pop,do_plot,stat_file_name) #return the parameter set for the best individual return final_pop[0].candidate, final_pop[0].fitness