Exercice 3 - Graphes : modélisation, implémentati… · Bac Numérique et Sciences Informatiques Sujets zéro et spécimens sujet 2024 (sujet 1)

Thème : Graphes : modélisation, implémentations et parcours · Tiré du sujet Sujet 1 (2024)

Énoncé

EXERCICE 3 (8 points)

Cet exercice porte sur les graphes, les algorithmes sur les graphes, les bases de données et les requêtes SQL.

La société CarteMap développe une application de cartographie-GPS qui permettra aux automobilistes de définir un itinéraire et d’être guidés sur cet itinéraire. Dans le cadre du développement d’un prototype, la société CarteMap décide d’utiliser une carte fictive simplifiée comportant uniquement 7 villes: A, B, C, D, E, F et G et 9 routes (toutes les routes sont considérées à double sens).

Voici une description de cette carte:

A est relié à B par une route de 4 km de long;

A est relié à E par une route de 4 km de long;

B est relié à F par une route de 7 km de long;

B est relié à G par une route de 5 km de long;

C est relié à E par une route de 8 km de long;

C est relié à D par une route de 4 km de long;

D est relié à E par une route de 6 km de long;

D est relié à F par une route de 8 km de long;

F est relié à G par une route de 3 km de long.

Voici une description de cette carte:

A est relié à B par une route de 4 km de long;

A est relié à E par une route de 4 km de long;

B est relié à F par une route de 7 km de long;

B est relié à G par une route de 5 km de long;

C est relié à E par une route de 8 km de long;

C est relié à D par une route de 4 km de long;

D est relié à E par une route de 6 km de long;

D est relié à F par une route de 8 km de long;

F est relié à G par une route de 3 km de long.

1.

Représenter ces villes et ces routes sur sa copie en utilisant un graphe pondéré, nommé G1.

2.

Déterminer le chemin le plus court possible entre les villes A et D.

3.

Définir la matrice d'adjacence du graphe G1 (en prenant les sommets dans l'ordre alphabétique).

Dans la suite de l'exercice, on ne tiendra plus compte de la distance entre les différentes villes et le graphe, non pondéré et représenté ci-dessous, sera utilisé:

Chaque sommet est une ville, chaque arête est une route qui relie deux villes.

4.

Proposer une implémentation en Python du graphe G2 à l'aide d'un dictionnaire.

5.

Proposer un parcours en largeur du graphe G2 en partant de A.

La société CarteMap décide d'implémenter la recherche des itinéraires permettant de traverser le moins de villes possible. Par exemple, dans le cas du graphe G2, pour aller de A à E, l'itinéraire A-C-E permet de traverser une seule ville (la ville C), alors que l'itinéraire A-H-G-E oblige l'automobiliste à traverser 2 villes (H et G).

Le programme Python suivant a donc été développé (programme p1):

1 tab_itineraires=[]

2 def cherche_itineraires(G, start, end, chaine=[]):

3 chaine = chaine + [start]

4 if start == end:

5 return chaine

6 for u in G[start]:

7 if u not in chaine:

8 nchemin = cherche_itineraires(G, u, end, chaine)

9 if len(nchemin) != 0:

10 tab_itineraires.append(nchemin)

11 return []

12

13 def itineraires_court(G,dep,arr):

14 cherche_itineraires(G, dep, arr)

15 tab_court =...

16 mini = float('inf')

17 for v in tab_itineraires:

18 if len(v) <=...:

19 mini =...

20 for v in tab_itineraires:

21 if len(v) == mini:

22 tab_court.append(...)

23 return tab_court

La fonction itineraires_court prend en paramètre un graphe G, un sommet de départ dep et un sommet d'arrivée arr. Cette fonction renvoie une liste Python contenant tous les itinéraires pour aller de dep à arr en passant par le moins de villes possible.

Exemple (avec le graphe G2):

itineraires_court(G2, 'A', 'F')

>>> [['A', 'B', 'I', 'F'], ['A', 'H', 'G', 'F'], ['A', 'H', 'I', 'F']]

On rappelle les points suivants:

la méthode append ajoute un élément à une liste Python; par exemple, tab.append(el) permet d'ajouter l'élément el à la liste Python tab;

