コード例 #1
0
    def __call__(self, parent_a, parent_b):
        assert isinstance(
            parent_a, EdgeSet
        ), f'parent_a has to be EdgeSet type. Give was {type(parent_a)}'
        assert isinstance(
            parent_b, EdgeSet
        ), f'parent_b has to be EdgeSet type. Give was {type(parent_b)}'

        edges = parent_a | parent_b

        done = DisjointSets()
        for v in edges.vertices:
            done.make_set(v)

        edges = set(edges)

        result = EdgeSet()
        while edges and len(done.get_disjoint_sets()) > 1:
            edge = sample(edges, k=1)[0]
            y, z = edge[0], edge[1]
            if done.find(y) != done.find(z):
                result.add(edge)
                done.union(y, z)
            edges.discard(edge)

        return result
コード例 #2
0
    def __call__(self, parent_a, parent_b):
        assert isinstance(
            parent_a, EdgeSet
        ), f'parent_a has to be EdgeSet type. Give was {type(parent_a)}'
        assert isinstance(
            parent_b, EdgeSet
        ), f'parent_b has to be EdgeSet type. Give was {type(parent_b)}'
        stpg = self.stpg
        terminals = set(stpg.terminals)

        subgraph = UGraph()
        for edge in parent_a:
            u, v = edge
            subgraph.add_edge(u, v)
        for edge in parent_b:
            u, v = edge
            subgraph.add_edge(u, v)

        done = set()
        result = EdgeSet()

        v = terminals.pop()
        while terminals:
            done.add(v)
            adjacents = subgraph.adjacent_to(v, lazy=False)
            u = sample(adjacents, k=1)[0]
            if u not in done:
                result.add(v, u)
            terminals.discard(u)
            v = u

        return result
コード例 #3
0
def gen_random_prim(stpg: SteinerTreeProblem):

    terminals = set(stpg.terminals)
    graph = stpg.graph

    vi = sample(range(1, stpg.nro_nodes + 1), k=1)[0]

    done = set()
    edges = set()
    result = EdgeSet()

    done.add(vi)
    terminals.discard(vi)
    for w in graph.adjacent_to(vi):
        edges.add((vi, w))

    while edges and terminals:
        edge = sample(edges, k=1)[0]
        v, w = edge
        if w not in done:
            done.add(w)
            result.add(v, w)
            terminals.discard(w)
            for u in graph.adjacent_to(w):
                if u not in done: edges.add((w, u))
        edges.discard((v, w))

    return result
コード例 #4
0
    def test_add_an_edge(self):
        items = [(8, 9), (7, 4),(5,3), (2,1)]
        result = EdgeSet(items)
        edge = UEdge(40, 50)

        self.assertFalse(edge in result)
        self.assertEqual(len(result), len(items))
        self.assertTrue(hasattr(result, 'add'))

        result.add(edge)

        self.assertTrue(edge in result)
        self.assertEqual(len(result), len(items) + 1)
コード例 #5
0
    def test_vertices_after_add_a_new_edge(self):
        items = [
            (8, 6), (7, 4),(5,3), (2,1),
            (8, 7), (8, 4), (8, 5), (8, 2)
        ]

        result = EdgeSet(items)
        self.assertEqual(len(result), len(items))
        self.assertTrue(hasattr(result, 'vertices'))

        vertices = set([v for v in result.vertices])
        self.assertEqual(len(vertices), 8)

        result.add(47, 5)
        result.add(23, 4)
        vertices_b = set([v for v in result.vertices])
        self.assertEqual(len(vertices_b), 10)
        self.assertEqual(len(result), len(items) + 2)
コード例 #6
0
def gen_random_walk(stpg: SteinerTreeProblem):

    graph = stpg.graph
    terminals = set(stpg.terminals)
    result = EdgeSet()
    done = set()

    v = terminals.pop()
    while terminals:
        done.add(v)
        adjacents = graph.adjacent_to(v, lazy=False)
        u = sample(adjacents, k=1)[0]
        if u not in done:
            result.add(v, u)
        terminals.discard(u)
        v = u

    return result
