def teste_kruskal_mst_algorithm(self):
        '''Kruskal's algorithm uses Disjoint Set under the hook'''
        edges = [
            ('a', 'b', 4),
            ('a', 'h', 8),
            ('h', 'b', 11),
            ('h', 'i', 7),
            ('h', 'g', 1),
            ('i', 'g', 6),
            ('i', 'c', 2),
            ('b', 'c', 8),
            ('c', 'f', 4),
            ('g', 'f', 2),
            ('d', 'f', 14),
            ('c', 'd', 7),
            ('d', 'e', 9),
            ('e', 'f', 10),
        ]

        graph = Graph()
        for v, u, w in edges:
            graph.add_edge(v, u, weight=w)

        tree = kruskal(graph)

        nro_edges = gg_edges_number(tree)
        cost = gg_total_weight(tree)

        self.assertEqual(nro_edges, 8)
        self.assertEqual(cost, 37)
        self.assertFalse(has_cycle(tree))
    def test_TheSameVerticesInsertion(self):

        graph = Graph()

        self.assertEqual(len(graph.vertices),0)
        self.assertEqual(len(graph.edges),0)

        graph.add_edge(5,5, weight=1)
        self.assertEqual(len(graph.vertices),0)
        self.assertEqual(len(graph.edges),0)
        self.assertFalse(graph.has_node(5))
        self.assertFalse(graph.has_edge(5,5))
    def test_instanceVerticesEmpty(self):

        graph = Graph()

        self.assertIsInstance(graph,Graph)
        self.assertIsInstance(graph.vertices,_VerticeView)
        self.assertEqual(len(graph.vertices),0)

        self.assertIsInstance(graph.edges,defaultdict)
        self.assertEqual(len(graph.edges),0)

        self.assertFalse(graph.has_node(10))
        self.assertFalse(graph.has_edge(30,45))

        self.assertEqual(graph.weight(40, 40), float("inf"))
        self.assertEqual(graph.weight(5,20),float("inf"))
 def test_AcessErrors(self):
     '''
     Note that graph[49][90] throw an exception.
     '''
     graph = Graph()
     graph.add_edge(49, 57, weight=50)
     graph.add_edge(78, 57, weight=41)
     graph.add_edge(49, 8, weight=97)
     graph.add_edge(49, 26, weight=42)
Beispiel #5
0
class TestBreadthFirstSearch(unittest.TestCase):
    def setUp(self):
        self.graph = Graph()

    def tearDown(self):
        del self.graph

    def add_component(self, vertices):

        for v in vertices:
            qtdAdj = random.randint(1, 10)
            adjacents = random.sample(vertices, qtdAdj)
            for a in adjacents:
                if a != v:
                    self.graph.add_edge(v, a, weight=random.randint(0, 15))

    def test_findOneComponent(self):
        self.add_component(range(1, 51))

        components = find_connected_components(self.graph)
        qtd_components = len(components)
        self.assertEqual(qtd_components, 1)

    def test_findTwoComponent(self):
        self.add_component(range(1, 51))
        self.add_component(range(100, 151))

        components = find_connected_components(self.graph)
        qtd_components = len(components)
        self.assertEqual(qtd_components, 2)

    def test_bsf(self):
        vertices = random.sample(range(1, 500), 50)
        start = random.sample(vertices, 1)

        self.add_component(vertices)
        visited = bfs(self.graph, start=start[0])
        visited = list(visited)

        self.assertEqual(len(vertices), len(visited))
        self.assertEqual(sorted(vertices), sorted(visited))
 def setUp(self):
     self.graph = Graph()
     self.graph.add_edge('a', 'b', weight=15)
     self.graph.add_edge('a', 'c', weight=25)
     self.graph.add_edge('c', 'd', weight=10)
     self.graph.add_edge('c', 'e', weight=20)
     self.graph.add_edge('e', 'f', weight=10)
     self.graph.add_edge('e', 'g', weight=5)
     self.graph.add_edge('e', 'b', weight=10)
     self.graph.add_edge('b', 'h', weight=5)
     self.graph.add_edge('b', 'i', weight=25)
     self.graph.add_edge('h', 'i', weight=15)
class TestDijkstraImplementation(unittest.TestCase):
    def setUp(self):
        self.graph = Graph()
        self.graph.add_edge('a', 'b', weight=15)
        self.graph.add_edge('a', 'c', weight=25)
        self.graph.add_edge('c', 'd', weight=10)
        self.graph.add_edge('c', 'e', weight=20)
        self.graph.add_edge('e', 'f', weight=10)
        self.graph.add_edge('e', 'g', weight=5)
        self.graph.add_edge('e', 'b', weight=10)
        self.graph.add_edge('b', 'h', weight=5)
        self.graph.add_edge('b', 'i', weight=25)
        self.graph.add_edge('h', 'i', weight=15)

    def test_small_graph(self):

        graph = self.graph

        distances, _ = dijkstra(graph, 'a')

        self.assertEqual(distances['a'], 0)
        self.assertEqual(distances['b'], 15)
        self.assertEqual(distances['c'], 25)
        self.assertEqual(distances['d'], 35)
        self.assertEqual(distances['e'], 25)
        self.assertEqual(distances['f'], 35)
        self.assertEqual(distances['g'], 30)
        self.assertEqual(distances['h'], 20)
        self.assertEqual(distances['i'], 35)

    def test_desconnected_graph(self):

        graph = self.graph

        # desconnected edge
        graph.add_edge('z', 'w', weight=40)

        distances, _ = dijkstra(graph, 'a')

        self.assertNotEqual(distances['z'], 40)
        self.assertEqual(distances['z'], float("inf"))

        #mas R nem é um vértice do grafo
        self.assertEqual(distances['R'], float("inf"))

    def test_previous_tree(self):

        graph = self.graph

        _, previous_tree = dijkstra(graph, 'a')

        self.assertEqual(previous_tree['i'], 'h')
        self.assertEqual(previous_tree['b'], 'a')
        self.assertEqual(previous_tree['a'], None)
