def start_ga(self): """ Функция, запускающая оптимизацию с помощью генетического алгоритма """ ga = GA() # Принимаем первым родителем тестируемый интерфейс, вторым - его мутированную версию other_parent = copy.deepcopy(self.garnet_blocks.optimized_tree) ga.mutation(other_parent, MUTATE_CHANCE) # Выполняем скрещивание выбранных родителей и получаем 3 новых варианта three_parents = ga.crossing_over(self.garnet_blocks.optimized_tree, other_parent) # Сохраняем изображения на диск, если требуется heatmap_number = 1 if SAVE_HEATMAP: self.save_generation_heatmaps(three_parents, heatmap_number) heatmap_number += 1 # Получаем 3 новых варианта дочерних деревьев из 3-х с помощью ГА new_parents = ga.evolution( three_parents, self.garnet_blocks.optimized_scale_x, self.garnet_blocks.optimized_scale_y, self.garnet_blocks.ui.optimizedView.width(), self.garnet_blocks.ui.optimizedView.height(), self.garnet_blocks.destination_heatmap, heatmap_number) if SAVE_HEATMAP: self.save_generation_heatmaps(new_parents, heatmap_number) heatmap_number += 1 self.garnet_blocks.optimized_tree = new_parents[0] self.garnet_blocks.events.generation_completed.emit("ga") # Продолжаем эволюцию, пока не выполнится одно из условий окончиния: # 1. Превышено максимальное количество итераций # 2. Превышено максимальное количество итераций, в течение которых результат не улучшился # 3. Найден результат с допустимым значением фитнесс-функции while self.garnet_blocks.count_iterations < MAX_COUNT_ITERATIONS and \ self.garnet_blocks.count_useless_iterations < MAX_COUNT_USELESS_ITERATIONS and \ self.garnet_blocks.best_ff_value > MAX_FF_DIFFERENCE: # Получаем 3 новых варианта дочерних деревьев из 3-х с помощью ГА new_parents = ga.evolution( three_parents, self.garnet_blocks.optimized_scale_x, self.garnet_blocks.optimized_scale_y, self.garnet_blocks.ui.optimizedView.width(), self.garnet_blocks.ui.optimizedView.height(), self.garnet_blocks.destination_heatmap, heatmap_number) if SAVE_HEATMAP: self.save_generation_heatmaps(new_parents, heatmap_number) heatmap_number += 1 self.garnet_blocks.optimized_tree = new_parents[0] self.garnet_blocks.events.generation_completed.emit("ga") # Показываем лучший из найденных self.garnet_blocks.optimized_tree = copy.deepcopy( self.garnet_blocks.best_tree) self.garnet_blocks.events.generation_completed.emit("ga")
for i, gene in enumerate(g.population): if scores[i] < b_fitness: b_fitness = scores[i] b_gene = gene children = [] for i in range(g.n_pop / 2): p1 = g.t_selection(scores) p2 = g.t_selection(scores) ch1, ch2 = g.u_crossover(g.population[p1], g.population[p1]) children.append(g.mutation(ch1)) children.append(g.mutation(ch2)) g.population = children print "f1(x) = %f" % b_fitness # TEST NUM. 2 -- f2(x1, x2) g = GA(n_gen, n_pop, p_mut, p_xover, l_dna * 2) b_gene = "" b_fitness = 999999 g.init_population()