One Max Problem
Detailed Version
1from deap_er import creator
2from deap_er import tools
3from deap_er import base
4import random
5
6
7random.seed(1234) # disables randomization
8
9NGEN = 1000
10CX_PROB = 0.5
11MUT_PROB = 0.2
12
13
14def setup():
15 creator.create("FitnessMax", base.Fitness, weights=(1.0,))
16 creator.create("Individual", list, fitness=creator.FitnessMax)
17
18 toolbox = base.Toolbox()
19 toolbox.register("attr_bool", random.randint, 0, 1)
20 toolbox.register("individual", tools.init_repeat, creator.Individual, toolbox.attr_bool, 100)
21 toolbox.register("population", tools.init_repeat, list, toolbox.individual)
22 toolbox.register("mate", tools.cx_two_point)
23 toolbox.register("mutate", tools.mut_flip_bit, mut_prob=0.05)
24 toolbox.register("select", tools.sel_tournament, contestants=3)
25 toolbox.register("evaluate", lambda x: sum(x))
26
27 return toolbox
28
29
30def print_results(best_ind):
31 if not all(gene == 1 for gene in best_ind):
32 raise RuntimeError('Evolution failed to converge.')
33 print(f'\nEvolution converged correctly.')
34
35
36def main():
37 toolbox = setup()
38 population = toolbox.population(size=300)
39
40 fitness = map(toolbox.evaluate, population)
41 for ind, fit in zip(population, fitness):
42 ind.fitness.values = fit
43 fits = [ind.fitness.values[0] for ind in population]
44
45 generation = 0
46 while max(fits) < 100 and generation < NGEN:
47 offspring = toolbox.select(population, len(population))
48 offspring = list(map(toolbox.clone, offspring))
49
50 for child1, child2 in zip(offspring[::2], offspring[1::2]):
51 if random.random() < CX_PROB:
52 toolbox.mate(child1, child2)
53 del child1.fitness.values
54 del child2.fitness.values
55
56 for mutant in offspring:
57 if random.random() < MUT_PROB:
58 toolbox.mutate(mutant)
59 del mutant.fitness.values
60
61 invalid_ind = [ind for ind in offspring if not ind.fitness.is_valid()]
62 fitness = map(toolbox.evaluate, invalid_ind)
63 for ind, fit in zip(invalid_ind, fitness):
64 ind.fitness.values = fit
65 population[:] = offspring
66 fits = [ind.fitness.values[0] for ind in population]
67 generation += 1
68
69 best_ind = tools.sel_best(population, sel_count=1)[0]
70 print_results(best_ind)
71
72
73if __name__ == "__main__":
74 main()
Short Version
1from deap_er import creator
2from deap_er import tools
3from deap_er import base
4import random
5import numpy
6import array
7
8
9random.seed(1234) # disables randomization
10
11
12def setup():
13 creator.create("FitnessMax", base.Fitness, weights=(1.0,))
14 creator.create("Individual", array.array, typecode='b', fitness=creator.FitnessMax)
15
16 toolbox = base.Toolbox()
17 toolbox.register("attr_bool", random.randint, 0, 1)
18 toolbox.register("individual", tools.init_repeat, creator.Individual, toolbox.attr_bool, 100)
19 toolbox.register("population", tools.init_repeat, list, toolbox.individual)
20 toolbox.register("mate", tools.cx_two_point)
21 toolbox.register("mutate", tools.mut_flip_bit, mut_prob=0.05)
22 toolbox.register("select", tools.sel_tournament, contestants=3)
23 toolbox.register("evaluate", lambda x: sum(x))
24
25 stats = tools.Statistics(lambda ind: ind.fitness.values)
26 stats.register("avg", numpy.mean)
27 stats.register("std", numpy.std)
28 stats.register("min", numpy.min)
29 stats.register("max", numpy.max)
30
31 return toolbox, stats
32
33
34def print_results(best_ind):
35 if not all(gene == 1 for gene in best_ind):
36 raise RuntimeError('Evolution failed to converge.')
37 print(f'\nEvolution converged correctly.')
38
39
40def main():
41 toolbox, stats = setup()
42 pop = toolbox.population(size=300)
43 hof = tools.HallOfFame(maxsize=1)
44 args = dict(
45 toolbox=toolbox,
46 population=pop,
47 generations=50,
48 cx_prob=0.5,
49 mut_prob=0.2,
50 hof=hof,
51 stats=stats,
52 verbose=True # prints stats
53 )
54 tools.ea_simple(**args)
55 print_results(hof[0])
56
57
58if __name__ == "__main__":
59 main()
Using Numpy
1from deap_er import creator
2from deap_er import tools
3from deap_er import base
4import random
5import numpy
6
7
8random.seed(1234) # disables randomization
9
10
11def setup():
12 creator.create("FitnessMax", base.Fitness, weights=(1.0,))
13 creator.create("Individual", numpy.ndarray, fitness=creator.FitnessMax)
14
15 toolbox = base.Toolbox()
16 toolbox.register("attr_bool", random.randint, 0, 1)
17 toolbox.register("individual", tools.init_repeat, creator.Individual, toolbox.attr_bool, 100)
18 toolbox.register("population", tools.init_repeat, list, toolbox.individual)
19
20 toolbox.register("mate", tools.cx_two_point_copy)
21 toolbox.register("mutate", tools.mut_flip_bit, mut_prob=0.05)
22 toolbox.register("select", tools.sel_tournament, contestants=3)
23 toolbox.register("evaluate", lambda x: sum(x))
24
25 stats = tools.Statistics(lambda ind: ind.fitness.values)
26 stats.register("avg", numpy.mean)
27 stats.register("std", numpy.std)
28 stats.register("min", numpy.min)
29 stats.register("max", numpy.max)
30
31 return toolbox, stats
32
33
34def print_results(best_ind):
35 if not all(gene == 1 for gene in best_ind):
36 raise RuntimeError('Evolution failed to converge.')
37 print(f'\nEvolution converged correctly.')
38
39
40def main():
41 toolbox, stats = setup()
42 pop = toolbox.population(size=300)
43 hof = tools.HallOfFame(maxsize=1, similar=numpy.array_equal)
44 args = dict(
45 toolbox=toolbox,
46 population=pop,
47 generations=50,
48 cx_prob=0.5,
49 mut_prob=0.2,
50 hof=hof,
51 stats=stats,
52 verbose=True # prints stats
53 )
54 tools.ea_simple(**args)
55 print_results(hof[0])
56
57
58if __name__ == "__main__":
59 main()
Using Multiprocessing
1from deap_er import creator
2from deap_er import tools
3from deap_er import base
4import multiprocessing as mp
5import random
6import numpy
7import array
8
9
10random.seed(1234) # disables randomization
11
12
13# Evaluator can't be a lambda, because lambdas can't be pickled.
14def evaluate(individual):
15 return sum(individual)
16
17
18# Can't be in setup(), because subprocesses need these objects.
19creator.create("FitnessMax", base.Fitness, weights=(1.0,))
20creator.create("Individual", array.array, typecode='b', fitness=creator.FitnessMax)
21
22
23def setup():
24 toolbox = base.Toolbox()
25 toolbox.register("attr_bool", random.randint, 0, 1)
26 toolbox.register("individual", tools.init_repeat, creator.Individual, toolbox.attr_bool, 100)
27 toolbox.register("population", tools.init_repeat, list, toolbox.individual)
28
29 toolbox.register("mate", tools.cx_two_point)
30 toolbox.register("mutate", tools.mut_flip_bit, mut_prob=0.05)
31 toolbox.register("select", tools.sel_tournament, contestants=3)
32 toolbox.register("evaluate", evaluate)
33
34 stats = tools.Statistics(lambda ind: ind.fitness.values)
35 stats.register("avg", numpy.mean)
36 stats.register("std", numpy.std)
37 stats.register("min", numpy.min)
38 stats.register("max", numpy.max)
39
40 return toolbox, stats
41
42
43def print_results(best_ind):
44 if not all(gene == 1 for gene in best_ind):
45 raise RuntimeError('Evolution failed to converge.')
46 print(f'\nEvolution converged correctly.')
47
48
49def main():
50 toolbox, stats = setup()
51 pop = toolbox.population(size=300)
52 hof = tools.HallOfFame(maxsize=1)
53 with mp.Pool() as pool:
54 toolbox.register("map", pool.map)
55 args = dict(
56 toolbox=toolbox,
57 population=pop,
58 generations=50,
59 cx_prob=0.5,
60 mut_prob=0.2,
61 hof=hof,
62 stats=stats,
63 verbose=True # prints stats
64 )
65 tools.ea_simple(**args)
66 print_results(hof[0])
67
68
69if __name__ == "__main__":
70 main()