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