song.crossover_chance = get_crossover_prob(song.score, total_score) song.mutation_chance = get_mutation_prob(song.crossover_chance) else: with open(save_file, 'w+') as save: for song in song_list: save.write(str(song) + '\n') raise SystemExit song_list = BiasedRandomSequence(*song_list, insert_key=lambda v: v.crossover_chance) new_song_list = [] for i in range(len(song_list)): song1, song2 = sample_pair(song_list) song3 = song1.crossover(song2, random_crossover_point(chromo_len, randomizer)) if song2.mutation_chance <= get_prob(randomizer): delta_mask = random_delta_mask(max_step_size, randomizer, song3) song3.mutate(*delta_mask) new_song_list.append(song3) song_list = new_song_list
get_population_sample(config_file, *pheno_list) logging.info("avg fitness: {}, max fitness: {}, min fitness: {}".format(get_avg(*score_list), max(score_list), min(score_list))) gen_num = get_gen_num(pheno_list[1], config_file) value_list = [get_avg(*score_list), max(score_list), min(score_list), get_avg(*diversity_list)] append_to_graph_file(config_file.graph_file, gen_num, *value_list) #pre-crossover setup new_pheno_list = [] top_pheno = find_min_pheno(pheno_list, config_file) new_pheno_list.append(top_pheno) pheno_list = BiasedRandomSequence(*pheno_list, insert_key=lambda v: v.crossover_chance) #crossover/mutation loop for i in range(get_pheno_count(config_file) - 1): #phenotype selection and crossover pheno1, pheno2 = sample_pair(pheno_list) c_over_point = randomizer.get_crossover_point(pheno1, pheno2) pheno3 = pheno1.crossover(pheno2, c_over_point) log_cross_over(pheno1, pheno2, c_over_point) #mutation phase if randomizer.get_prob() <= config_file.mutation_chance: if randomizer.get_prob() <= config_file.chromo_delete_prob and len(pheno3) > 1: pheno3 = delete_mutation(pheno3, randomizer) log_delete_mutation(pheno3) elif randomizer.get_prob() <= config_file.chromo_add_prob: pheno3 = add_mutation(pheno3, config_file) log_add_mutation(pheno3) else: pheno3 = mutation(pheno3, config_file) log_mutation(pheno3)