Using the best fitness limit terminator, here is a brute force method
for finding optimal parameters for the Rosenbrock problem:
def main():
prng = Random() # random number generator
numberOfLoopsToAverage = 10
# limits
additional_arguments = {'best_fitness_limit':0.005}
maximum_number_of_function_evaluations = 10000
maximum_number_of_generations = 100
#initial values and iteration lists
initial_random_generator_seed = 3
initial_population_seeds = [] # lists of initial population
candidates if any have been estimated
population_sizes_for_iteration = [50, 75, 100, 200, 300]
number_of_selected_for_iteration = [1, 2, 5, 7]
number_of_offspring_for_iteration = [1, 2, 5, 7]
mutation_rates_for_iteration = [0.0001, 0.001, 0.01, 0.1, 0.2,
0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
use_one_fifth_rule_flags_for_iteration = [True, False]
number_of_elites_for_iteration = [0, 1, 2, 5, 7, 10]
number_of_tourney_sizes_for_iteration = [1, 2, 5, 7, 10]
neighborhood_sizes_for_iteration = [1, 2, 5, 7, 10]
# genetic algorithm
problem = benchmarks.Rosenbrock(2)
for populationSize in population_sizes_for_iteration:
for numberOfElites in number_of_elites_for_iteration:
if numberOfElites >= populationSize:
continue
for useOneFifthRuleFlag in
use_one_fifth_rule_flags_for_iteration:
for mutationRate in mutation_rates_for_iteration:
averageFitness = 0.0
averageNumberOfEvaluations = 0
maxNumberOfEvaluationsFlag = False
maxNumberOfGenerationsFlag = False
for loopCount in range(numberOfLoopsToAverage):
prng.seed(initial_random_generator_seed +
loopCount)
ea = ec.GA(prng)
ea.terminator =
[best_fitness_limit_termination, terminators.evaluation_termination,
terminators.generation_termination]
ea.variator = [variators.uniform_crossover,
variators.gaussian_mutation]
final_pop = ea.evolve(generator =
problem.generator,
evaluator =
problem.evaluator,
pop_size =
populationSize,
maximize =
problem.maximize,
bounder =
problem.bounder,
max_evaluations =
maximum_number_of_function_evaluations,
max_generations =
maximum_number_of_generations,
seeds =
initial_population_seeds,
num_elites =
numberOfElites,
mutation_rate =
mutationRate,
use_one_fifth_rule =
useOneFifthRuleFlag,
**additional_arguments)
if ea.num_evaluations >=
maximum_number_of_function_evaluations:
maxNumberOfEvaluationsFlag = True
break
if ea.num_generations >=
maximum_number_of_generations:
maxNumberOfGenerationsFlag = True
break
final_pop.sort(reverse=True)
averageFitness += final_pop[0].fitness
averageNumberOfEvaluations +=
ea.num_evaluations
if maxNumberOfEvaluationsFlag or
maxNumberOfGenerationsFlag:
continue
averageFitness /= numberOfLoopsToAverage
averageNumberOfEvaluations /=
numberOfLoopsToAverage
print averageFitness, \
averageNumberOfEvaluations, \
populationSize, \
numberOfElites, \
useOneFifthRuleFlag, \
mutationRate, \
ea.__class__.__name__, \
problem.__class__.__name__
James