예제 #1
0
    def test_return_an_ugraph(self):
        stpg = self.stpg

        initialization = GenerateBasedRandomWalk(stpg)
        tree = initialization()

        self.assertTrue(isinstance(tree, UGraph))
예제 #2
0
    def test_evaluation_cost(self):
        possibles = [f'steinb{ii}.txt' for ii in range(10, 19)]
        filename = choice(possibles)
        filename = path.join('datasets', 'ORLibrary', filename)
        stpg = ReaderORLibrary().parser(filename)

        generator = GenerateBasedRandomWalk(stpg)
        mutator = PrimBasedMutation(stpg)
        evaluator = EvaluateTreeGraph(stpg)

        before = generator()
        after = mutator(before)
        eval_cost, partitions = evaluator(after)

        self.assertEqual(partitions, 1)
        self.assertGreater(eval_cost, 0)

        subgraph = UWGraph()
        vertices = set(before.vertices)
        graph = stpg.graph

        for v in vertices:
            for u in graph.adjacent_to(v):
                if u in vertices:
                    subgraph.add_edge(v, u, weight=graph.weight(v, u))

        _, prim_cost = prim(subgraph, choice(tuple(stpg.terminals)))

        self.assertEqual(prim_cost, eval_cost)
예제 #3
0
    def test_if_works(self):
        possibles = [f'steinb{ii}.txt' for ii in range(10, 19)]
        filename = choice(possibles)
        filename = path.join('datasets', 'ORLibrary', filename)
        stpg = ReaderORLibrary().parser(filename)

        generator = GenerateBasedRandomWalk(stpg)
        mutator = PrimBasedMutation(stpg)
        prunner = Prunning(stpg)

        before = generator()

        self.assertIsInstance(before, UGraph)
        _, response = is_steiner_tree(before, stpg)
        self.assertTrue(response['all_terminals_in'])
        self.assertFalse(response['has_cycle'])
        self.assertTrue(response['all_edges_are_reliable'])
        self.assertTrue(response['graph_is_connected'])

        after = mutator(before)

        self.assertIsInstance(after, UGraph)
        after_after = prunner(after)

        _, response = is_steiner_tree(after_after, stpg)
        self.assertFalse(response['has_cycle'])
        self.assertTrue(response['all_leaves_are_terminals'])
        self.assertTrue(response['all_terminals_in'])
        self.assertTrue(response['all_edges_are_reliable'])
        self.assertTrue(response['graph_is_connected'])
예제 #4
0
    def test_crossover(self):

        stpg = self.stpg

        initializator = GenerateBasedRandomWalk(stpg)
        evaluator = EvaluateTreeGraph(stpg)
        crossover = CrossoverKruskalRST(stpg)

        red = initializator()
        blue = initializator()

        red_cost, _ = evaluator(red)
        blue_cost, _ = evaluator(blue)

        self.assertTrue(isinstance(red, UGraph))
        self.assertTrue(isinstance(blue, UGraph))

        self.assertGreater(red_cost, 0)
        self.assertGreater(blue_cost, 0)

        child = crossover(red, blue)
        cc_cost, _ = evaluator(child)
        self.assertGreater(cc_cost, 0)

        _, response = is_steiner_tree(child, stpg)
        self.assertTrue(response['all_terminals_in'])
        self.assertFalse(response['has_cycle'])
        self.assertTrue(response['all_edges_are_reliable'])
        self.assertTrue(response['graph_is_connected'])
예제 #5
0
    def test_is_steiner_tree(self):
        stpg = self.stpg

        initialization = GenerateBasedRandomWalk(stpg)
        tree = initialization()

        _, response = is_steiner_tree(tree, stpg)

        self.assertTrue(response['all_terminals_in'])
        self.assertFalse(response['has_cycle'])
        self.assertTrue(response['all_edges_are_reliable'])
        self.assertTrue(response['graph_is_connected'])