Beispiel #8
0
 def setUp(self):
     self.graph = Graph()
    def test_ErrorHandle(self):

        graph = Graph()
        graph.add_edge(49, 57, weight=50)
        graph.add_edge(78, 57, weight=41)
        graph.add_edge(49, 8, weight=97)
        graph.add_edge(49, 26, weight=42)

        self.assertEqual(graph[49][26], 42)
        self.assertEqual(graph.weight(49,26), 42)
        self.assertEqual(graph[49][26], graph.edges[49][26])
        self.assertEqual(graph.get(78),{57 : 41})

        self.assertEqual(graph.get(34), dict())
        self.assertEqual(graph[34], dict())
        self.assertNotIn(34, graph)

        with self.assertRaises(KeyError) :
            graph[49][90]


        graph.add_edge(49, 57, weight=78)
        self.assertEqual(graph[49][57],78)
        self.assertEqual(graph.weight(49,57),78, msg="Deveria deixar atualizar?")

        graph.add_edge(49, 49, weight=96)
        self.assertEqual(graph.weight(49,49),0)

        with self.assertRaises(KeyError) :
            graph[49][49]
    def test_verticesAndEdgeInsertion(self):

        graph = Graph()
        self.assertEqual(len(graph.vertices),0)
        self.assertEqual(len(graph.edges),0)

        graph.add_node(4)
        self.assertIn(4, graph.vertices)
        # self.assertNotIn(4,graph.edges)

        graph.add_edge(4,5,weight=30)
        self.assertTrue(graph.has_edge(5,4))
        self.assertTrue(graph.has_node(4))
        self.assertTrue(graph.has_node(5))
        self.assertFalse(graph.has_node(100))

        self.assertIn(5,graph.vertices)
        self.assertIn(4, graph.vertices)
        self.assertIn(4,graph.edges)
        self.assertIn(5,graph.edges)
        self.assertNotIn(100, graph.vertices)
        self.assertNotIn(100,graph.edges)

        self.assertEqual(graph[4][5], 30)
        self.assertEqual(graph[4][5],graph[5][4])
        # self.assertEqual(graph.vertices.count(4), 1)

        self.assertEqual(graph.size(),2)
        self.assertIsInstance(graph[5],dict)
        self.assertIsInstance(graph[4],dict)

        graph.add_edge(6,4,weight=29)
        self.assertTrue(graph.has_edge(4,6))
        self.assertTrue(graph.has_node(6))
        self.assertIn(6,graph.vertices)
        self.assertIn(6,graph.edges)
        self.assertEqual(graph[4][6], 29)
        self.assertEqual(graph[4][6],graph[6][4])
        # self.assertEqual(graph.vertices.count(4), 1)

        graph.add_node(6) # inserting again
        # self.assertEqual(graph.vertices.count(6), 1)

        self.assertFalse(graph.has_edge(4,7))
        self.assertEqual(graph.weight(4,7),float("inf"))

        self.assertEqual(graph.weight(4,4),0)

        self.assertEqual(graph.degree(4),2)
        self.assertEqual(graph.degree(5),1)
        self.assertEqual(graph.degree(6),1)

        graph.add_edge(150, 134, weight=9)
        self.assertEqual(graph[150][134], 9)
        self.assertEqual(graph.weight(134,150), 9)
    def test_Adjacents(self):
        graph = Graph()
        graph.add_edge(49, 57, weight=50)
        graph.add_edge(78, 57, weight=41)
        graph.add_edge(49, 8, weight=97)
        graph.add_edge(49, 26, weight=42)

        adj = [ v for v in graph.adjacent_to(49)]
        self.assertEqual(sorted(adj),[8, 26, 57])

        self.assertIn(49, graph.adjacent_to(adj[1]))

        self.assertEqual(set(graph.adjacent_to(49)), set(graph.edges[49].keys()))
        self.assertIn(26, graph.edges[49].keys())
        self.assertIn(26, graph.adjacent_to(49))
        self.assertNotIn(56,graph.adjacent_to(49))

        from _collections_abc import dict_keys
        self.assertIsInstance(graph.adjacent_to(49, lazy=False), set)
        self.assertNotIsInstance(graph.adjacent_to(49),list)
        self.assertNotIsInstance(graph.adjacent_to(49),dict)
        self.assertNotIsInstance(graph.adjacent_to(49),set)
        self.assertIsInstance(graph.adjacent_to(49, lazy=False),set)

        self.assertEqual(graph.degree(49), 3)
        self.assertEqual(graph.degree(8), 1)
        self.assertEqual(graph.degree(10), 0)
    def tree_example(self):

        tree = Graph()

        tree.add_edge('a', 'b', weight=1)
        tree.add_edge('a', 'c', weight=1)
        tree.add_edge('a', 'd', weight=1)
        tree.add_edge('b', 'e', weight=1)
        tree.add_edge('b', 'f', weight=1)
        tree.add_edge('c', 'g', weight=1)
        tree.add_edge('d', 'h', weight=1)
        tree.add_edge('d', 'i', weight=1)
        tree.add_edge('d', 'j', weight=1)
        tree.add_edge('j', 'k', weight=1)
        tree.add_edge('j', 'l', weight=1)

        return tree