Exemplo n.º 1
0
    def __init__(self):

        self.num_generations = 100

        self.genotype_conf = PlasticodingConfig(max_structural_modules=20, )
        self.mutation_conf = MutationConfig(
            mutation_prob=0.8,
            genotype_conf=self.genotype_conf,
        )

        self.crossover_conf = CrossoverConfig(crossover_prob=0.8, )

        self.population_conf = PopulationConfig(
            population_size=100,
            genotype_constructor=random_initialization,
            genotype_conf=self.genotype_conf,
            fitness_function=fitness.online_old_revolve,
            mutation_operator=standard_mutation,
            mutation_conf=self.mutation_conf,
            crossover_operator=standard_crossover,
            crossover_conf=self.crossover_conf,
            selection=lambda individuals: tournament_selection(individuals, 2),
            parent_selection=lambda individuals: multiple_selection(
                individuals, 2, tournament_selection),
            population_management=steady_state_population_management,
            population_management_selector=tournament_selection,
            evaluation_time=30,
            offspring_size=20,
        )
Exemplo n.º 2
0
async def run():
    """
    The main coroutine, which is started below.
    """

    # experiment params #
    num_generations = 100
    population_size = 100
    offspring_size = 50

    genotype_conf = PlasticodingConfig(
        max_structural_modules=100,
    )

    mutation_conf = MutationConfig(
        mutation_prob=0.8,
        genotype_conf=genotype_conf,
    )

    crossover_conf = CrossoverConfig(
        crossover_prob=0.8,
    )
    # experiment params #

    # Parse command line / file input arguments
    settings = parser.parse_args()
    experiment_management = ExperimentManagement(settings)
    do_recovery = settings.recovery_enabled and not experiment_management.experiment_is_new()

    logger.info('Activated run '+settings.run+' of experiment '+settings.experiment_name)

    if do_recovery:
        gen_num, has_offspring, next_robot_id = experiment_management.read_recovery_state(population_size, offspring_size)

        if gen_num == num_generations-1:
            logger.info('Experiment is already complete.')
            return
    else:
        gen_num = 0
        next_robot_id = 1

    def fitness_function(robot_manager, robot):
        contacts = measures.contacts(robot_manager, robot)
        assert(contacts != 0)
        return fitness.displacement_velocity_hill(robot_manager, robot)

    population_conf = PopulationConfig(
        population_size=population_size,
        genotype_constructor=random_initialization,
        genotype_conf=genotype_conf,
        fitness_function=fitness_function,
        mutation_operator=standard_mutation,
        mutation_conf=mutation_conf,
        crossover_operator=standard_crossover,
        crossover_conf=crossover_conf,
        selection=lambda individuals: tournament_selection(individuals, 2),
        parent_selection=lambda individuals: multiple_selection(individuals, 2, tournament_selection),
        population_management=steady_state_population_management,
        population_management_selector=tournament_selection,
        evaluation_time=settings.evaluation_time,
        offspring_size=offspring_size,
        experiment_name=settings.experiment_name,
        experiment_management=experiment_management,
    )

    settings = parser.parse_args()
    simulator_queue = SimulatorQueue(settings.n_cores, settings, settings.port_start)
    await simulator_queue.start()

    population = Population(population_conf, simulator_queue, next_robot_id)

    if do_recovery:
        # loading a previous state of the experiment
        await population.load_snapshot(gen_num)
        if gen_num >= 0:
            logger.info('Recovered snapshot '+str(gen_num)+', pop with ' + str(len(population.individuals))+' individuals')
        if has_offspring:
            individuals = await population.load_offspring(gen_num, population_size, offspring_size, next_robot_id)
            gen_num += 1
            logger.info('Recovered unfinished offspring '+str(gen_num))

            if gen_num == 0:
                await population.init_pop(individuals)
            else:
                population = await population.next_gen(gen_num, individuals)

            experiment_management.export_snapshots(population.individuals, gen_num)
    else:
        # starting a new experiment
        experiment_management.create_exp_folders()
        await population.init_pop()
        experiment_management.export_snapshots(population.individuals, gen_num)

    while gen_num < num_generations-1:
        gen_num += 1
        population = await population.next_gen(gen_num)
        experiment_management.export_snapshots(population.individuals, gen_num)
