Example #1
0
    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")