예제 #1
0
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)
예제 #2
0
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
예제 #3
0
 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()
예제 #4
0
    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
예제 #5
0
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
예제 #6
0
 def test_init_invalid_max_runs(self, packer):
     with pytest.raises(ValueError):
         ga.GeneticOptimizer(packer, 0)
예제 #7
0
 def test_init(self, packer):
     driver = ga.GeneticOptimizer(packer, 100)
     assert driver.is_executed is False