def gen_conf4():
    param_values = deepcopy(default_param_values)
    brkga_params = param_values["params"]

    chromosome_size = 500
    instance = Instance(chromosome_size)

    brkga_params.population_size = 100
    brkga_params.elite_percentage = 0.35
    brkga_params.mutants_percentage = 0.15
    brkga_params.num_elite_parents = 1
    brkga_params.total_parents = 2
    brkga_params.bias_type = BiasFunctionType.EXPONENTIAL
    brkga_params.num_independent_populations = 3
    brkga_params.pr_number_pairs = 0
    brkga_params.pr_minimum_distance = 0.0
    brkga_params.pr_type = PathRelinkingType.DIRECT
    brkga_params.pr_selection = PathRelinkingSelection.BESTSOLUTION
    brkga_params.alpha_block_size = 1.0
    brkga_params.pr_percentage = 1.0

    param_values["decoder"] = SumDecode(instance)
    param_values["sense"] = Sense.MINIMIZE
    param_values["seed"] = 2947804214761
    param_values["chromosome_size"] = chromosome_size
    param_values["evolutionary_mechanism_on"] = True

    print("\n> Building configuration 4")
    brkga = BrkgaMpIpr(**param_values)
    brkga.initialize()

    rho = 0.75
    brkga.set_bias_custom_function(lambda x: rho if x == 1 else 1.0 - rho)

    print("> Writing configuration 4")
    with open(os.path.join(STATE_DIR, "state4.pickle"), "wb") as hd:
        pickle.dump(brkga, hd)

    print("> Evolving population 0...")
    brkga.evolve_population(0)
    fitness1 = brkga.get_best_fitness()
    chromosome1 = brkga.get_best_chromosome()

    print("> Evolving population 1...")
    brkga.evolve_population(1)
    fitness2 = brkga.get_best_fitness()
    chromosome2 = brkga.get_best_chromosome()

    print("> Evolving population 2...")
    brkga.evolve_population(2)
    fitness3 = brkga.get_best_fitness()
    chromosome3 = brkga.get_best_chromosome()

    print("> Evolving both populations for 100 generations...")
    for _ in range(100):
        start_time = time()
        brkga.evolve_population(0)
        brkga.evolve_population(1)
        brkga.evolve_population(2)
        print(f"Elapsed time: {time() - start_time :.2f}")

    fitness103 = brkga.get_best_fitness()
    chromosome103 = brkga.get_best_chromosome()

    with open(os.path.join(SOLUTION_DIR, "best_solution4.pickle"), "wb") as hd:
        pickle.dump(
            {
                "fitness1": fitness1,
                "chromosome1": chromosome1,
                "fitness2": fitness2,
                "chromosome2": chromosome2,
                "fitness3": fitness2,
                "chromosome3": chromosome2,
                "fitness103": fitness103,
                "chromosome103": chromosome103,
            },
            hd
        )
Ejemplo n.º 2
0
    def test_set_bias_custom_function(self):
        """
        Tests set_bias_custom_function() method.
        """

        param_values = deepcopy(self.default_param_values)
        param_values["params"].population_size = 100
        param_values["params"].total_parents = 10
        brkga = BrkgaMpIpr(**param_values)

        # After build, brkga_params function is never CUSTOM
        self.assertNotEqual(brkga.params.bias_type, BiasFunctionType.CUSTOM)

        with self.assertRaises(ValueError) as context:
            brkga.set_bias_custom_function(lambda x: -x)
        self.assertEqual(
            str(context.exception).strip(),
            "Bias function must be positive non-increasing")

        with self.assertRaises(ValueError) as context:
            brkga.set_bias_custom_function(lambda x: x)
        self.assertEqual(
            str(context.exception).strip(),
            "Bias function is not a non-increasing function")

        with self.assertRaises(ValueError) as context:
            brkga.set_bias_custom_function(lambda x: x + 1)
        self.assertEqual(
            str(context.exception).strip(),
            "Bias function is not a non-increasing function")

        with self.assertRaises(ValueError) as context:
            brkga.set_bias_custom_function(lambda x: math.log1p(x))
        self.assertEqual(
            str(context.exception).strip(),
            "Bias function is not a non-increasing function")

        brkga.set_bias_custom_function(lambda x: 1.0 / math.log1p(x))
        self.assertAlmostEqual(brkga._total_bias_weight, 6.554970525044798)

        # After 2nd call to set_bias_custom_function, brkga_params function
        # is always CUSTOM
        self.assertEqual(brkga.params.bias_type, BiasFunctionType.CUSTOM)

        brkga.set_bias_custom_function(lambda x: 1.0 / x)
        self.assertAlmostEqual(brkga._total_bias_weight, 2.9289682539682538)
        self.assertEqual(brkga.params.bias_type, BiasFunctionType.CUSTOM)

        brkga.set_bias_custom_function(lambda x: x**-2.0)
        self.assertAlmostEqual(brkga._total_bias_weight, 1.5497677311665408)
        self.assertEqual(brkga.params.bias_type, BiasFunctionType.CUSTOM)

        brkga.set_bias_custom_function(lambda x: x**-3.0)
        self.assertAlmostEqual(brkga._total_bias_weight, 1.197531985674193)
        self.assertEqual(brkga.params.bias_type, BiasFunctionType.CUSTOM)

        brkga.set_bias_custom_function(lambda x: math.exp(-x))
        self.assertAlmostEqual(brkga._total_bias_weight, 0.5819502851677112)
        self.assertEqual(brkga.params.bias_type, BiasFunctionType.CUSTOM)

        # This is a constance function.
        brkga.set_bias_custom_function(
            lambda _: 1.0 / brkga.params.total_parents)
        self.assertAlmostEqual(brkga._total_bias_weight, 0.9999999999999999)
        self.assertEqual(brkga.params.bias_type, BiasFunctionType.CUSTOM)

        brkga.set_bias_custom_function(lambda x: 0.6325 / math.sqrt(x))
        self.assertAlmostEqual(brkga._total_bias_weight, 3.175781171302612)
        self.assertEqual(brkga.params.bias_type, BiasFunctionType.CUSTOM)

        #############################################
        # Constant functions test for standard BRKGA
        #############################################

        param_values = deepcopy(self.default_param_values)
        param_values["params"].num_elite_parents = 1
        param_values["params"].total_parents = 2
        brkga = BrkgaMpIpr(**param_values)

        rho = 0.5
        brkga.set_bias_custom_function(lambda x: rho if x == 1 else 1.0 - rho)
        self.assertAlmostEqual(brkga._total_bias_weight, 1.0)
        self.assertAlmostEqual(brkga._bias_function(1), 0.5)
        self.assertAlmostEqual(brkga._bias_function(2), 0.5)

        rho = 0.75
        brkga.set_bias_custom_function(lambda x: rho if x == 1 else 1.0 - rho)
        self.assertAlmostEqual(brkga._total_bias_weight, 1.0)
        self.assertAlmostEqual(brkga._bias_function(1), 0.75)
        self.assertAlmostEqual(brkga._bias_function(2), 0.25)

        rho = 0.9
        brkga.set_bias_custom_function(lambda x: rho if x == 1 else 1.0 - rho)
        self.assertAlmostEqual(brkga._total_bias_weight, 1.0)
        self.assertAlmostEqual(brkga._bias_function(1), 0.9)
        self.assertAlmostEqual(brkga._bias_function(2), 0.1)