コード例 #7
0
    def test_xor_operand(self):
        A = count(0, step=2)
        B = count(1, step=2)

        one = EdgeSet(UEdge(next(A), next(B)) for _ in range(200))
        self.assertEqual(len(one), 200)

        self.assertTrue(hasattr(one, "__xor__"))

        C = count(200, step=2)
        D = count(201, step=2)

        two = EdgeSet(UEdge(next(C), next(D)) for _ in range(200))
        self.assertEqual(len(two), 200)

        three = one ^ two

        self.assertIsInstance(three, EdgeSet)
        self.assertEqual(len(three), 200)

        four = two ^ one
        self.assertEqual(three, four)
        self.assertIsInstance(four, EdgeSet)

        E = count(0, step=2)
        F = count(1, step=2)

        five  = EdgeSet(UEdge(next(E), next(F)) for _ in range(100))
        six   = EdgeSet((next(E), next(F)) for _ in range(100))
        items = [(next(E), next(F)) for _ in range(100)]
        for item in items:
            five.add(item)

        self.assertEqual(len(five), 200)

        self.assertEqual(three, five)
        self.assertEqual(four, five)

        seven = six & five
        self.assertEqual(len(seven), 0)
        self.assertFalse(seven)
        self.assertIsInstance(seven, EdgeSet)
コード例 #8
0
    def __call__(self, parent_a, parent_b):
        assert isinstance(
            parent_a, EdgeSet
        ), f'parent_a has to be EdgeSet type. Give was {type(parent_a)}'
        assert isinstance(
            parent_b, EdgeSet
        ), f'parent_b has to be EdgeSet type. Give was {type(parent_b)}'
        stpg = self.stpg
        terminals = set(stpg.terminals)
        done = set()
        result = EdgeSet()

        subgraph = UGraph()
        for edge in parent_a:
            u, v = edge
            subgraph.add_edge(u, v)
        for edge in parent_b:
            u, v = edge
            subgraph.add_edge(u, v)

        vi = terminals.pop()
        done.add(vi)

        candidates_edges = set()
        for u in subgraph.adjacent_to(vi):
            candidates_edges.add((vi, u))

        while candidates_edges and terminals:
            edge = sample(candidates_edges, k=1)[0]
            v, w = edge
            if w not in done:
                done.add(w)
                result.add(v, w)
                terminals.discard(w)
                for u in subgraph.adjacent_to(w):
                    if u not in done: candidates_edges.add((w, u))
            candidates_edges.discard((v, w))

        return result
コード例 #9
0
    def test_path_like_solution(self):
        filename = path.join('tests', 'data', 'test3.txt')
        stpg = ReaderORLibrary().parser(filename)

        after = EdgeSet()
        after.add(1, 3)
        after.add(3, 8)
        after.add(8, 5)
        after.add(5, 6)

        evaluate = EvaluateEdgeSet(stpg)
        mutate = MutationReplaceByRandomEdge(stpg)

        cost_after, _ = evaluate(after)

        self.assertEqual(cost_after, (5 + 7 + 7 + 15))

        before = mutate(after)

        self.assertEqual(after, before)

        cost_before, _ = evaluate(before)
        self.assertEqual(cost_after, cost_before)
コード例 #10
0
def gen_random_kruskal(stpg: SteinerTreeProblem):

    terminals = set(stpg.terminals)
    edges = [(u, v) for u, v in stpg.graph.gen_undirect_edges()]
    shuffle(edges)

    done = DisjointSets()
    for v in terminals:
        done.make_set(v)

    result = EdgeSet()

    while edges and len(done.get_disjoint_sets()) > 1:
        edge = edges.pop()
        y, z = edge[0], edge[1]
        if y not in done: done.make_set(y)
        if z not in done: done.make_set(z)
        if done.find(y) != done.find(z):
            result.add(y, z)
            done.union(y, z)
            terminals.discard(y)
            terminals.discard(z)

    return result