def get_shortest_path(g, initial, target):
    reset_shortest_path(g)
    print 'Origin: ', initial, 'Target: ', target
    dj.dijkstra(g, g.get_vertex(initial), g.get_vertex(target))
    target = g.get_vertex(target)
    path = [target]
    dj.shortest(target, path)
    return list(reversed(path))
Beispiel #2
0
def bi_directional_dijstra(g, start_key, end_key=None):
    Ds, Dt = {}, {}

    g1 = copy.deepcopy(g)
    g2 = copy.deepcopy(g)
    forward = idijkstra(g1, start_key)
    backward = idijkstra(g2, end_key)

    dirs = (Ds, Dt, forward), (Dt, Ds, backward)

    try:
        for D, other, step in cycle(dirs):
            v = next(step)

            D[v.key] = v.distance

            if v.key in other:
                break
    except StopIteration:
        return float('inf')

    intermediate_node = None
    cost = float('Inf')
    for u_key in Ds:
        u = g1.get_vertex(u_key)
        if u:
            for v in u.get_connections():
                if v.key not in Dt:
                    continue

                if cost > Ds[u.key] + u.get_weight(v) + Dt[v.key]:
                    cost = min(cost, Ds[u.key] + u.get_weight(v) + Dt[v.key])
                    # record the meeting node with lowest distance
                    intermediate_node = u
                    #print(intermediate_node.key, v.key, cost)

    print(f'Forward and Backward meet at node:{intermediate_node.key}!')

    # shortest path in forward list part(including the intermediate node)
    forward_path = []
    node = g1.get_vertex(intermediate_node.key)
    forward_path.append(node)
    shortest(node, forward_path)
    forward_path.reverse()
    print(f'forward path:{[i.key for i in forward_path]}')

    # skip the intermediate_node since it's already in forward list
    backward_path = []
    node = g2.get_vertex(intermediate_node.key)
    shortest(node, backward_path)
    print(f'backward path:{[i.key for i in backward_path]}')

    forward_path.extend(backward_path)

    return forward_path, cost
Beispiel #3
0
def single_timed_test(g, u, v, structure):
    '''runs a single instance of the Dijkstra algorithm on a graph g with starting 
    node u and ending node v.  structure refers to the type data structure used'''

    t0 = time()
    dijkstra.dijkstra(g, g.get_vertex(u), structure)
    target = g.get_vertex(v)
    path = [target.get_id()]
    dijkstra.shortest(target, path)
    t1 = time()

    return t1 - t0
def main():

    G = get_random_graph()

    from dijkstra import shortest
    print "Test Dijkstra", shortest, '-'*20
    print 'NetworkX =>', nx.shortest_path(G, 0, 50, 'weight')
    print 'Dijkstra =>', shortest(G, 0, 50)
 
    from floyd_warshall import shortest
    print "Test Floyd-Warshall", shortest, '-'*20
    print 'NetworkX =>', nx.shortest_path(G, 0, 50, 'weight')
    print 'Floyd-Warshall =>', shortest(G, 0, 50)

    pass
Beispiel #5
0
def judge(num, tuples, tgt):
    print(tuples)
    edge_dict = defaultdict(int)
    for i, j, v in tuples:
        edge_dict[(i, j)] = v
        edge_dict[(j, i)] = v

    result = shortest(num, tuples)
    if result[0] != tgt:
        return False
    total_length = 0
    for idx in range(len(result[1]) - 1):
        l, r = result[1][idx], result[1][idx + 1]
        total_length += edge_dict[(l, r)]
    if total_length != tgt:
        return False

    return True
