from deap import base from deap import creator from deap import tools import random import numpy import mountain_car import elitism # Genetic Algorithm constants: POPULATION_SIZE = 100 P_CROSSOVER = 0.9 # probability for crossover P_MUTATION = 0.5 # probability for mutating an individual MAX_GENERATIONS = 80 HALL_OF_FAME_SIZE = 20 # set the random seed: RANDOM_SEED = 42 random.seed(RANDOM_SEED) # create the Zoo test class: car = mountain_car.MountainCar(RANDOM_SEED) toolbox = base.Toolbox() # define a single objective, minimizing fitness strategy: creator.create("FitnessMin", base.Fitness, weights=(-1.0,)) # create the Individual class based on list: creator.create("Individual", list, fitness=creator.FitnessMin) # create an operator that randomly returns 0, 1 or 2: toolbox.register("zeroOneOrTwo", random.randint, 0, 2) # create an operator that generates a list of individuals: toolbox.register("individualCreator", tools.initRepeat, creator.Individual, toolbox.zeroOneOrTwo, len(car)) # create the population operator to generate a list of individuals: toolbox.register("populationCreator", tools.initRepeat, list, toolbox.individualCreator) # fitness calculation def getCarScore(individual): return car.getScore(individual), # return a tuple toolbox.register("evaluate", getCarScore) # genetic operators for binary list: toolbox.register("select", tools.selTournament, tournsize=2) toolbox.register("mate", tools.cxTwoPoint) toolbox.register("mutate", tools.mutUniformInt, low=0, up=2, indpb=1.0/len(car)) # Genetic Algorithm flow: def main(): # create initial population (generation 0): population = toolbox.populationCreator(n=POPULATION_SIZE) # prepare the statistics object: stats = tools.Statistics(lambda ind: ind.fitness.values) stats.register("min", numpy.min) stats.register("avg", numpy.mean) # define the hall-of-fame object: hof = tools.HallOfFame(HALL_OF_FAME_SIZE) # perform the Genetic Algorithm flow with hof feature added: population, logbook = elitism.eaSimpleWithElitism(population, toolbox, cxpb=P_CROSSOVER, mutpb=P_MUTATION, ngen=MAX_GENERATIONS, stats=stats, halloffame=hof, verbose=True) # print best solution: best = hof.items[0] print() print("Best Solution = ", best) print("Best Fitness = ", best.fitness.values[0]) # save best solution for a replay: car.saveActions(best) if __name__ == "__main__": main()