Dijkstra用于真实世界的数据

时间:2018-12-05 21:52:02

标签: python dijkstra

我已经使用python实现Dijkstra算法,以从给定的Edges和Vertices中找到最短路径。我想将其应用于真实数据,如何将其添加到net中找到的代码中,并进行一些修改:

inf = float('inf') #distance infinie
Edge = namedtuple('Edge', 'debut, fin, cout') # edge pour definir le poids entre debut et fin

class Graph(): 
    def __init__(self, edges): #init constructeur par defaut
        self.edges = edges2 = [Edge(*edge) for edge in edges] 
        self.vertices = set(sum(([e.debut, e.fin] for e in edges2), [])) # Concatenation des edges, set() rend l'unicite
    def dijkstra(self, source, dest):
        assert source in self.vertices 
        dist = {node: inf for node in self.vertices} # donner une distance infinie a tous les otres nodes
        preced = {node: None for node in self.vertices} 
        dist[source] = 0                             # Donner une distance nulle a la source
        q = self.vertices.copy()                     # Stocker tous les noeuds non vistes dans q

        voisins = {node: set() for node in self.vertices} # Voisins de chaque noeud.Crée un dictionnaire où chaque clé est un nœud et chaque valeur un ensemble vide
        for debut, fin, cout in self.edges:
            voisins[debut].add((fin, cout))
        #pp(voisins)

        while q:
            u = min(q, key=lambda node: dist[node]) # Prendre le neoud qui a le plus petits distance parmi les non visite
            if dist[u] == inf or u == dest:         # Si il n y a pas de sommets ou si source=destination on arrete
                break
            for v, cout in voisins[u]:              # trouver les voisins de u non visite et calcler leur distance a partir de u.
                alt = dist[u] + cout
                if alt < dist[v]: #Compare the newly calculated distance to the assigned and save the smaller one.
                    dist[v] = alt
                    preced[v] = u
            # 5. Marquer u comme vister et lenlever de la liste.
            q.remove(u)

        #pp(preced)
        s, u = deque(), dest 
        while preced[u]:     # ie tantquil n'est pas vide
            s.appendleft(u)
            u = preced[u]
        s.appendleft(u)
        return s

# Application en cas reel.

0 个答案:

没有答案