From 522edfe38e969f22792e504b74bcf17899ce803a Mon Sep 17 00:00:00 2001 From: pmaas <philip.maas@stud.hs-bochum.de> Date: Wed, 2 Mar 2022 22:02:05 +0100 Subject: [PATCH] Various small QoL changes --- EvolutionStrategies/main.py | 16 +++++++++------- EvolutionStrategies/population.py | 2 +- MutateActions/5_50_50_0.2.png | Bin 0 -> 22864 bytes MutateActions/main.py | 24 +++++++++++++++++------- MutateActions/population.py | 8 +------- 5 files changed, 28 insertions(+), 22 deletions(-) create mode 100644 MutateActions/5_50_50_0.2.png diff --git a/EvolutionStrategies/main.py b/EvolutionStrategies/main.py index aa9e09f..d8c8a50 100644 --- a/EvolutionStrategies/main.py +++ b/EvolutionStrategies/main.py @@ -4,14 +4,14 @@ import matplotlib.pyplot as plt import pickle import sys -HIDDEN_LAYER = 2 -BIAS = True +HIDDEN_LAYER = 12 +BIAS = False POP_SIZE = 50 MUTATION_FACTOR = 0.1 # 0 <= x <= 1 LEARNING_RATE = 0.03 # 0 <= x <= 1 GENS = 7000 -MAX_STEPS = 200 # after 1600 steps the Environment gives us a done anyway. - +MAX_STEPS = 300 # after 1600 steps the Environment gives us a done anyway. +DECAY_ALPHA = True VERSION = 1 TEST_WALKER = True @@ -58,10 +58,12 @@ if __name__ == '__main__': population.walker.save_mlp_weights(gen) with open(f'./models/{HIDDEN_LAYER}_{VERSION}_{POP_SIZE}_{LEARNING_RATE}_AvgRewards', 'wb') as fp: pickle.dump(avg_rewards, fp) - if gen == 1000: + if gen == 1000 and DECAY_ALPHA: population.lr = 0.01 - #if gen == 5000: - #population.lr = 0.005 + population.mutation_factor = 0.05 + if gen == 5000 and DECAY_ALPHA: + population.lr = 0.005 + population.mutation_factor = 0.01 plot_reward(avg_rewards) except KeyboardInterrupt: diff --git a/EvolutionStrategies/population.py b/EvolutionStrategies/population.py index 0c48247..4966214 100644 --- a/EvolutionStrategies/population.py +++ b/EvolutionStrategies/population.py @@ -14,7 +14,7 @@ class Population: self.version = version self.max_steps = max_steps self.render_best = render_best - self.env = gym.make('Pendulum-v1') # MountainCarContinuous-v0 LunarLanderContinuous-v2 Pendulum-v1 CarRacing-v0 + self.env = gym.make('BipedalWalker-v3') # MountainCarContinuous-v0 LunarLanderContinuous-v2 Pendulum-v1 CarRacing-v0 self.walker = Walker(hidden_layer, bias, version, load_brain, self.env) self.mutated_weights = dict() self.mutants = [] diff --git a/MutateActions/5_50_50_0.2.png b/MutateActions/5_50_50_0.2.png new file mode 100644 index 0000000000000000000000000000000000000000..3494bfc4d920e956b26d8388edc6fc4b7a98dee5 GIT binary patch literal 22864 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 ancMihj;?pijbUJ5VDNPHb6Mw<&;$S`wZvio literal 0 HcmV?d00001 diff --git a/MutateActions/main.py b/MutateActions/main.py index b81ae78..a8d4fe7 100644 --- a/MutateActions/main.py +++ b/MutateActions/main.py @@ -1,7 +1,7 @@ from population import Population -import time import matplotlib.pyplot as plt import pickle +import sys INCREASE_BY = 5 BRAIN_SIZE = 50 @@ -17,24 +17,33 @@ if TEST_WALKER: if __name__ == '__main__': - population = Population(POP_SIZE, BRAIN_SIZE,MUTATION_FACTOR, LOAD_BRAIN, RENDER_BEST) - - rewards = [] - if TEST_WALKER: rewards = [] + steps = [] with open('rewards.p', 'rb') as fp: rewards = pickle.load(fp) + with open('steps.p', 'rb') as fp: + steps = pickle.load(fp) plt.title(f'{POP_SIZE}, {MUTATION_FACTOR}') plt.xlabel('Episodes') plt.ylabel('Rewards') plt.plot(rewards) + plt.plot(steps) plt.savefig(f'./models/{POP_SIZE}, {MUTATION_FACTOR}.png') plt.show() + sys.exit(0) + + population = Population(POP_SIZE, BRAIN_SIZE,MUTATION_FACTOR, LOAD_BRAIN, RENDER_BEST) + + rewards = [] + steps = [] - while GAME_CANCELLED is False: # this is our game + while population.gen < 2000: # this is our game if population.all_players_finished(): # this is our genetic algorithm after one generation of players + rewards.append(population.walkers[0].fitness) + steps.append(len(population.walkers[0].brain.directions)) + print(f'Best Fitness: {population.walkers[0].fitness}') population.natural_selection() population.mutate_babies() population.increase_moves(INCREASE_BY) @@ -45,11 +54,12 @@ if __name__ == '__main__': print(f'Best Fitness: {population.fitnesses[population.best_walker_index]}') print(f'Max Steps: {population.max_steps}') - rewards.append(population.fitnesses[population.best_walker_index]) if population.gen % 10 == 0: with open("rewards.p", 'wb') as fp: pickle.dump(rewards, fp) + with open("steps.p", 'wb') as fp: + pickle.dump(steps, fp) else: population.update() # time.sleep(0.1) diff --git a/MutateActions/population.py b/MutateActions/population.py index f51dcff..4f62c2c 100644 --- a/MutateActions/population.py +++ b/MutateActions/population.py @@ -39,16 +39,12 @@ class Population: else: walker.update() - """def calculate_fitness(self): # calculate the fitness of all players - for walker in self.walkers: - walker.calculate_fitness()""" - def calculate_fitness_sum(self): self.fitness_sum = 0 self.fitnesses = np.zeros(self.size) for i in range(self.size): self.fitnesses[i] = self.walkers[i].fitness - self.fitnesses -= np.min(self.fitnesses) # maybe offset: +1 + self.fitnesses -= np.min(self.fitnesses) self.fitness_sum = np.sum(self.fitnesses) def all_players_finished(self): # returns whether all the players are either dead or have reached the goal @@ -58,8 +54,6 @@ class Population: return True def natural_selection(self): # gets the next generation of players - #for i in range(self.size): - #new_walkers.append(Walker(self.envs[i], self.brain_size)) self.calculate_fitness_sum() self.set_best_walker() self.walkers[self.best_walker_index].brain.save() -- GitLab