Esempio n. 1
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'])
    def test_basic(self):
        filename = path.join("datasets", "ORLibrary", "steinc5.txt")
        stpg = ReaderORLibrary().parser(filename)

        vertices = list(stpg.graph.vertices)
        v, u = sample(vertices, 2)

        crossover = PXTree(stpg)
        evaluator = EvaluateTreeGraph(stpg)

        red, red_cost = shortest_path_with_origin(stpg.graph, v,
                                                  stpg.terminals)
        blue, blue_cost = shortest_path_with_origin(stpg.graph, u,
                                                    stpg.terminals)

        child = crossover(red, blue)

        child_cost, _ = evaluator(child)

        self.assertLessEqual(child_cost, red_cost)
        self.assertLessEqual(child_cost, blue_cost)

        _, 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'])
        self.assertTrue(response['all_leaves_are_terminals'])
Esempio n. 3
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'])
Esempio n. 4
0
    def test_best_solution_is_steiner_tree(self):
        filename = path.join('datasets', 'ORLibrary', 'steinb1.txt')
        stpg = ReaderORLibrary().parser(filename)
        coder = Coder(stpg)
        chromosome = "00000010000000001011000110001100010100010"

        subgraph = coder.binary2treegraph(chromosome)

        result, _ = is_steiner_tree(subgraph, stpg)

        self.assertTrue(result)
    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'])
def simulation(simulation_name, params):

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

    print("STPG information", '\n', 10 * '- ', '\n')
    print("Trial: ", parameters['runtrial'])
    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)

    output_folder = path.join("data", simulation_name, STPG.name)
    tracker = DataTracker(params['runtrial'], target=output_folder)

    generator = GenerateBasedPrimRST(STPG)
    evaluator = EvaluateTreeGraph(STPG)
    crossover = CrossoverPrimRST(STPG)
    prunner = Prunning(STPG)
    mut_prim = PrimBasedMutation(STPG)
    replace_random = ReplaceByRandomEdge(STPG)

    population = (GPopulation(
        chromosomes=[generator() for _ in range(params["population_size"])],
        eval_function=evaluator,
        maximize=True).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=crossover).mutate(
                mutate_function=replace_random, probability=0.2).mutate(
                    mutate_function=mut_prim, probability=0.2).mutate(
                        mutate_function=prunner,
                        probability=0.2).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()
Esempio n. 7
0
    def test_is_steiner_tree(self):
        stpg = self.stpg

        chromosome = gen_random_kruskal(stpg)
        tree = UGraph()

        for edge in chromosome:
            v, u = edge
            tree.add_edge(v, u)

        _, 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'])
Esempio n. 8
0
    def __call__(self, population: Population):

        best_solution = population.documented_best

        if (best_solution is not None
                and best_solution.cost == self.global_optimum):

            if self.is_to_use_decoder_function:
                steiner_tree = self.decoder(best_solution.chromosome)
            else:
                steiner_tree = best_solution.chromosome

            result, _ = is_steiner_tree(steiner_tree, self.STPG)

            if result:
                raise StopEvolution("BestKnownSteinerTreeReached")
    def test_if_is_it_a_tree(self):
        filename = path.join('datasets', 'ORLibrary', 'steinb15.txt')
        stpg = ReaderORLibrary().parser(filename)

        crossover = CrossoverKruskalRST(stpg)

        parent_a = gen_random_walk(stpg)
        parent_b = gen_random_walk(stpg)
        offspring = crossover(parent_a, parent_b)

        tree = UGraph()
        for edge in offspring:
            u, v = edge[0], edge[1]
            tree.add_edge(u, v)

        _, 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'])
Esempio n. 10
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'])
    def test_exchange_edges(self):
        filename = path.join('tests', 'data', 'test3.txt')
        stpg = ReaderORLibrary().parser(filename)

        red = UGraph()
        edges = [(1, 3), (3, 8), (8, 5), (5, 6)]
        for edge in edges:
            red.add_edge(edge[0], edge[1])

        blue = UGraph()
        edges = [(1, 3), (3, 8), (3, 7), (7, 4), (4, 6)]
        for edge in edges:
            blue.add_edge(edge[0], edge[1])

        crossover = PXTree(stpg)

        child = crossover(red, blue)

        _, 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'])
        self.assertTrue(response['all_leaves_are_terminals'])
Esempio n. 12
0
    def test_simpliest(self):
        stpg = self.stpg

        mutate = MutationReplaceByRandomEdge(stpg)

        after = gen_random_prim(stpg)

        self.assertIsInstance(after, EdgeSet)

        before = mutate(after)

        self.assertIsInstance(before, EdgeSet)

        tree = UGraph()

        for edge in before:
            v, u = edge
            tree.add_edge(v, u)

        _, 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'])