Beispiel #1
0
    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
Beispiel #2
0
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}')
Beispiel #3
0
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