def genetic_probing(data, seed): random.seed(seed) optimizer = ga.GeneticOptimizer(TSPEvaluator(data), 1000, max_fitness=BEST_OVERALL) optimizer.reset_fitness(-1e99) # required for searching for shortest path optimizer.max_stagnation = 300 optimizer.selection = ga.RankBasedSelection() optimizer.mate = ga.MateOrderedCX() optimizer.crossover_rate = 0.9 optimizer.mutation = ga.ScrambleMutate(5) optimizer.mutation_rate = 0.1 # count >= elitism, stores the <count> overall best solutions optimizer.hall_of_fame.count = ELITISM # preserve <elitism> overall best solutions in each generation optimizer.elitism = ELITISM optimizer.add_candidates(ga.UniqueIntDNA.n_random(300, length=len(data))) optimizer.execute(feedback, 2) print( f"GeneticOptimizer: {optimizer.generation} generations x {optimizer.count} " f"DNA strands, best result:") evaluator = cast(TSPEvaluator, optimizer.evaluator) best_dist = abs(evaluator.evaluate(optimizer.best_dna)) percent = best_dist / abs(BEST_OVERALL) * 100 print(f"Shortest path overall: {abs(BEST_OVERALL):.3f}") print( f"Shortest path found (seed={seed}): {best_dist:.3f} ({percent:.1f}%)") print(optimizer.best_dna) name = f"bay29, dist={int(best_dist)} ({percent:.1f}%), seed={seed}" show_log(optimizer.log, name) show_result(data, optimizer.best_dna, name)
def make_subset_optimizer(packer: bp.AbstractPacker, generations: int, dna_count: int): evaluator = bp.SubSetEvaluator(packer) optimizer = ga.GeneticOptimizer(evaluator, max_generations=generations) optimizer.name = "pack item subset" optimizer.add_candidates(ga.BitDNA.n_random(dna_count, len(packer.items))) return optimizer
def test_can_only_run_once(self, packer): evaluator = DummyEvaluator(packer) optimizer = ga.GeneticOptimizer(evaluator, 100) optimizer.execute() assert optimizer.is_executed is True with pytest.raises(TypeError): optimizer.execute()
def test_execution(self, packer): packer.add_bin(*MEDIUM_BOX) evaluator = DummyEvaluator(packer) optimizer = ga.GeneticOptimizer(evaluator, 10) optimizer.add_candidates(ga.BitDNA.n_random(20, len(packer.items))) optimizer.execute() assert optimizer.generation == 10 assert optimizer.best_fitness > 0.1 # Get best packer of SubSetEvaluator: best_packer = evaluator.run_packer(optimizer.best_dna) assert len(best_packer.bins[0].items) > 1
def run_optimizer(packer): def feedback(optimizer: ga.GeneticOptimizer): print(f"gen: {optimizer.generation:4}, " f"stag: {optimizer.stagnation:4}, " f"fitness: {optimizer.best_fitness:.3f}") return False evaluator = bp.SubSetEvaluator(packer) optimizer = ga.GeneticOptimizer(evaluator, max_generations=GENERATIONS) optimizer.name = "pack item subset" optimizer.crossover_rate = 0.9 optimizer.mutation_rate = 0.01 optimizer.add_candidates(ga.BitDNA.n_random(DNA_COUNT, len(packer.items))) print( f"\nGenetic algorithm search: {optimizer.name}\n" f"max generations={optimizer.max_generations}, DNA count={optimizer.count}" ) optimizer.execute(feedback, interval=3) print( f"GeneticOptimizer: {optimizer.generation} generations x {optimizer.count} " f"candidates, best result:") evaluator = cast(bp.SubSetEvaluator, optimizer.evaluator) best_packer = evaluator.run_packer(optimizer.best_dna) return best_packer
def test_init_invalid_max_runs(self, packer): with pytest.raises(ValueError): ga.GeneticOptimizer(packer, 0)
def test_init(self, packer): driver = ga.GeneticOptimizer(packer, 100) assert driver.is_executed is False