NSI (terminale) · Chapitre 4 · Exercice de TD
Problème — Ordonnancement de tâches et détection d'interblocage
Les graphes · niveau 3 (difficile)
Énoncé
Problème — Ordonnancement de tâches et détection d'interblocage.
Un projet comporte des tâches, certaines ne pouvant commencer qu'après d'autres. On modélise les dépendances par un graphe orienté : un arc signifie « la tâche doit être réalisée avant la tâche ». Un ordonnancement valide n'existe que si le graphe est acyclique.
- Écrire
ordonnancable(taches)indiquant si un ordre de réalisation existe (absence de cycle). - Si oui, écrire
ordre_taches(taches)renvoyant un ordre valide (tri topologique).
Corrigé
La première question est une détection de cycle dans un graphe orienté (coloriage en trois états). La seconde réalise un tri topologique fondé sur les degrés entrants (algorithme de Kahn) : on retire répétitivement un sommet sans dépendance restante.
from collections import deque
def ordonnancable(taches):
BLANC, GRIS, NOIR = 0, 1, 2
couleur = {u: BLANC for u in taches}
def explorer(u):
couleur[u] = GRIS
for v in taches[u]:
if couleur[v] == GRIS:
return False # cycle : non ordonnancable
if couleur[v] == BLANC and not explorer(v):
return False
couleur[u] = NOIR
return True
return all(explorer(u) for u in taches if couleur[u] == BLANC)
def ordre_taches(taches):
# calcul des degres entrants
entrant = {u: 0 for u in taches}
for u in taches:
for v in taches[u]:
entrant[v] += 1
# file des taches sans dependance
file = deque(u for u in taches if entrant[u] == 0)
ordre = []
while file:
u = file.popleft()
ordre.append(u)
for v in taches[u]:
entrant[v] -= 1
if entrant[v] == 0:
file.append(v)
if len(ordre) != len(taches):
return None # presence d'un cycle
return ordre
taches = {
"fondations": ["murs"],
"murs": ["toit", "fenetres"],
"toit": [],
"fenetres": ["peinture"],
"peinture": [],
}
print(ordonnancable(taches)) # True
print(ordre_taches(taches))
# ['fondations', 'murs', 'toit', 'fenetres', 'peinture']
Les deux algorithmes reposent sur un parcours en . Le tri topologique de Kahn renvoie None si un cycle empêche d'ordonnancer toutes les tâches, détectant ainsi un éventuel interblocage.
100 % gratuit
Essaie le suivant avec le tuteur
- L'exercice suivant avec le tuteur, sans compte : il guide pas à pas, sans donner la réponse
- 8 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le podcast et la vidéo du chapitre : 2 minutes d'écoute sans compte
Sans compte : le cours, le premier QCM, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.