Esempio n. 1
0
 def simplex_init_new_generation(self, gen):         
     '''It will run the simplex method every simplex_interval
          generation with a fracitonal step given by simple_step 
          on the simplex_n*n_pop best individuals.
     '''
     print 'Inits new generation'
     if gen%self.simplex_interval == 0:
         spread = array(self.trial_vec).max(0) - array(self.trial_vec).min(0)
         
         indices = argsort(self.fom_vec)
         n_ind = int(self.n_pop*self.simplex_n)
         if n_ind == 0:
             n_ind = 1
         # Apply the simplex to a simplex_n memebers (0-1)
         for index1 in indices[:n_ind]:
             self.text_output('Starting simplex run for member: %d'%index1)
             mem = self.pop_vec[index1].copy()
             mem_fom = self.fom_vec[index1]
             simp = Simplex(self.calc_fom, mem, spread*self.simplex_step)
             new_vec, err, iter = simp.minimize(epsilon = self.best_fom/self.simplex_rel_epsilon, maxiters = self.simplex_max_iter)
             if self.use_boundaries:
                 # Check so that the parameters lie indside the bounds
                 ok = bitwise_and(self.par_max > new_vec, self.par_min < new_vec)
                 # If not inside make a random re-initilazation of that parameter
                 new_vec = where(ok, new_vec, random.rand(self.n_dim)*\
                                 (self.par_max - self.par_min) + self.par_min)
             
             new_fom = self.calc_fom(new_vec)
             if new_fom < mem_fom:
                 self.pop_vec[index1] = new_vec.copy()
                 self.fom_vec[index1] = new_fom
                 if new_fom < self.best_fom:
                     self.best_fom = new_fom
                     self.best_vec = new_vec.copy()
                     self.new_best = True
Esempio n. 2
0
 def simplex_old_init_new_generation(self, gen):         
     '''It will run the simplex method every simplex_interval
          generation with a fracitonal step given by simple_step 
          on the best indivual as well a random fraction of simplex_n individuals.
     '''
     print 'Inits new generation'
     if gen%self.simplex_interval == 0:
         spread = array(self.trial_vec).max(0) - array(self.trial_vec).min(0)
         simp = Simplex(self.calc_fom, self.best_vec, spread*self.simplex_step)
         print 'Starting simplex run for best vec'
         new_vec, err, iter = simp.minimize(epsilon = self.best_fom/self.simplex_rel_epsilon, maxiters = self.simplex_max_iter)
         print 'FOM improvement: ', self.best_fom - err
         
         if self.use_boundaries:
             # Check so that the parameters lie indside the bounds
             ok = bitwise_and(self.par_max > new_vec, self.par_min < new_vec)
             # If not inside make a random re-initilazation of that parameter
             new_vec = where(ok, new_vec, random.rand(self.n_dim)*\
                           (self.par_max - self.par_min) + self.par_min)
             
         new_fom = self.calc_fom(new_vec)
         if new_fom < self.best_fom:
             self.best_fom = new_fom
             self.best_vec = new_vec
             self.pop_vec[0] = new_vec
             self.fom_vec[0] = self.best_fom
             self.new_best = True
         
         # Apply the simplex to a simplex_n memebers (0-1)
         for index1 in random_mod.sample(xrange(len(self.pop_vec)), 
                                int(len(self.pop_vec)*self.simplex_n)):
             print 'Starting simplex run for member: ', index1
             mem = self.pop_vec[index1]
             mem_fom = self.fom_vec[index1]
             simp = Simplex(self.calc_fom, mem, spread*self.simplex_step)
             new_vec, err, iter = simp.minimize(epsilon = self.best_fom/self.simplex_rel_epsilon, maxiters = self.simplex_max_iter)
             if self.use_boundaries:
                 # Check so that the parameters lie indside the bounds
                 ok = bitwise_and(self.par_max > new_vec, self.par_min < new_vec)
                 # If not inside make a random re-initilazation of that parameter
                 new_vec = where(ok, new_vec, random.rand(self.n_dim)*\
                                 (self.par_max - self.par_min) + self.par_min)
             
             new_fom = self.calc_fom(new_vec)
             if new_fom < mem_fom:
                 self.pop_vec[index1] = new_vec
                 self.fom_vec[index1] = new_fom
                 if new_fom < self.best_fom:
                     self.best_fom = new_fom
                     self.best_vec = new_vec
                     self.new_best = True