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, )
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)
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)
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)) else: os.makedirs(base_dirpath)
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)
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')