예제 #6
0
def simulation(name, params):

    filename = path.join("datasets", "ORLibrary", params["dataset"])
    stpg = ReaderORLibrary().parser(filename)

    print("STPG information", '\n', 10 * '- ', '\n')
    print('Instance: ', stpg.name)
    print('Best Known cost: ', params['global_optimum'])
    print("Nro. Node:", stpg.nro_nodes)
    print("Nro. Edges:", stpg.nro_edges)
    print("Nro. Terminals:", stpg.nro_terminals)
    print("Terminals: \n", stpg.terminals)

    generator = GenerateBasedRandomWalk(stpg)
    evaluator = EvaluateTreeGraph(stpg)
    prunner = Prunning(stpg)
    prim_mutation = PrimBasedMutation(stpg)
    replace_random = ReplaceByRandomEdge(stpg)
    partition_cx = PartitionCrossoverSteinerTree(stpg)

    output_data_dir = path.join("data", name, stpg.name)
    tracker = DataTracker(parameters['runtrial'], target=output_data_dir)

    population = (GPopulation(
        chromosomes=[generator() for _ in range(100)],
        eval_function=evaluator,
        maximize=True).mutate(
            mutate_function=prunner, probability=1.0).evaluate().normalize(
                norm_function=normalize).callback(update_best))

    evol = (Evolution().evaluate().normalize(norm_function=normalize).callback(
        update_best).callback(tracker.log_evaluation).select(
            selection_func=roullete).crossover(combiner=partition_cx).mutate(
                mutate_function=replace_random, probability=0.3).mutate(
                    mutate_function=prim_mutation, probability=0.3).mutate(
                        mutate_function=prunner,
                        probability=1.0).callback(update_generation).callback(
                            display, every=100))

    with Stagnation(interval=params["stagnation_interval"]), \
        BestKnownReached(global_optimum=params['global_optimum']):
        result = population.evolve(evol, n=params["n_iterations"])

    tracker.log_simulation(params, stpg, result)

    best_overall = result.documented_best
    test, response = is_steiner_tree(best_overall.chromosome, stpg)

    tracker.log_bestIndividual(best_overall, test, response)

    tracker.report()
예제 #7
0
    def test_evaluation_from_differents_individuals(self):

        nro_individuals = 100
        stpg = self.stpg
        initializator = GenerateBasedRandomWalk(stpg)
        evaluator = EvaluateTreeGraph(stpg)

        population = [initializator() for _ in range(nro_individuals)]

        pop_cost = [ evaluator(tree)[0] for tree in population ]

        p_var = pvariance(pop_cost)

        self.assertEqual(len(pop_cost), nro_individuals)
        self.assertNotAlmostEqual(p_var, 0.0)
예제 #8
0
    def test_generate_differents_individuals(self):

        nro_individuals = 100

        stpg = self.stpg
        initialization = GenerateBasedRandomWalk(stpg)

        population = [initialization() for _ in range(nro_individuals)]

        self.assertEqual(len(population), nro_individuals)

        c_edges = Counter((min(v, u), max(v, u))
                            for tree in population
                                for v, u in tree.gen_undirect_edges() )

        self.assertFalse(all(value == 100 for value in c_edges.values()))
예제 #9
0
    def test_is_it_work(self):
        possibles = [f'steinb{ii}.txt' for ii in range(10, 19)]
        filename = choice(possibles)
        filename = path.join('datasets', 'ORLibrary', filename)
        stpg = ReaderORLibrary().parser(filename)

        initializer = GenerateBasedRandomWalk(stpg)
        before = initializer()

        mutator = ReplaceByRandomEdge(stpg)

        after = mutator(before)

        self.assertIsInstance(after, UGraph)

        _, response = is_steiner_tree(after, stpg)
        self.assertTrue(response['all_terminals_in'])
        self.assertFalse(response['has_cycle'])
        self.assertTrue(response['all_edges_are_reliable'])
        self.assertTrue(response['graph_is_connected'])