Beispiel #6
0
def getCollection():
    mapName = request.args.get('map')
    origin = request.args.get('origin')  #Ponto de origem
    destiny = request.args.get('destiny')  #Ponto final (chegada)
    price = request.args.get('price')
    autonomy = request.args.get('autonomy')
    steps = []  # Lista que ira ser preenchida com todos os passos do caminho
    dictPaths = {}  # Dicionario com o valor de todos as rotas
    graph = dijkstra.Graph(
    )  # Lib que faz o grafico de vertex para calcular o dijkstra
    vertex = []  # Lista de vertex
    try:
        map = collection.find_one({'title': mapName})
    except:
        response = jsonify(
            {'response': 'Application could not use the DB especifield'})
        response.status_code = 500
        return response

    # Fazendo a iteração para preencher uma lista
    # de vertex que serão usado na lib Graph()
    for vert in map['routes']:
        vertex.append(vert['origin'])
        vertex.append(vert['destiny'])

    # Iterando nos vertex setando para que nao se repitam
    for i in list(set(vertex)):
        graph.add_vertex(i)

    # Adicionando os vertexa lib Graph
    for vert in map['routes']:
        dictPaths[vert['origin'] + vert['destiny']] = vert['distance']
        graph.add_edge(vert['origin'], vert['destiny'], vert['distance'])

    # Verificando se os pontos existem
    if origin not in vertex:
        response = jsonify({
            'response':
            'The parameter origin does not contain on map %s' % mapName
        })
        response.status_code = 400
        return response
    if destiny not in vertex:
        response = jsonify({
            'response':
            'The parameter destiny does not contain on map %s' % mapName
        })
        response.status_code = 400
        return response

    dijkstra.dijkstra(graph, graph.get_vertex(origin),
                      graph.get_vertex(destiny))
    target = graph.get_vertex(destiny)
    path = [target.get_id()]
    dijkstra.shortest(target, path)

    a = 0
    while a < (len(path[::-1]) - 1):
        steps.append(path[::-1][a] + path[::-1][a + 1])
        a = a + 1

    total = 0
    for i in steps:
        total = total + dictPaths[i]

    # Apenas formatando a lista para utf-8
    pathList = []
    for i in path[::-1]:
        pathList.append(i.encode('utf-8'))

    # Fazendo o calculo do custo nessa rota de menor distancia
    cost = float(total) / float(autonomy) * float(price)

    response = []
    response.append({'Path': '%s' % pathList})
    response.append({'Total KM': '%.2f' % total})
    response.append({'Cost': '%.2f' % cost})
    return jsonify(data=response)
Beispiel #7
0
def getCollection():
    mapName = request.args.get('map')
    origin = request.args.get('origin') #Ponto de origem
    destiny = request.args.get('destiny') #Ponto final (chegada)
    price = request.args.get('price')
    autonomy = request.args.get('autonomy')
    steps = [] # Lista que ira ser preenchida com todos os passos do caminho
    dictPaths = {} # Dicionario com o valor de todos as rotas
    graph = dijkstra.Graph() # Lib que faz o grafico de vertex para calcular o dijkstra
    vertex = [] # Lista de vertex
    try:
        map = collection.find_one({'title':mapName})
    except:
        response = jsonify({'response':'Application could not use the DB especifield'})
        response.status_code = 500
        return response

    
    # Fazendo a iteração para preencher uma lista
    # de vertex que serão usado na lib Graph()
    for vert in map['routes']: 
        vertex.append(vert['origin'])
        vertex.append(vert['destiny'])

    # Iterando nos vertex setando para que nao se repitam
    for i in list(set(vertex)):
        graph.add_vertex(i)

    # Adicionando os vertexa lib Graph
    for vert in map['routes']:
        dictPaths[vert['origin']+vert['destiny']] = vert['distance']
        graph.add_edge(vert['origin'],vert['destiny'],vert['distance'])

    # Verificando se os pontos existem
    if origin not in vertex : 
        response = jsonify({'response': 'The parameter origin does not contain on map %s'
                            % mapName})
        response.status_code = 400
        return response
    if destiny not in vertex : 
        response = jsonify({'response': 'The parameter destiny does not contain on map %s'
                            % mapName})
        response.status_code = 400
        return response

    dijkstra.dijkstra(graph, graph.get_vertex(origin), graph.get_vertex(destiny))
    target = graph.get_vertex(destiny)
    path = [target.get_id()]
    dijkstra.shortest(target, path)

    a = 0
    while a < (len(path[::-1])-1):
        steps.append(path[::-1][a]+path[::-1][a+1])
        a=a+1

    total = 0
    for i in steps:
        total = total + dictPaths[i]

    # Apenas formatando a lista para utf-8
    pathList = []
    for i in path[::-1]:
        pathList.append(i.encode('utf-8'))
    
    
    # Fazendo o calculo do custo nessa rota de menor distancia
    cost = float(total) / float(autonomy) * float(price)

    response = []
    response.append({'Path': '%s' % pathList})
    response.append({'Total KM' : '%.2f' % total})
    response.append({'Cost' : '%.2f' % cost})
    return jsonify(data=response)
        g.add_edge('c', 'f', 2)
        g.add_edge('d', 'e', 6)
        g.add_edge('e', 'f', 9)

        print('Graph data:')
        for v in g:
            for w in v.get_connections():
                vid = v.get_id()
                wid = w.get_id()
                print(vid, wid, v.get_weight(w))

        dijkstra.dijkstra(g, g.get_vertex('a'), g.get_vertex('e'))

        target = g.get_vertex('e')
        path = [target.get_id()]
        dijkstra.shortest(target, path)
        print('The shortest path:', path[::-1])

        break

    elif (while_input == 'f' or while_input == 'F'):
        file = open("cities.txt", "r")
        for line in file:
            args = line.split()
            src = args[0]
            dest = args[1]
            weight = int(args[2])
            g.add_edge(src, dest, weight)

        print_yesno = input("Print the list of all cities? y or n: ")
        if (print_yesno == 'y'):
