def test_survive_n_works(self, simple_chromosomes, simple_evaluation_function): pop1 = Population(chromosomes=simple_chromosomes, eval_function=simple_evaluation_function) pop2 = Population(chromosomes=simple_chromosomes, eval_function=simple_evaluation_function) pop3 = Population(chromosomes=simple_chromosomes, eval_function=simple_evaluation_function) assert len(pop1) == len(simple_chromosomes) assert len(pop2.survive(n=50)) == 50 assert len(pop3.survive(n=75, luck=True)) == 75
def test_survive_n_and_p_works(self, simple_evaluation_function): chromosomes = list(range(200)) pop1 = Population(chromosomes=chromosomes, eval_function=simple_evaluation_function) pop2 = Population(chromosomes=chromosomes, eval_function=simple_evaluation_function) pop3 = Population(chromosomes=chromosomes, eval_function=simple_evaluation_function) assert len(pop1.survive(fraction=0.5, n=200)) == 100 assert len(pop2.survive(fraction=0.9, n=10)) == 10 assert len(pop3.survive(fraction=0.5, n=190, luck=True)) == 100
def test_survive_p_works(self, simple_chromosomes, simple_evaluation_function): pop1 = Population(chromosomes=simple_chromosomes, eval_function=simple_evaluation_function) pop2 = Population(chromosomes=simple_chromosomes, eval_function=simple_evaluation_function) pop3 = Population(chromosomes=simple_chromosomes, eval_function=simple_evaluation_function) assert len(pop1) == len(simple_chromosomes) assert len(pop2.survive(fraction=0.5)) == len(simple_chromosomes) * 0.5 assert len(pop3.survive(fraction=0.1, luck=True)) == len(simple_chromosomes) * 0.1
def test_breed_amount_works(self, simple_chromosomes, simple_evaluation_function): pop1 = Population(chromosomes=simple_chromosomes, eval_function=simple_evaluation_function) pop1.survive(n=50).breed( parent_picker=lambda population: choices(population, k=2), combiner=lambda mom, dad: (mom + dad) / 2) assert len(pop1) == len(simple_chromosomes) pop2 = Population(chromosomes=simple_chromosomes, eval_function=simple_evaluation_function) pop2.survive(n=50).breed( parent_picker=lambda population: choices(population, k=2), combiner=lambda mom, dad: (mom + dad) / 2, population_size=400) assert len(pop2) == 400 assert pop2.intended_size == 400
def test_breed_works_with_kwargs(self, simple_chromosomes, simple_evaluation_function): pop1 = Population(chromosomes=simple_chromosomes, eval_function=simple_evaluation_function) pop1.survive(n=50).breed(parent_picker=pick_random, combiner=lambda mom, dad: (mom + dad) / 2, n_parents=2) assert len(pop1) == len(simple_chromosomes) pop2 = Population(chromosomes=simple_chromosomes, eval_function=simple_evaluation_function) pop2.survive(n=50).breed( parent_picker=pick_random, combiner=lambda *parents: sum(parents) / len(parents), population_size=400, n_parents=3) assert len(pop2) == 400 assert pop2.intended_size == 400
np.random.seed(1234) def f(x): return 8 * x - 2 * x**2 def random_guy(): return np.random.randint(low=-1_000_000, high=1_000_000) initGenerationSize = 100 firstGen = [random_guy() for _ in range(initGenerationSize)] pop = Population(chromosomes=firstGen, eval_function=f, maximize=True) survivors = pop.survive(fraction=0.1) def pickParents(population): mom, dad = np.random.choice(population, size=2) return mom, dad def makeChild(mom, dad): return (mom + dad) / 2 def randomNoise(individual, sigma): noise = np.random.normal(loc=0, scale=10) * sigma return individual + noise
maximize=True) pop2 = Population.generate(init_function=create_candidate, eval_function=func_to_optimise, size=5, maximize=False) print("[i for i in pop1]:") print([i for i in pop1]) print("[i.chromosome for i in pop1]:") print([i.chromosome for i in pop1]) print("[i.fitness for i in pop1]:") print([i.fitness for i in pop1]) print("[i.fitness for i in pop1.evaluate()]:") def produce_clone(parent): return parent def add_noise(x): return 0.1 * (random.random() - 0.5) + x print("[i.fitness for i in pop1.survive(n=3)]:") print([i.fitness for i in pop1.survive(n=3)]) print("[i.fitness for i in pop1.survive(n=3).mutate(add_noise)]:") print([i.fitness for i in pop1.survive(n=3).mutate(add_noise)]) print("[i.fitness for i in pop1.survive(n=3).mutate(add_noise).evaluate()]:") print([i.fitness for i in pop1.survive(n=3).mutate(add_noise).evaluate()])
def add_noise(chromosome, sigma): """ This is a function that will add some noise to the chromosome. """ new_x = chromosome[0] + (r() - 0.5) * sigma new_y = chromosome[1] + (r() - 0.5) * sigma return new_x, new_y # We start by defining a population with candidates. pop = Population(chromosomes=[random_start() for _ in range(200)], eval_function=func_to_optimise, maximize=True) # We do a single step here and out comes a new population pop.survive(fraction=0.5) # We do two steps here and out comes a new population (pop .survive(fraction=0.5) .breed(parent_picker=pick_random_parents, combiner=make_child)) # We do a three steps here and out comes a new population (pop .survive(fraction=0.5) .breed(parent_picker=pick_random_parents, combiner=make_child) .mutate(mutate_function=add_noise, sigma=1)) # This is inelegant but it works. for i in range(5): pop = (pop