我已经使用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.