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