def dijkstra(self, s): sdist = dict(((n, 1E9) for n in self.graph.nodes())) sdist[s] = 0 pathprev = {s: None} marked = {} pq = [[sdist[n], n] for n in self.graph.nodes()] Ref = dict([(pq[i][1], i) for i in range(len(pq))]) heap = Heap(pq, Ref) heap.heapify() #print pq #print Ref while pq: node_distance, node = heap.heappop() marked[node] = True for nei in self.graph.get_neighbours(node): if nei not in marked: nei_new_dist = node_distance + self.graph.get_weight( nei, node) if sdist[nei] > nei_new_dist: #print pq heap.decrease_key(Ref[nei], nei_new_dist) #print pq sdist[nei] = nei_new_dist pathprev[nei] = node return sdist, pathprev
def __init__(self, start_node, goal_node, grid): self.grid = grid self.position = start_node.xy self.start_node = start_node self.goal_node = goal_node self.open_list = Heap() self.start_node.set_val("g", 0) self.start_node.set_val("f", start_node.h_val) self.open_list.add(start_node, start_node.f_val) self.search()
from utils import Heap heap = Heap([3, 1, 2]) heap.push(1) heap.push(2) a = [i for i in heap] assert (a == [1, 1, 2, 2, 3])