set_raw_score(a, -get_mixing_energy(a)) db.add_relaxed_step(a) pop.update() # Below is the iterative part of the algorithm gen_num = db.get_generation_number() for i in range(num_gens): print('Creating and evaluating generation {0}'.format(gen_num + i)) new_generation = [] for _ in range(pop_size): # Select parents for a new candidate parents = pop.get_two_candidates() # Select an operator and use it op = operation_selector.get_operator() offspring, desc = op.get_new_individual(parents) # An operator could return None if an offspring cannot be formed # by the chosen parents if offspring is None: continue set_raw_score(offspring, -get_mixing_energy(offspring)) new_generation.append(offspring) # We add a full relaxed generation at once, this is faster than adding # one at a time db.add_more_relaxed_candidates(new_generation) # update the population to allow new candidates to enter pop.update()