def initial_pop(self):
        print(f"{'=' * self.load_bar_len}\ncreating genesis population")

        return [
            Genome(i, self.network_params, self.mutation_scale,
                   self.w_mutation_rate, self.b_mutation_rate)
            for i in range(self.population_size)
        ]
    def initial_pop(self):
        if self.verbose:
            print('{0}\ncreating genisis population'.format(
                '=' * self.verbose_load_bar))

        genomes = []
        for i in range(self.population_size):
            genomes.append(
                Genome(i, self.network_params, self.mutation_scale,
                       self.w_mutation_rate, self.b_mutation_rate))

        return genomes
    def evolve(self):
        # genesis population
        self.gen += 1
        if self.gen == 1:
            return

        self.socket_reporter("genProgress", {"progress": 0})
        print(f"{'=' * self.load_bar_len}\ncreating population {self.gen}")

        # find fitness by normalizing score
        self.normalize_score()

        # find pool of genomes to breed and mutate
        parents_1 = self.pool_selection()
        parents_2 = self.pool_selection()
        children = []

        # create next generation
        for idx, (p1, p2) in enumerate(zip(parents_1, parents_2)):
            children.append(
                Genome(idx,
                       self.network_params,
                       self.mutation_scale,
                       self.w_mutation_rate,
                       self.b_mutation_rate,
                       parent_1=self.genomes[p1],
                       parent_2=self.genomes[p2]
                       if np.random.random() < self.breeding_ratio else None))

        progress = int((idx + 1) / len(parents_1) * self.load_bar_len)
        progress_left = self.load_bar_len - progress
        print('[{0}>{1}]'.format('=' * progress, ' ' * progress_left),
              end='\r')
        print(' ' * (self.load_bar_len + 3), end='\r')

        self.genomes = children

        # mutation scale will decay over time
        self.mutation_scale *= self.mutation_decay
Exemple #4
0
    def evolve(self, g):
        # genisis population
        if g == 0:
            return

        if self.verbose:
            print('{0}\ncreating population {1}'.format('='*self.verbose_load_bar, g+1))

        # find fitness by normalizing score
        self.normalize_score()

        # find pool of genomes to breed and mutate
        parents_1 = self.pool_selection()
        parents_2 = self.pool_selection()
        children = []

        # evolving keras network
        if self.network_params['network'] == 'convolutional':
            # temporarily save models and clear session
            configs, weights = [], []
            for p1 in parents_1:
                configs.append(self.genomes[p1].model.prediction.to_json())
                weights.append(self.genomes[p1].model.prediction.get_weights())

            tf.keras.backend.clear_session()

            # reload models
            for idx, (config, weight) in enumerate(zip(configs, weights)):
                loaded = model_from_json(config)
                loaded.set_weights(weight)
                children.append(Genome(idx,
                                       self.network_params,
                                       self.mutation_scale,
                                       self.w_mutation_rate,
                                       self.b_mutation_rate,
                                       load_keras=loaded))
                if self.verbose:
                    progress = int((idx + 1)/len(parents_1) * self.verbose_load_bar)
                    progress_left = self.verbose_load_bar - progress
                    print('[{0}>{1}]'.format('=' * progress, ' ' * progress_left), end='\r')

        else:
            # create next generation
            for idx, (p1, p2) in enumerate(zip(parents_1, parents_2)):
                if np.random.random() < self.breeding_ratio:
                    # breeding
                    children.append(Genome(idx,
                                           self.network_params,
                                           self.mutation_scale,
                                           self.w_mutation_rate,
                                           self.b_mutation_rate,
                                           parent_1=self.genomes[p1],
                                           parent_2=self.genomes[p2]))
                else:
                    # mutating
                    children.append(Genome(idx,
                                           self.network_params,
                                           self.mutation_scale,
                                           self.w_mutation_rate,
                                           self.b_mutation_rate,
                                           parent_1=self.genomes[p1]))

                if self.verbose:
                    progress = int((idx + 1)/len(parents_1) * self.verbose_load_bar)
                    progress_left = self.verbose_load_bar - progress
                    print('[{0}>{1}]'.format('=' * progress, ' ' * progress_left), end='\r')

        if self.verbose: print(' ' * (self.verbose_load_bar + 3), end='\r')
        self.genomes = children

        # mutation scale will decay over time
        self.mutation_scale *= self.mutation_decay