SNCG

Introduction

Vous êtes missionés par la Société Numérique des Chemins de Graphes (SNCG) afin d'améliorer leur application « Connect - SNCG » permettant de rechercher un itinéraire en train.

Vous choisissez de modéliser le réseau ferroviaire en utilisant des graphes orientés ayant des poids sur leurs arcs.

  • Un sommet du graphe représente une gare ferroviaire.

  • Un arc du graphe représente une liaison directe entre deux gares.

  • Un poids sur un arc représente la durée en minutes nécessaire pour réaliser le parcours.

On suppose que tous les trains sont disponibles à n'importe quelle heure.

Question

En utilisant la classe Graphe réalisée dans l'exercice précédent, implémenter la fonctionnalité pour avoir des poids sur les arcs :

  • Revoir l'implémentation choisie :

    • Si matrice d'adjacence, la valeur d'indices (i,j) indique le poids de l'arc reliant i à j.

    • Si liste ou dictionnaire d'adjacence, la liste indiquant les connexions est désormais une liste de couples (n,p) avec n le noeud de destination et p le poids de cet arc.

  • Revoir les méthodes d'ajout et de suppression d'arc pour ajouter le poids en paramètre

Préparation du réseau

Afin de faciliter la visualisation des graphes, nous allons utiliser le site https://dreampuf.github.io/GraphvizOnline/.

La syntaxe est la suivante :

1
digraph {
2
  A -> B [label=42];
3
  A -> C [label=28];
4
}

Chaque arc est représenté par une ligne indiquant le nom des deux sommets (par exemple A et B), et le poids (par exemple 42).

Les retours à la ligne et les espaces étant facultatifs, on peut rédiger également comme cela : digraph{A->B[label=42];A->C[label=28];}

Question

Rédiger la méthode __str__ de votre classe Graphe pour renvoyer le texte représentatif du graphe selon la syntaxe ci-dessus.

Pour les plus rapides : En observant le comportement du site, ouvrir directement le site web pré-rempli lors de l'appel à une fonction visualiser().

Création des lignes

Afin de consulter les durées des trains, on utilise le site web https://direkt.bahn.guru/.

On peut utiliser la barre de recherche en haut à droite pour rechercher une gare, et visualiser les temps de trajets. On suppose qu'il n'existe que les gares suivantes :

  • Lyon (Part-Dieu)

  • Bourg-en-Bresse

  • Bellegarde

  • Ambérieu

  • Annecy

  • Chambéry

  • Grenoble

  • Valence (Ville)

  • Roanne

  • St-Etienne (Châteaucreux)

  • Moulins

  • Clermont-Ferrand

Question

Créer une instance de la classe Graphe pour représenter ces gares ainsi que leurs corrections directes. On ne notera pas d'espace ou de tiret dans les noms de sommets.

Indice

