def evolve(world: World, population: Population): new_generation = Population(population.population_size, world.gene_length, False, []) elitism_number = population.population_size // 2 #Elitism for _ in range(elitism_number): fittest = population.getFittest() new_generation.addIndividual(fittest) population.removeIndividual(fittest) #Crossover for _ in range(elitism_number, population.population_size): parent1 = selection(new_generation, world) parent2 = selection(new_generation, world) child = crossover(parent1, parent2) child.setFitness( fitnessFN(world, child.path, world.startX, world.startY, world.foodCount)) new_generation.addIndividual(child) #Mutation for i in range(elitism_number, population.population_size): mutation(new_generation.individuals[i], world.mutation_rate) return new_generation
def run(args): startX = args.startx startY = args.starty foodCount = args.food_count world = World(args.world_size, args.startx, args.starty, args.food_count, args.mut_rate) #Generating the Population population = Population(args.population_size, world.gene_length, True, []) start_time = time.time() elapsed_time = 0 total_fitness = 0 max_fitness = 0 max_fitness_index = 0 i = 0 for individual in population.individuals: fit = fitnessFN(world, individual.path, startX, startY, foodCount) individual.setFitness(fit) total_fitness += fit if fit > max_fitness: max_fitness = fit max_fitness_index = i i += 1 best_individual = copy.copy(population.individuals[max_fitness_index]) avg_fitness = total_fitness / population.population_size total_generations = args.max_generation_number generation_counter = 0 while generation_counter < total_generations and best_individual.fitness < world.foodCount: print("Generation : ", generation_counter) print("Max fitness: ", best_individual.fitness) print("Average fitness: ", avg_fitness) population = evolve(world, population) new_best_individual = population.getFittest() avg_fitness = population.calculateAverageFitness() if new_best_individual.fitness > best_individual.fitness: generation_counter, best_individual = 0, new_best_individual else: generation_counter += 1 total_generations = 0 end_time = time.time() elapsed_time = end_time - start_time print("\n-------------------------------\nElapsed Time: ", elapsed_time, " sec") print("Population Size: ", args.population_size, " World Size: ", args.world_size, "\nStart x, y:", args.startx, ",", args.starty, " Food Count: ", args.food_count, "\nMutation Rate: ", args.mut_rate) print("Result: ", best_individual.toString()) matrix = traverse(best_individual.path, world) draw_matrix(matrix, 'title')