Practice dijkstra's algorithm
Getting some practice with Python's heapq module (which I'm unsure if I used correctly) to do a priority-first-traversal of a graph: known as Dijkstra's algorithm.
This commit is contained in:
		
							parent
							
								
									91811236a5
								
							
						
					
					
						commit
						c010e6d6cf
					
				
					 1 changed files with 26 additions and 0 deletions
				
			
		
							
								
								
									
										26
									
								
								deepmind/dijkstra.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								deepmind/dijkstra.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,26 @@
 | 
				
			||||||
 | 
					# Doing a practice implementation of Dijkstra's algorithm: a priority-first
 | 
				
			||||||
 | 
					# search.
 | 
				
			||||||
 | 
					from heapq import heappush, heappop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Node(object):
 | 
				
			||||||
 | 
					    def __init__(self, value, children):
 | 
				
			||||||
 | 
					        self.value = value
 | 
				
			||||||
 | 
					        self.children = children
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def shortest_path(a, b):
 | 
				
			||||||
 | 
					    """Return the shortest path from `a` to `b`."""
 | 
				
			||||||
 | 
					    q = []
 | 
				
			||||||
 | 
					    seen = set()
 | 
				
			||||||
 | 
					    heappush((a.value, a, [a]), q)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while q:
 | 
				
			||||||
 | 
					        d, node, path = heappop(q)
 | 
				
			||||||
 | 
					        if node == b:
 | 
				
			||||||
 | 
					            return path
 | 
				
			||||||
 | 
					        seen.add(node)
 | 
				
			||||||
 | 
					        for child in node.children:
 | 
				
			||||||
 | 
					            if child not in seen:
 | 
				
			||||||
 | 
					                heappush((d + child.value, child, path + [child]), q)
 | 
				
			||||||
 | 
					    raise Exception("Path between nodes A and B does not exist.")
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue