コード例 #1
0
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
コード例 #2
0
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')