Beispiel #9
0
        rt = region_type(x, y)
        tools = allowed_tools[rt]
        t1, t2 = tools
        graph.add_edge(Region(x, y, t1), Region(x, y, t2), 7)
        for n in ((x + 1, y), (x, y + 1)):
            rt_n = region_type(*n)
            if rt == rt_n:
                graph.add_edge(Region(x, y, t1), Region(*n, t1), 1)
                graph.add_edge(Region(x, y, t2), Region(*n, t2), 1)
            else:
                overlap = tools.intersection(allowed_tools[rt_n]).pop()
                graph.add_edge(Region(x, y, overlap), Region(*n, overlap), 1)


start = Region(0, 0, Tool.TORCH)
end = Region(target_x, target_y, Tool.TORCH)

dijkstra(graph, graph.get_vertex(start), graph.get_vertex(end))
target = graph.get_vertex(end)
path = [target.get_id()]
shortest(target, path)
# print("The shortest path : %s" % (path[::-1]))

s = 0
for v, w in zip(path[:-1], path[1:]):
    if v.tool == w.tool:
        s += 1
    else:
        s += 7
print(s)
Beispiel #10
0
def graph_path(frm, to, res):
    start_time = datetime.now()

    g = d.Graph()

    filename = os.getcwd() + "/data/data" + str(res) + ".csv"
    with open(filename, "r") as file:
        count = 0
        for line in file.readlines():
            val = line.split("\t")
            g.add_vertex(count, float(val[1]), float(val[0]), float(val[2]))
            count += 1

    g.add_edge(0, 1, cost(g.get_vertex(0), g.get_vertex(1)))
    for node in xrange(res ** 2 - 1):
        if node >= res ** 2 - res:
            g.add_edge(node, node + 1, cost(g.get_vertex(node), g.get_vertex(node + 1)))
        else:
            g.add_edge(node, node + res, cost(g.get_vertex(node), g.get_vertex(node + res)))
            if node % res != (res - 1):
                g.add_edge(node, node + 1, cost(g.get_vertex(node), g.get_vertex(node + 1)))

    start = frm
    stop = to

    # origin = g.get_vertex(start)
    target = g.get_vertex(stop)

    d.dijkstra(g, g.get_vertex(start))
    path = [target.get_id()]
    d.shortest(target, path)
    print "The shortest path : %s" % (path[::-1])
    print "total cost: " + str(target.distance)

    elapsed = datetime.now() - start_time
    print elapsed

    x = []
    y = []
    z = []

    with open(filename, "r") as file:
        for line in file.readlines():
            val = line.split("\t")
            x.append(float(val[0]))
            y.append(float(val[1]))
            z.append(float(val[2]))

    x = np.array(x)
    y = np.array(y)
    z = np.array(z)

    xi, yi = np.linspace(x.min(), x.max(), 100), np.linspace(y.min(), y.max(), 100)
    xi, yi = np.meshgrid(xi, yi)

    rbf = scipy.interpolate.Rbf(x, y, z, function="linear")

    zi = rbf(xi, yi)
    xs = [g.get_vertex(v).lon for v in path]
    ys = [g.get_vertex(v).lat for v in path]

    plt.gcf().canvas.set_window_title("Dijkstra shortest path")

    plt.imshow(
        zi, vmin=z.min(), vmax=z.max(), origin="lower", extent=[x.min(), x.max(), y.min(), y.max()], cmap="terrain"
    )
    plt.plot(xs, ys)
    plt.plot(xs[-1], ys[-1], "g^")
    plt.plot(xs[0], ys[0], "rs")
    plt.colorbar()

    text = "path cost: " + str(target.distance) + "\n" + "time: " + str(elapsed)
    plt.suptitle(text, fontsize=14, fontweight="bold")
    plt.savefig("graph_path.png")
    plt.close()
    # plt.show()

    return [(g.get_vertex(v).lon, g.get_vertex(v).lat) for v in reversed(path)]