Exemplo n.º 3
0
async def run():
    """
    The main coroutine, which is started below.
    """
    # Parse command line / file input arguments

    genotype_conf = PlasticodingConfig(max_structural_modules=100, )

    mutation_conf = MutationConfig(
        mutation_prob=0.8,
        genotype_conf=genotype_conf,
    )

    crossover_conf = CrossoverConfig(crossover_prob=0.8, )

    settings = parser.parse_args()
    experiment_management = ExperimentManagement(settings)

    population_conf = PopulationConfig(
        population_size=100,
        genotype_constructor=random_initialization,
        genotype_conf=genotype_conf,
        fitness_function=fitness.displacement_velocity_hill,
        mutation_operator=standard_mutation,
        mutation_conf=mutation_conf,
        crossover_operator=standard_crossover,
        crossover_conf=crossover_conf,
        selection=lambda individuals: tournament_selection(individuals, 2),
        parent_selection=lambda individuals: multiple_selection(
            individuals, 2, tournament_selection),
        population_management=steady_state_population_management,
        population_management_selector=tournament_selection,
        evaluation_time=settings.evaluation_time,
        offspring_size=50,
        experiment_name=settings.experiment_name,
        experiment_management=experiment_management,
    )

    settings = parser.parse_args()
    simulator_queue = SimulatorQueue(settings.n_cores, settings,
                                     settings.port_start)
    await simulator_queue.start()

    population = Population(population_conf, simulator_queue, 0)

    # choose a snapshot here. and the maximum best individuals you wish to watch
    generation = 100
    max_best = 10
    await population.load_snapshot(generation)

    fitnesses = []
    for ind in population.individuals:
        fitnesses.append(ind.fitness)
    fitnesses = np.array(fitnesses)

    ini = len(population.individuals) - max_best
    fin = len(population.individuals)
    population.individuals = np.array(population.individuals)
    population.individuals = population.individuals[np.argsort(fitnesses)
                                                    [ini:fin]]

    await population.evaluate(population.individuals, generation)
Exemplo n.º 4
0
SEED_POPULATION_START = 50
MIN_POP = 20
MAX_POP = 50
Z_SPAWN_DISTANCE = 0.2
LIMIT_X = 3
LIMIT_Y = 3
MATURE_AGE = 5
MATE_DISTANCE = 0.6
MATING_COOLDOWN = 0.1
COUPLE_MATING_LIMIT = 1
MATING_INCREASE_RATE = 1.0
SNAPSHOT_TIME = 60 * 10  # 10 minutes
RECENT_CHILDREN_DELTA_TIME = 30

PLASTICODING_CONF = PlasticodingConfig(max_structural_modules=20)
CROSSOVER_CONF = CrossoverConfig(crossover_prob=1.0)
MUTATION_CONF = MutationConfig(mutation_prob=0.8,
                               genotype_conf=PLASTICODING_CONF)

# FOLDER WHERE TO SAVE THE EXPERIMENT
# {current_folder}/data/{arguments.experiment_name}
# example ~/projects/revolve/experiments/unmanaged/data/default_experiment
DATA_FOLDER_BASE = os.path.join(
    os.path.dirname(os.path.realpath(__file__)),
    'data',
)


def make_folders(base_dirpath):
    if os.path.exists(base_dirpath):
        assert (os.path.isdir(base_dirpath))
Exemplo n.º 5
0
async def run():
    """
    The main coroutine, which is started below.
    """

    # experiment params #
    num_generations = 200
    population_size = 100
    offspring_size = 100
    front = 'slaves'

    # environment world and z-start
    environments = {'plane': 0.03,
                    'tilted5': 0.1
                    }

    genotype_conf = PlasticodingConfig(
        max_structural_modules=15,
        plastic=True,
    )

    mutation_conf = MutationConfig(
        mutation_prob=0.8,
        genotype_conf=genotype_conf,
    )

    crossover_conf = CrossoverConfig(
        crossover_prob=0.8,
    )
    # experiment params #

    # Parse command line / file input arguments
    settings = parser.parse_args()
    experiment_management = ExperimentManagement(settings, environments)
    do_recovery = settings.recovery_enabled and not experiment_management.experiment_is_new()

    logger.info('Activated run '+settings.run+' of experiment '+settings.experiment_name)

    if do_recovery:
        gen_num, has_offspring, next_robot_id = experiment_management.read_recovery_state(population_size,
                                                                                          offspring_size)

        if gen_num == num_generations-1:
            logger.info('Experiment is already complete.')
            return
    else:
        gen_num = 0
        next_robot_id = 1

    def fitness_function_plane(robot_manager, robot):
        return fitness.displacement_velocity_hill(robot_manager, robot, False)

    fitness_function = {'plane': fitness_function_plane,
                        'tilted5': fitness_function_plane}

    population_conf = PopulationConfig(
        population_size=population_size,
        genotype_constructor=random_initialization,
        genotype_conf=genotype_conf,
        fitness_function=fitness_function,
        mutation_operator=standard_mutation,
        mutation_conf=mutation_conf,
        crossover_operator=standard_crossover,
        crossover_conf=crossover_conf,
        selection=lambda individuals: tournament_selection(individuals, environments, 2),
        parent_selection=lambda individuals: multiple_selection(individuals, 2, tournament_selection, environments),
        population_management=steady_state_population_management,
        population_management_selector=tournament_selection,
        evaluation_time=settings.evaluation_time,
        offspring_size=offspring_size,
        experiment_name=settings.experiment_name,
        experiment_management=experiment_management,
        environments=environments,
        front=front
    )


    settings = parser.parse_args()

    simulator_queue = {}
    analyzer_queue = None

    previous_port = None
    for environment in environments:

        settings.world = environment
        settings.z_start = environments[environment]

        if previous_port is None:
            port = settings.port_start
            previous_port = port
        else:
            port = previous_port+settings.n_cores
            previous_port = port

        simulator_queue[environment] = SimulatorQueue(settings.n_cores, settings, port)
        await simulator_queue[environment].start()

    analyzer_queue = AnalyzerQueue(1, settings, port+settings.n_cores)
    await analyzer_queue.start()

    population = Population(population_conf, simulator_queue, analyzer_queue, next_robot_id)

    if do_recovery:

        if gen_num >= 0:
            # loading a previous state of the experiment
            await population.load_snapshot(gen_num)
            logger.info('Recovered snapshot '+str(gen_num)+', pop with ' + str(len(population.individuals))+' individuals')

        if has_offspring:
            individuals = await population.load_offspring(gen_num, population_size, offspring_size, next_robot_id)
            gen_num += 1
            logger.info('Recovered unfinished offspring '+str(gen_num))

            if gen_num == 0:
                await population.init_pop(individuals)
            else:
                population = await population.next_gen(gen_num, individuals)

            experiment_management.export_snapshots(population.individuals, gen_num)
    else:
        # starting a new experiment
        experiment_management.create_exp_folders()
        await population.init_pop()
        experiment_management.export_snapshots(population.individuals, gen_num)

    while gen_num < num_generations-1:
        gen_num += 1
        population = await population.next_gen(gen_num)
        experiment_management.export_snapshots(population.individuals, gen_num)
