import numpy as np
from scipy.sparse.csgraph import dijkstra
from scipy.sparse import csr_matrix
# Fonction pour créer la matrice d'adjacence du graphe
def creer_represetation_matricielle():
matrice = np.zeros((9, 9))
matrice[0][1] = 680
matrice[0][2] = 360
matrice[0][3] = 300
matrice[1][4] = 90
matrice[1][5] = 100
matrice[3][1] = 160
matrice[3][6] = 720
matrice[3][7] = 220
matrice[4][3] = 190
matrice[4][5] = 110
matrice[4][6] = 210
matrice[5][6] = 120
matrice[5][8] = 400
matrice[6][8] = 130
matrice[7][6] = 630
matrice[7][8] = 550
return matrice
# Fonction pour formater les chaînes ou nombres pour l'affichage
def formater(n):
return '{:10s}'.format(str(n))
# Fonction d'affichage de la matrice d'adjacence
def afficher_matrice(matrice, sommets):
print("La matrice est:")
print("_____" * len(sommets))
print(formater(' '), end="")
for i in range(len(sommets)):
print(formater(sommets[i]), end="")
print()
print("_____" * len(sommets))
for i in range(len(matrice)):
print(formater(sommets[i]), end="")
for j in range(len(matrice[i])):
val = "-" if matrice[i][j] == 0 else int(matrice[i][j])
print(formater(val), end="")
print()
# Fonction qui applique l'algorithme de Dijkstra
def algo_dijkstra(matrice):
graphe = csr_matrix(matrice)
distances, indices_precedents = dijkstra(graphe, return_predecessors=True, indices=0)
return distances, indices_precedents
# Affichage des distances minimales depuis le sommet source
def afficher_distance_minimales(distances, indices_precedents, sommets):
print("\nLes longueurs minimales à partir de", sommets[0], "sont :")
print("_____" * len(sommets))
for i in range(len(sommets)):
print(formater(sommets[i]), end="")
print("\n" + "_____" * len(sommets))
for i in range(len(sommets)):
dist = distances[i]
indice = indices_precedents[i]
if indice >= 0:
precedent = sommets[indice]
s = formater(str(int(dist)) + ":" + precedent)
print(s, end="")
else:
print(formater("-"), end="")
print()
# Affichage du chemin minimal du sommet source à la destination
def afficher_chemin_minimales(distances, indices_precedents, sommets):
print("\nLe chemin critique allant de", sommets[0], "à", sommets[-1], "est :")
chemin = [sommets[-1]]
indice = len(sommets) - 1
while indices_precedents[indice] != -9999:
indice = indices_precedents[indice]
chemin.append(sommets[indice])
print(" --> ".join(reversed(chemin)))
# Programme principal
sommets = ['G', 'Ha', 'L', 'A', 'B', 'He', 'O', 'E', 'S']
matrice = creer_represetation_matricielle()
afficher_matrice(matrice, sommets)
distances, indices_precedents = algo_dijkstra(matrice)
afficher_distance_minimales(distances, indices_precedents, sommets)
afficher_chemin_minimales(distances, indices_precedents, sommets)