def test_population_generate(self, simple_evaluation_function): def init_func(): return 1 pop = Population.generate(init_function=init_func, eval_function=simple_evaluation_function, size=200) assert len(pop) == 200 assert pop.intended_size == 200 assert pop.individuals[0].chromosome == 1
def run_travelling_salesman(population_size: int = 100, n_iterations: int = 10, random_seed: int = 0, n_destinations: int = 50, concurrent_workers: Optional[int] = None, n_groups: int = 4, silent: bool = False): seed(random_seed) # Generate some destinations destinations = [(random(), random()) for _ in range(n_destinations)] # Given a list of destination indexes, this is our cost function def evaluate(ordered_destinations: List[int]) -> float: total = 0 for x, y in zip(ordered_destinations, ordered_destinations[1:]): coordinates_x = destinations[x] coordinates_y = destinations[y] total += sqrt((coordinates_x[0] - coordinates_y[1])**2 + (coordinates_x[1] - coordinates_y[1])**2) return total # This generates a random solution def generate_solution() -> List[int]: indexes = list(range(n_destinations)) shuffle(indexes) return indexes def print_function(population: Population): if population.generation % 5000 == 0 and not silent: print( f'{population.generation}: {population.documented_best.fitness:1.2f} / ' f'{population.current_best.fitness:1.2f}') pop = Population.generate(generate_solution, eval_function=evaluate, maximize=False, size=population_size * n_groups, concurrent_workers=concurrent_workers) island_evo = (Evolution().survive(fraction=0.5).breed( parent_picker=pick_random, combiner=cycle_crossover).mutate(swap_elements, elitist=True)) evo = (Evolution().evaluate(lazy=True).callback(print_function).repeat( evolution=island_evo, n=100, grouping_function=group_stratified, n_groups=n_groups)) result = pop.evolve(evolution=evo, n=n_iterations) if not silent: print(f'Shortest route: {result.documented_best.chromosome}') print(f'Route length: {result.documented_best.fitness}')
def func_to_optimise(x): return x * 2 def pick_random_parents(pop): return random.choice(pop) random.seed(42) pop1 = Population(chromosomes=[create_candidate() for _ in range(5)], eval_function=func_to_optimise, 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