1
ter = Graphe()
2
3
ter.ajout_sommet("Lyon")
4
ter.ajout_sommet("BourgEnBresse")
5
ter.ajout_sommet("Bellegarde")
6
ter.ajout_sommet("Ambérieu")
7
ter.ajout_sommet("Annecy")
8
ter.ajout_sommet("Chambéry")
9
ter.ajout_sommet("Grenoble")
10
ter.ajout_sommet("Valence")
11
ter.ajout_sommet("Roanne")
12
ter.ajout_sommet("StEtienne")
13
ter.ajout_sommet("Moulins")
14
ter.ajout_sommet("ClermontFerrand")
15
16
ter.ajout_arc("Lyon", "BourgEnBresse", 38)
17
ter.ajout_arc("Lyon", "Bellegarde", 86)
18
ter.ajout_arc("Lyon", "Ambérieu", 23)
19
ter.ajout_arc("Lyon", "Annecy", 108)
20
ter.ajout_arc("Lyon", "Chambéry", 76)
21
ter.ajout_arc("Lyon", "Grenoble", 82)
22
ter.ajout_arc("Lyon", "Valence", 67)
23
ter.ajout_arc("Lyon", "Roanne", 64)
24
ter.ajout_arc("Lyon", "StEtienne", 42)
25
ter.ajout_arc("Lyon", "Moulins", 125)
26
ter.ajout_arc("Lyon", "ClermontFerrand", 134)
27
28
ter.ajout_arc("BourgEnBresse", "Lyon", 47)
29
ter.ajout_arc("BourgEnBresse", "Bellegarde", 48)
30
ter.ajout_arc("BourgEnBresse", "Ambérieu", 18)
31
32
ter.ajout_arc("Bellegarde", "Lyon", 73)
33
ter.ajout_arc("Bellegarde", "BourgEnBresse", 46)
34
ter.ajout_arc("Bellegarde", "Ambérieu", 56)
35
ter.ajout_arc("Bellegarde", "Chambéry", 49)
36
ter.ajout_arc("Bellegarde", "Grenoble", 94)
37
ter.ajout_arc("Bellegarde", "Valence", 166)
38
39
ter.ajout_arc("Ambérieu", "Lyon", 24)
40
ter.ajout_arc("Ambérieu", "BourgEnBresse", 17)
41
ter.ajout_arc("Ambérieu", "Bellegarde", 61)
42
ter.ajout_arc("Ambérieu", "Annecy", 83)
43
ter.ajout_arc("Ambérieu", "Chambéry", 71)
44
ter.ajout_arc("Ambérieu", "StEtienne", 93)
45
46
ter.ajout_arc("Annecy", ...)
47
# À COMPLÉTER
48
49
ter.ajout_arc("Chambéry", "Lyon", 73)
50
ter.ajout_arc("Chambéry", "Bellegarde", 46)
51
ter.ajout_arc("Chambéry", "Ambérieu", 59)
52
ter.ajout_arc("Chambéry", "Annecy", 39)
53
ter.ajout_arc("Chambéry", "Grenoble", 41)
54
ter.ajout_arc("Chambéry", "Valence", 113)
55
56
ter.ajout_arc("Grenoble", "Lyon", 83)
57
ter.ajout_arc("Grenoble", "Bellegarde", 93)
58
ter.ajout_arc("Grenoble", "Annecy", 102)
59
ter.ajout_arc("Grenoble", "Chambéry", 41)
60
ter.ajout_arc("Grenoble", "Valence", 64)
61
62
ter.ajout_arc("Valence", "Lyon", 64)
63
ter.ajout_arc("Valence", "Bellegarde", 166)
64
ter.ajout_arc("Valence", "Annecy", 178)
65
ter.ajout_arc("Valence", "Chambéry", 114)
66
ter.ajout_arc("Valence", "Valence", 66)
67
68
ter.ajout_arc("Roanne", "Lyon", 63)
69
ter.ajout_arc("Roanne", "StEtienne", 70)
70
ter.ajout_arc("Roanne", "Moulins", 58)
71
ter.ajout_arc("Roanne", "ClermontFerrand", 76)
72
73
ter.ajout_arc("StEtienne", "Lyon", 41)
74
ter.ajout_arc("StEtienne", "Ambérieu", 94)
75
ter.ajout_arc("StEtienne", "Roanne", 69)
76
77
ter.ajout_arc("Moulins", "Lyon", 125)
78
ter.ajout_arc("Moulins", "Roanne", 59)
79
ter.ajout_arc("Moulins", "ClermontFerrand", 58)
80
81
ter.ajout_arc("ClermontFerrand", "Lyon", 134)
82
ter.ajout_arc("ClermontFerrand", "Roanne", 75)
83
ter.ajout_arc("ClermontFerrand", "Moulins", 56)

Calcul des itinéraires

Maintenant que l'on dispose d'un réseau ferré en place, il ne reste plus qu'à lancer notre application de recherche d'itinéraires !!

Question

Implémentez une méthode visite_dijkstra, telle que :

  • Entrées :

    • sommet : le sommet à visiter

    • marques : la liste représentant les sommets déjà visité

    • distances : le dictionnaire représentant les distances actuelles associées à chaque sommet

  • Sortie : Aucune

  • Effet : mets à jour les structures marques et distances, après la visite de sommet

Question

Implémentez une méthode dijkstra, telle que :

  • Entrées :

    • sommet : le sommet depuis lequel effectuer l'algorithme de Dijkstra

  • Sortie : Un dictionnaire représentant la distance entre sommet et les autres

Question

Modifiez une copie de dijkstra et visite_dijkstra pour créer une fonction chemin_entre_gare qui trouve le plus court chemin entre deux gares données en paramètre d'une fonction.

Version finale

Dans la pratique, il faut compter au moins dix minutes de correspondance dans chaque gare afin d'être sûr d'avoir le temps de changer de quai.

Question

Réécrire l'algorithme précédent pour prendre en compte cette nouvelle règle.