def find_path(self): """Implementation of Dijkstra's algorithm""" # Reset vertice info for v in self.vertices: v.min_distance = float('+inf') v.previous_vertex = None orig = Vertex(100) orig.min_distance = 0 adjacent = self.vertices[triangle(self.rows - 1):] for a in adjacent: orig.add_adjacent(a) Q = [orig] + [v for v in self.vertices] while len(Q) > 0: u = min(Q) if u.min_distance == float('+inf'): return False Q.remove(u) for v in u.adjacent: distance = u.min_distance + v.weight if distance < v.min_distance: v.min_distance = distance v.previous_vertex = u return True
def __init__(self, vertex_data): self.vertices = [] i = 0 row = 1 for v in vertex_data: if (i >= triangle(row)): row = row + 1 vertex = Vertex(v) if row > 1: # Find upwards adjacent vertices above_row = self.vertices[triangle(row - 2):triangle(row - 1)] total_this_row = triangle(row) - triangle(row - 1) pos = i - triangle(row - 1) + 1 start = int((pos / float(total_this_row)) * len(above_row)) - 1 end = int(((pos + 1) / float(total_this_row)) * len(above_row)) adjacent = above_row[start if start >= 0 else 0:end] for a in adjacent: vertex.add_adjacent(a) self.vertices.append(vertex) i = i + 1 self.rows = row if len(self.vertices) != triangle(self.rows): raise Exception('Invalid vertex set')