Exemplo n.º 6
0
async def run():
    """
    The main coroutine, which is started below.
    """

    # experiment params #
    num_generations = 100
    population_size = 100
    offspring_size = 50
    front = 'slaves'

    # environment world and z-start
    environments = {'plane': 0.03, 'tilted5': 0.1}

    genotype_conf = PlasticodingConfig(
        max_structural_modules=15,
        plastic=True,
    )

    mutation_conf = MutationConfig(
        mutation_prob=0.8,
        genotype_conf=genotype_conf,
    )

    crossover_conf = CrossoverConfig(crossover_prob=0.8, )
    # experiment params #load_individual

    # Parse command line / file input arguments
    settings = parser.parse_args()
    experiment_management = ExperimentManagement(settings, environments)
    do_recovery = settings.recovery_enabled and not experiment_management.experiment_is_new(
    )

    logger.info('Activated run ' + settings.run + ' of experiment ' +
                settings.experiment_name)

    def fitness_function(robot_manager, robot):
        #contacts = measures.contacts(robot_manager, robot)
        #assert(contacts != 0)
        return fitness.displacement_velocity_hill(robot_manager, robot, False)

    population_conf = PopulationConfig(
        population_size=population_size,
        genotype_constructor=random_initialization,
        genotype_conf=genotype_conf,
        fitness_function=fitness_function,
        mutation_operator=standard_mutation,
        mutation_conf=mutation_conf,
        crossover_operator=standard_crossover,
        crossover_conf=crossover_conf,
        selection=lambda individuals: tournament_selection(
            individuals, environments, 2),
        parent_selection=lambda individuals: multiple_selection(
            individuals, 2, tournament_selection, environments),
        population_management=steady_state_population_management,
        population_management_selector=tournament_selection,
        evaluation_time=settings.evaluation_time,
        offspring_size=offspring_size,
        experiment_name=settings.experiment_name,
        experiment_management=experiment_management,
        environments=environments,
        front=front)

    settings = parser.parse_args()

    simulator_queue = {}
    analyzer_queue = None

    previous_port = None
    for environment in environments:

        settings.world = environment
        settings.z_start = environments[environment]

        if previous_port is None:
            port = settings.port_start
            previous_port = port
        else:
            port = previous_port + settings.n_cores
            previous_port = port

        simulator_queue[environment] = SimulatorQueue(settings.n_cores,
                                                      settings, port)
        await simulator_queue[environment].start()

    analyzer_queue = AnalyzerQueue(1, settings, port + settings.n_cores)
    await analyzer_queue.start()

    population = Population(population_conf, simulator_queue, analyzer_queue,
                            1)

    # choose a snapshot here. and the maximum best individuals you wish to watch
    generation = 61  #99
    max_best = 3  #10
    await population.load_snapshot(generation)

    values = []
    for ind in population.individuals:
        # define a criteria here
        for environment in environments:
            ind[environment].evaluated = False
        values.append(ind[list(environments.keys())[-1]].consolidated_fitness)
        #values.append(ind['plane'].phenotype._behavioural_measurements.displacement_velocity_hill)

    values = np.array(values)

    ini = len(population.individuals) - max_best
    fin = len(population.individuals)

    population.individuals = np.array(population.individuals)
    # highest
    population.individuals = population.individuals[np.argsort(values)
                                                    [ini:fin]]
    # lowest
    #population.individuals = population.individuals[np.argsort(values)[0:max_best]]

    for ind in population.individuals:
        print(ind[list(environments.keys())[-1]].phenotype.id)
        print('consolidated_fitness',
              ind[list(environments.keys())[-1]].consolidated_fitness)

    for environment in environments:
        print(environment)
        await population.evaluate(new_individuals=population.individuals,
                                  gen_num=generation,
                                  environment=environment,
                                  type_simulation='watch')