Exercice 1 · Bac Numérique et Sciences Informatiques Centres étrangers (Afrique) 2024 (jour 1)
Thème : Graphes : modélisation, implémentations et parcours · Tiré du sujet Jour 1 (2024)
Énoncé
EXERCICE 1 (6 points)
Cet exercice porte sur la programmation Python, la programmation dynamique, les graphes et les réseaux.
On cherche à lutter contre un virus informatique qui essaie de contourner les protocoles de sécurité en migrant régulièrement vers un autre ordinateur, en choisissant à chaque fois au hasard sa nouvelle cible parmi les ordinateurs accessibles. On cherche à savoir quels ordinateurs protéger afin de lutter de manière la plus efficace possible avec des ressources limitées.
On considère le réseau informatique suivant, composé de 5 ordinateurs numérotés: 0, 1, 2, 3 et 4.
1.
On représente ce réseau informatique par un graphe que l'on stocke sous forme de listes de voisins. Compléter la définition de la variable voisins.
voisins = [[1, 2, 3, 4],
[0, 2, 3],
[0, 1],
[...],
[...]]
On ajoute au réseau actuel un sixième ordinateur, numéroté 5. Cet ordinateur n'est accessible que des ordinateurs numérotés 0 et 2.
2.
Dessiner le nouveau graphe.
3.
Donner la nouvelle définition de la variable voisins.
4.
Compléter la fonction voisin_alea qui prend en paramètre un graphe voisins sous forme de listes de voisins et un entier s représentant un sommet et qui renvoie un entier représentant un voisin de s choisi aléatoirement. On pourra utiliser la fonction random.randrange(n) qui renvoie un nombre aléatoire entre 0 inclus et n exclus.
def voisin_alea(voisins, s):
On donne la fonction marche_alea suivante:
def marche_alea(voisins, i, n):
if n == 0:
return i
return marche_alea(voisins, voisin_alea(voisins, i), n-1) 5.
Justifier que la fonction marche_alea est une fonction récursive.
6.
Décrire ce que modélise cette fonction, en rapport avec le contexte de l'exercice.
7.
Compléter la fonction simule qui simule n_tests fois le déplacement d'un virus pendant n_pas étapes, démarrant au sommet i, et qui renvoie une liste contenant en position j le nombre de fois que le virus a terminé son parcours au sommet j, divisé par n_tests.
def simule(voisins, i, n_tests, n_pas):
results = [0] * len(voisins)
8.
L'appel simule(voisins, 4, 1000, 1000) renvoie la valeur suivante:
[0.328, 0.195, 0.18, 0.12, 0.059, 0.118].
Déduire de ce résultat l'ordinateur du réseau qu'il est le plus rentable de protéger.
Au début, on suppose que le virus n'est présent que sur un ordinateur. À chaque étape, il contamine tous ses voisins non déjà contaminés. On cherche à savoir combien de temps prend ce virus pour se propager à tout le réseau.
9.
Un graphe voisins représente un réseau, et s représente un sommet de départ. Proposer un algorithme pour déterminer le temps, en étape, que met un virus à se propager dans l'intégralité d'un réseau.

Corrigé
Corrigé proposé par AprenAI (non officiel)
1. Ligne 4 : voisins du sommet 3
Réponse : [0, 1]
1. Ligne 5 : voisins du sommet 4
Réponse : [0]
2. Dessiner le nouveau graphe.
Réponse : Le nouveau graphe comprend les 5 sommets initiaux (0, 1, 2, 3, 4) avec leurs arêtes initiales, plus un sommet 5 relié uniquement aux sommets 0 et 2 par deux arêtes : l'arête (5, 0) et l'arête (5, 2).
3. Donner la nouvelle définition de la variable voisins.
Réponse : ```python voisins = [[1, 2, 3, 4, 5], [0, 2, 3], [0, 1, 5], [0, 1], [0], [0, 2]] ```
4. Compléter la fonction voisin_alea.
Réponse : ```python nb = len(voisins[s]) r = random.randrange(nb) return voisins[s][r] ```
5. Justifier que la fonction marche_alea est une fonction récursive.
Réponse : La fonction marche_alea est récursive car son corps contient un appel à elle-même (ligne 4 : `return marche_alea(...)`), et elle possède un cas de base qui arrête les appels récursifs lorsque `n == 0`.
Les réponses des 5 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é.
‹ Exercice 3 - Graphes · Centres étrangers (Afrique) 2025 (jour 2)