info@mp2i-pv
[TP emprunté à Nicolas Pécheux, qui l’avait lui-même adapté d’un énoncé d’Émeric Tourniaire; je les remercie pour ce partage]
Dans ce TP on se propose d’étudier un stratagème pour économiser quelque précieux deniers lors de nos trajets sur l’autoroute.
Le fichier tarifs-APRR-2022.pdf contient les
tarifs du réseau APRR en vigueur au 1er février 2022. On peut modéliser cela
avec un graphe pondéré dont les sommets représentent les gares de
péages et où les poids correspondent, par exemple, aux distances ou
encore au prix du péage entre deux gares de péage.
Dans tout ce TP on suppose que le nombre de sommets est une constante
N fixée et que les noms des gares de péages contiennent au plus
22 caractères.
#define N 164
#define MAX 23
Pourquoi définir une constante MAX égale à 23 plutôt qu’à 22 ?
Le fichier graph.txt contient le graphe du réseau de péages autoroutiers. Chaque ligne comporte l’identifiant de la gare de péage de départ, l’identifiant de la gare de péage d’arrivée, la distance entre ces deux péages ainsi que le prix à payer pour un véhicule léger. Le fichier noms.txt permet d’associer à chaque identifiant le nom de la gare de péage correspondant. Des fonctions permettant de lire ces deux fichiers vous sont données dans le fichier tp29.c.
Quel est le nom de la gare de péage d’identifiant 37 ? Quel est
l’identifiant de la gare de péage de nom "VILLEFRANCHE-LIMAS" ?
Dans ce sujet, on représente les graphes pondérés par des matrices
d’adjacences. On utilisera des tableaux statiques bidimensionnels de
taille fixe N. On aura ainsi une matrice d’adjacence pour le
graphe correspondant aux distances et une pour celui correspondant aux
prix. La case d’indice (i, j) comporte ainsi la distance ou le prix
de l’arc (i, j). La matrice d’adjacence comporte des zéros sur la
diagonale et la valeur infini dans la case (i, j) si l’arc (i,
j) n’existe pas. On modélise l’infini en C par la valeur -1,
ce qui ne pose pas de problème puisque tous les poids seront positif.
Pour fonctionner correctement, la fonction read_graph nécessite
que les matrices d’adjacences passées en argument soient correctement
initialisées, avec des 0 sur la diagonale et des -1 partout
ailleurs. Écrire cette fonction void init(double mat[N][N]).
Quel est le tarif pour aller du péage 37 au péage 90 ? Quel est le tarif de péage le plus cher et à quel itinéraire correspond-il ?
Que devient le prix pour aller du péage 37 au péage 90 si on sort au
péage 3 et qu’on retourne aussitôt sur l’autoroute ("AUXERRE NORD")
comme sur le dessin ci-dessous ? Qu’en pensez-vous ?

Sans regarder votre cours, essayer de retrouver l’idée puis l’équation de récurrence de l’algorithme de Floyd-Warshall puis vérifier à l’aide de votre cours.
Implémenter void floyd_warshall(double best[N][N], double
prix[N][N]) par l’algorithme de Floyd-Warshall en stockant
le résultat de la matrice des plus courts chemins dans la matrice
best passée en paramètre. Faire très attention aux infinis
représentés par des -1.
Quelle est la complexité spatiale et temporelle de cet algorithme ?
Vérifier que le prix minimal pour aller du péage 37 au péage 90 est de 31€90. Quelle est l’économie réalisée ?
Modifier votre algorithme pour mémoriser une matrice de liaison
int pred[N][N] que l’on passera en paramètre à la fonction
précédente.
Afficher les gares de péages auxquelles il faut sortir (et immédiatement rerentrer) pour obtenir la ristourne ci-dessus.
Quelle est l’économie maximale que l’on peut ainsi obtenir sur tout le réseau et sur quel trajet ?
Implémenter en C l’algorithme de
Dijsktra et retrouver les résultats précédents en appliquant
cet algorithme à partir de chaque sommet. Quelle est la complexité
obtenue ?