def main(): rng = NEAT.RNG() rng.TimeSeed() params = NEAT.Parameters() params.PopulationSize = 128 params.DynamicCompatibility = True params.WeightDiffCoeff = 1.0 params.CompatTreshold = 2.0 params.YoungAgeTreshold = 15 params.SpeciesMaxStagnation = 15 params.OldAgeTreshold = 35 params.MinSpecies = 5 params.MaxSpecies = 10 params.RouletteWheelSelection = False params.Elitism = True params.RecurrentProb = 0.5 params.OverallMutationRate = 0.2 params.MutateWeightsProb = 0.8 # params.MutateNeuronTimeConstantsProb = 0.1 # params.MutateNeuronBiasesProb = 0.1 params.WeightMutationMaxPower = 0.5 params.WeightReplacementMaxPower = 1.0 params.MutateWeightsSevereProb = 0.5 params.WeightMutationRate = 0.25 params.TimeConstantMutationMaxPower = 0.1 params.BiasMutationMaxPower = params.WeightMutationMaxPower params.MaxWeight = 8 params.MutateAddNeuronProb = 0.1 params.MutateAddLinkProb = 0.2 params.MutateRemLinkProb = 0.0 params.MutateActivationAProb = 0.0; params.ActivationAMutationMaxPower = 0.5; params.MinActivationA = 1.1 params.MaxActivationA = 6.9 params.MinNeuronTimeConstant = 0.04 params.MaxNeuronTimeConstant = 0.24 params.MinNeuronBias = -params.MaxWeight params.MaxNeuronBias = params.MaxWeight params.MutateNeuronActivationTypeProb = 0.0 params.ActivationFunction_SignedSigmoid_Prob = 0 params.ActivationFunction_UnsignedSigmoid_Prob = 0 params.ActivationFunction_Tanh_Prob = 1 params.ActivationFunction_TanhCubic_Prob = 0 params.ActivationFunction_SignedStep_Prob = 0 params.ActivationFunction_UnsignedStep_Prob = 0 params.ActivationFunction_SignedGauss_Prob = 0 params.ActivationFunction_UnsignedGauss_Prob = 0 params.ActivationFunction_Abs_Prob = 0 params.ActivationFunction_SignedSine_Prob = 0 params.ActivationFunction_UnsignedSine_Prob = 0 params.ActivationFunction_Linear_Prob = 0 params.CrossoverRate = 0.75 # mutate only 0.25 params.MultipointCrossoverRate = 0.4 params.SurvivalRate = 0.2 params.MutateNeuronTraitsProb = 0 params.MutateLinkTraitsProb = 0 trials = 5 generations = 10 g = NEAT.Genome( 0, 24 + 1 + 1, 0, 4, False, NEAT.ActivationFunction.TANH, NEAT.ActivationFunction.TANH, 0, params, 0, 1) pop = NEAT.Population(g, params, True, 1.0, rnd.randint(0, 1000)) hof = [] maxf_ever = 0 env = gym.make('BipedalWalker-v3') try: for generation in range(generations): fitnesses = [] #args = [x for x in NEAT.GetGenomeList(pop)] #dv.block=True #fitnesses = dv.map_sync(evaluate_genome, args) for _, genome in tqdm(enumerate(NEAT.GetGenomeList(pop))): fitness = evaluate_genome(env, genome, trials) fitnesses.append(fitness) for genome, fitness in zip(NEAT.GetGenomeList(pop), fitnesses): genome.SetFitness(fitness) maxf = max([x.GetFitness() for x in NEAT.GetGenomeList(pop)]) print('Generation: {}, max fitness: {}'.format(generation, maxf)) if maxf > maxf_ever: maxf_ever = maxf hof.append(pickle.dumps(pop.GetBestGenome())) pop.Epoch() except KeyboardInterrupt: pass print('Replaying forever..') if hof: while True: net = NEAT.NeuralNetwork() g = pickle.loads(hof[-1]) g.BuildPhenotype(net) do_trial(env, net, True)
import gym import time import MultiNEAT as NEAT import MultiNEAT.viz as viz import random as rnd import pickle import numpy as np import cv2 rng = NEAT.RNG() rng.TimeSeed() params = NEAT.Parameters() params.PopulationSize = 150 params.DynamicCompatibility = True params.WeightDiffCoeff = 1.0 params.CompatTreshold = 2.0 params.YoungAgeTreshold = 15 params.SpeciesMaxStagnation = 15 params.OldAgeTreshold = 35 params.MinSpecies = 2 params.MaxSpecies = 4 params.RouletteWheelSelection = False params.Elitism = True params.RecurrentProb = 0.15 params.OverallMutationRate = 0.2 params.MutateWeightsProb = 0.8 params.MutateNeuronTimeConstantsProb = 0.1
def main(): pygame.init() screen = pygame.display.set_mode((600, 600)) pygame.display.set_caption("NEAT volleyball") ### Physics stuff space = pm.Space() space.gravity = Vec2d(0.0, -500.0) # walls - the left-top-right walls body = pm.Body() walls= [pm.Segment(body, (50, 50), (50, 1550), 10) ,pm.Segment(body, (50, 1550), (560, 1550), 10) ,pm.Segment(body, (560, 1550), (560, 50), 10) ] floor = pm.Segment(body, (50, 50), (560, 50), 10) floor.friction = 1.0 floor.elasticity = 0.0 floor.collision_type = collision_type_floor for s in walls: s.friction = 0 s.elasticity = 0.99 s.collision_type = collision_type_wall space.add(walls) space.add(floor) params = NEAT.Parameters() params.PopulationSize = 250 params.DynamicCompatibility = True params.AllowClones = True params.CompatTreshold = 5.0 params.CompatTresholdModifier = 0.3 params.YoungAgeTreshold = 15 params.SpeciesMaxStagnation = 100 params.OldAgeTreshold = 35 params.MinSpecies = 3 params.MaxSpecies = 10 params.RouletteWheelSelection = True params.RecurrentProb = 0.25 params.OverallMutationRate = 0.33 params.MutateWeightsProb = 0.90 params.WeightMutationMaxPower = 1.0 params.WeightReplacementMaxPower = 5.0 params.MutateWeightsSevereProb = 0.5 params.WeightMutationRate = 0.75 params.MaxWeight = 20 params.MutateAddNeuronProb = 0.01 params.MutateAddLinkProb = 0.05 params.MutateRemLinkProb = 0.00 rng = NEAT.RNG() rng.TimeSeed() #rng.Seed(0) g = NEAT.Genome(0, 6, 0, 2, False, NEAT.ActivationFunction.TANH, NEAT.ActivationFunction.UNSIGNED_SIGMOID, 0, params) pop = NEAT.Population(g, params, True, 1.0) best_genome_ever = None fast_mode = False for generation in range(1000): print "Generation:", generation now = time.time() genome_list = [] for s in pop.Species: for i in s.Individuals: genome_list.append(i) print 'All individuals:', len(genome_list) for i, g in enumerate(genome_list): total_fitness = 0 for trial in range(20): f, fast_mode = evaluate(g, space, screen, fast_mode, rnd.randint(80, 400), rnd.randint(-200, 200), rnd.randint(80, 400)) total_fitness += f g.SetFitness(total_fitness / 20) print best = max([x.GetLeader().GetFitness() for x in pop.Species]) print 'Best fitness:', best, 'Species:', len(pop.Species) # Draw the best genome's phenotype net = NEAT.NeuralNetwork() best_genome_ever = pop.Species[0].GetLeader() best_genome_ever.BuildPhenotype(net) img = np.zeros((250, 250, 3), dtype=np.uint8) img += 10 NEAT.DrawPhenotype(img, (0, 0, 250, 250), net ) cv2.imshow("current best", img) cv2.waitKey(1) if best >= 10000: break # evolution is complete if an individual keeps the ball up for that many timesteps #if pop.GetStagnation() > 500: # break print "Evaluation took", time.time() - now, "seconds." print "Reproducing.." now = time.time() pop.Epoch() print "Reproduction took", time.time() - now, "seconds." # Show the best genome's performance forever pygame.display.set_caption("Best genome ever") while True: evaluate(best_genome_ever, space, screen, False, rnd.randint(80, 400), rnd.randint(-200, 200), rnd.randint(80, 400))