Esempio n. 1
0
    def dijkstra(self, start, end):
        if start not in self.vertices or end not in self.vertices:
            return

        self.clean_vertices()

        start_vertex = self.get_vertex(start)
        end_vertex = self.get_vertex(end)

        for v in self.get_vertices():
            v.distance = sys.maxsize
        start_vertex.distance = 0

        pq = BinaryHeap()
        pq.build_heap([(v.distance, v) for v in self.get_vertices()])

        while pq.size() > 0:
            current = pq.delete_min()
            current = current[1]  # get the vertex from the tuple
            for neighbor in current.get_connections():
                new_distance = current.distance + current.get_connection_weight(
                    neighbor)
                if new_distance < neighbor.distance:
                    neighbor.distance = new_distance
                    neighbor.predecessor = current
                    pq.rebuild_heap()

        items = []
        trace_vertex = end_vertex
        done = False
        while not done:
            items.append(trace_vertex.get_id())
            if trace_vertex.get_id() == start_vertex.get_id():
                done = True
            trace_vertex = trace_vertex.predecessor
        items.reverse()
        print("\nResult from dijkstra: {0}\n".format(" => ".join(items)))
        return items
    def dijkstra(self, start, end):
        if start not in self.vertices or end not in self.vertices:
            return

        self.clean_vertices()

        start_vertex = self.get_vertex(start)
        end_vertex = self.get_vertex(end)

        for v in self.get_vertices():
            v.distance = sys.maxsize
        start_vertex.distance = 0

        pq = BinaryHeap()
        pq.build_heap([(v.distance, v) for v in self.get_vertices()])

        while pq.size() > 0:
            current = pq.delete_min()
            current = current[1] # get the vertex from the tuple
            for neighbor in current.get_connections():
                new_distance = current.distance + current.get_connection_weight(neighbor)
                if new_distance < neighbor.distance:
                    neighbor.distance = new_distance
                    neighbor.predecessor = current
                    pq.rebuild_heap()

        items = []
        trace_vertex = end_vertex
        done = False
        while not done:
            items.append(trace_vertex.get_id())
            if trace_vertex.get_id() == start_vertex.get_id():
                done = True
            trace_vertex = trace_vertex.predecessor
        items.reverse()
        print("\nResult from dijkstra: {0}\n".format(" => ".join(items)))
        return items
    def testBinaryHeap(self):
        heap = BinaryHeap()
        self.assertTrue(heap.is_empty())

        heap.insert(1)
        heap.insert(4)
        heap.insert(5)
        heap.insert(3)
        heap.insert(2)
        heap.insert(6)
        heap.delete_min()

        self.assertEqual(heap.find_min(), 2)
        self.assertEqual(heap.size(), 5)
        self.assertFalse(heap.is_empty())

        heap.build_heap([99, 77, 33, 22, 55, 66, 11, 44, 99])
        self.assertEqual(heap.find_min(), 11)
        self.assertEqual(heap.size(), 9)
        self.assertFalse(heap.is_empty())
    def testBinaryHeap(self):
        heap = BinaryHeap()
        self.assertTrue(heap.is_empty())

        heap.insert(1)
        heap.insert(4)
        heap.insert(5)
        heap.insert(3)
        heap.insert(2)
        heap.insert(6)
        heap.delete_min()

        self.assertEqual(heap.find_min(), 2)
        self.assertEqual(heap.size(), 5)
        self.assertFalse(heap.is_empty())

        heap.build_heap([99, 77, 33, 22, 55, 66, 11, 44, 99])
        self.assertEqual(heap.find_min(), 11)
        self.assertEqual(heap.size(), 9)
        self.assertFalse(heap.is_empty())