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())