Beispiel #1
0
def run_dijkstra(graph, source, target):
    """Dijkstra's shortest path algorithm"""
    queue = PriorityQueue()
    dist = {source: 0}
    prev = {}

    for vertex in graph:
        if vertex != source:
            dist[vertex] = float("inf")
        queue.insert(vertex, dist[vertex])

    while not queue.is_empty():
        u_dist, u = queue.pop()
        u_node = graph[u]

        if u == target:
            break

        for v in u_node['linkTo']:
            if queue.is_node_in_queue(v):
                alt = dist[u] + \
                    calc_distance(int(u_node['x']), int(u_node['y']),
                                  int(graph[v]['x']), int(graph[v]['y']))
                if alt < dist[v]:
                    dist[v] = alt
                    prev[v] = u
                    queue.insert(v, alt)

    path = []
    curr = target
    while curr in prev:
        path.append(curr)
        curr = prev[curr]
    path.append(source)
    return path[::-1]
Beispiel #2
0
def dijkstra(graph, start):
    prev = {}
    costs = {}
    costs[start] = 0
    visited = set()

    pq = PriorityQueue()

    for node in graph.nodes():
        if node != -1:
            pq.insert(float('inf'), node)
        pq.insert(0, start)

    while not pq.is_empty():
        cost, ele = pq.delete_min()
        visited.add(ele)
        for successor in graph.get_successors(ele):
            new_cost = cost + graph.get_cost(ele, successor)
            if successor not in visited and (successor not in costs or new_cost < costs[successor]):
                costs[successor] = new_cost
                prev[successor] = ele
                pq.update(new_cost, successor)
    res = {}
    for key in costs:
        res[(start, key)] = costs[key]
    return res
Beispiel #3
0
def prim(graph, start):
# heap to have the vertex that are not added
# key is the cheapest edge
    edge = set()
    overall_cost = 0
    prev = {}
    prev[start] = start
    costs = {}
    costs[start] = 0
    pq = PriorityQueue()
    visited = set()

    for node in graph.nodes():
        pq.insert(float('inf'), node)
    pq.insert(0, start)

    while not pq.is_empty():
        cost, ele = pq.delete_min()
        edge.add((prev[ele], ele))
        overall_cost += cost
        visited.add(ele)
        for successor, edge_cost in graph.get_successors(ele):
            new_cost = edge_cost
            if successor not in visited and (successor not in costs or new_cost < costs[successor]):
                costs[successor] = new_cost
                prev[successor] = ele
                pq.update(new_cost, successor)
    return edge, overall_cost
Beispiel #4
0
def run_dijkstra(graph, source, target):
    """Dijkstra's shortest path algorithm"""
    queue = PriorityQueue()
    dist = {source: 0}
    prev = {}

    for vertex in graph:
        if vertex != source:
            dist[vertex] = float("inf")
        queue.insert(vertex, dist[vertex])

    while not queue.is_empty():
        u_dist, u = queue.pop()
        u_node = graph[u]

        if u == target:
            break

        for v in u_node['linkTo']:
            if queue.is_node_in_queue(v):
                alt = dist[u] + \
                    calc_distance(int(u_node['x']), int(u_node['y']),
                                  int(graph[v]['x']), int(graph[v]['y']))
                if alt < dist[v]:
                    dist[v] = alt
                    prev[v] = u
                    queue.insert(v, alt)

    path = []
    curr = target
    while curr in prev:
        path.append(curr)
        curr = prev[curr]
    path.append(source)
    return path[::-1]
Beispiel #5
0
def dijkstra(graph, start):
    prev = {}
    costs = {}
    costs[start] = 0

    pq = PriorityQueue()
    for node in graph.nodes():
        pq.insert(float('inf'), node)
    pq.insert(0, start)

    while not pq.is_empty():
        cost, ele = pq.delete_min()
        for successor, edge_cost in graph.get_successors(ele):
            new_cost = cost + edge_cost

            if successor not in costs or new_cost < costs[successor]:
                costs[successor] = new_cost
                prev[successor] = ele
                pq.update(new_cost, successor)
    return prev, costs