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