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
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