def make_children(self, parent_one, parent_two, num_children):#{{{ children = [] for child in range(num_children): successful = False while not successful: child_members = [] member_pool = parent_one.teamMembers + parent_two.teamMembers while(len(child_members) < len(parent_one.teamMembers)): if(random.random() < mutation_rate): next_member_index = random.randrange(len(member_pool)) child_members.append(member_pool[next_member_index]) member_pool.remove(member_pool[next_member_index]) else: mutation_member_pool = hirepool.allmembers - child_members child_members.append( mutation_member_pool[random.randrange(len(mutation_member_pool))]) new_team = team(child_members) # if size of memberpool > size of parent_one members # AND matches from new_team to population.teamMembers or new_team.teamMembers # if size of memberpool > size of parent_one members AND ( #if population.teamMembers matches new_team.teamMembers anywhere OR #if children.teamMembers matches new_team.teamMembers anywhere) if len(member_pool) > len(parent_one.teamMembers) \ and (set(population.teamMembers) & set(new_team.teamMembers) \ or set(children.teamMembers) & set(new_team.teamMembers)): child -= 1 else: children.append(new_team) successful = True
def geneticAlgorithm(): # pareto_front = [] # base_mutation_rate = .05 global mut_rate mutation_rate = .05 global population population = [] team_size = 12 max_population_size = 200 tournament_size = 10 if team_size < len(hirepool.allmembers): for i in max_population_size: current_member_pool = hirepool.allmembers new_team_members = [] for j in team_size: new_member = current_member_pool[random.randrange(len(current_member_pool))] new_team_members.append(new_member) current_member_pool.remove(new_member) population.append(team(new_team_members)) else: raise Exception("Team size too big!") emergency_exit = 1000 last_change_in_avg = 0 avg_social = 0 avg_tech = 0 generation = 0 generation_to_log = 1 while generation + 1 < emergency_exit and last_change_in_avg < 10: set_total_fit() if len(population) > max_population_size: population = sorted(population, key=lambda x: x.total_fitness)GetRange(0, maxPopulationSize) def set_total_fit(): return def set_indv_fit(): return def set_dom_ranks(): return def make_children(self, parent_one, parent_two, num_children):#{{{ children = [] for child in range(num_children): successful = False while not successful: child_members = [] member_pool = parent_one.teamMembers + parent_two.teamMembers while(len(child_members) < len(parent_one.teamMembers)): if(random.random() < mutation_rate): next_member_index = random.randrange(len(member_pool)) child_members.append(member_pool[next_member_index]) member_pool.remove(member_pool[next_member_index]) else: mutation_member_pool = hirepool.allmembers - child_members child_members.append( mutation_member_pool[random.randrange(len(mutation_member_pool))]) new_team = team(child_members) # if size of memberpool > size of parent_one members # AND matches from new_team to population.teamMembers or new_team.teamMembers # if size of memberpool > size of parent_one members AND ( #if population.teamMembers matches new_team.teamMembers anywhere OR #if children.teamMembers matches new_team.teamMembers anywhere) if len(member_pool) > len(parent_one.teamMembers) \ and (set(population.teamMembers) & set(new_team.teamMembers) \ or set(children.teamMembers) & set(new_team.teamMembers)): child -= 1 else: children.append(new_team) successful = True return children#}}}