en python, l'expression ['a'] + ['b'] vaut ['a', 'b'];

en python float('inf') correspond à l'infini.

6.

Expliquer pourquoi la fonction cherche_itineraires peut être qualifiée de fonction récursive.

7.

Expliquer le rôle de la fonction cherche_itineraires dans le programme p1.

8.

Compléter la fonction itineraires_court:

Ligne 15: tab_court =

Ligne 18: if len(v) <=

:

Ligne 19: mini =

Ligne 22: tab_court.append(

)

Les ingénieurs sont confrontés à un problème lors du test du programme p1. Voici les résultats obtenus en testant dans la console la fonction itineraires_court deux fois de suite (sans exécuter le programme entre les deux appels à la fonction itineraires_court):

exécution du programme p1

itineraires_court(G2, 'A', 'E')

>>> [['A', 'C', 'E']]

itineraires_court(G2, 'A', 'F')

>>> [['A', 'C', 'E']]

alors que dans le cas où le programme p1 est de nouveau exécuté entre les 2 appels à la fonction itineraires_court, on obtient des résultats corrects:

exécution du programme p1

itineraires_court(G2, 'A', 'E')

>>> [['A', 'C', 'E']]

exécution du programme p1

itineraires_court(G2, 'A', 'F')

>>> [['A', 'B', 'I', 'F'], ['A', 'H', 'G', 'F'], ['A', 'H', 'I', 'F']]

9.

Donner une explication au problème décrit ci-dessus. Vous pourrez vous appuyer sur les tests donnés précédemment.

Énoncé: Exercice 3 - Graphes : modélisation, implémentati… · Bac Numérique et Sciences Informatiques Sujets zéro et spécimens sujet 2024 (sujet 1)

Corrigé

Corrigé proposé par AprenAI (non officiel)

1. Représenter ces villes et ces routes sur sa copie en utilisant un graphe pondéré, nommé G1.

Réponse : Un graphe non orienté comportant 7 sommets étiquetés A, B, C, D, E, F, G et 9 arêtes avec leurs poids respectifs : - (A, B) de poids 4 - (A, E) de poids 4 - (B, F) de poids 7 - (B, G) de poids 5 - (C, E) de poids 8 - (C, D) de poids 4 - (D, E) de poids 6 - (D, F) de poids 8 - (F, G) de poids 3

2. Déterminer le chemin le plus court possible entre les villes A et D.

Réponse : A - E - D (longueur 10 km)

3. Définir la matrice d'adjacence du graphe G1 (en prenant les sommets dans l'ordre alphabétique).

Réponse : Matrice binaire d'adjacence (ou matrice des poids) : [ [0, 1, 0, 0, 1, 0, 0], [1, 0, 0, 0, 0, 1, 1], [0, 0, 0, 1, 1, 0, 0], [0, 0, 1, 0, 1, 1, 0], [1, 0, 1, 1, 0, 0, 0], [0, 1, 0, 1, 0, 0, 1], [0, 1, 0, 0, 0, 1, 0] ]

4. Proposer une implémentation en Python du graphe G2 à l'aide d'un dictionnaire.

Réponse : ```python G2 = { 'A': ['B', 'C', 'H'], 'B': ['A', 'I'], 'C': ['A', 'D', 'E'], 'D': ['C', 'E'], 'E': ['C', 'D', 'G'], 'F': ['G', 'I'], 'G': ['E', 'F', 'H'], 'H': ['A', 'G', 'I'], 'I': ['B', 'F', 'H'] } ```

5. Proposer un parcours en largeur du graphe G2 en partant de A.

Réponse : A - B - C - H - I - D - E - G - F

6. Expliquer pourquoi la fonction cherche_itineraires peut être qualifiée de fonction récursive.

Réponse : La fonction cherche_itineraires est récursive car elle s'appelle elle-même à la ligne 8 : nchemin = cherche_itineraires(G, u, end, chaine).

Les réponses des 6 questions restantes et l’explication pas à pas sont réservées aux membres Premium. Premium

Résous-le ici : correction automatique, indices et corrigé détaillé.