Chapitre 820 minIntermédiaire
Ordonnancement : la méthode MPM et le chemin critique
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- construire le graphe MPM d'un projet ;
- calculer les dates de début au plus tôt et au plus tard ;
- trouver les tâches critiques, le chemin critique et la durée minimale ;
- mesurer l'effet d'un changement de durée.
4 exercices corrigés1 schéma
Ordonnancer un projet, c'est fixer les dates de ses tâches en respectant leurs contraintes d'antériorité (telle tâche ne peut commencer qu'une fois telle autre finie), de façon à terminer le projet au plus tôt. La méthode MPM (méthode des potentiels Métra) représente chaque tâche par un sommet d'un graphe valué, calcule pour chacune une date de début au plus tôt et une date de début au plus tard, et en déduit la durée minimale du projet et son chemin critique : la suite de tâches qui ne tolèrent aucun retard. Ce chapitre déroule la méthode en cinq étapes sur un projet informatique complet, comme le demandent les exercices d'ordonnancement de l'E3.
Ordonnancement, MPM et PERT
La méthode MPM a été mise au point en France par le mathématicien Bernard Roy en 1958. La même année, aux États-Unis, la marine américaine développait la méthode PERT pour planifier son programme de missiles Polaris. Les deux méthodes donnent les mêmes résultats ; elles diffèrent par la façon de dessiner le graphe : MPM met les tâches sur les sommets, PERT sur les arcs (chapitre 10). Le programme laisse le choix entre les deux ; ce cours détaille MPM, la plus simple à dessiner, et montre PERT ensuite.
Le graphe d'un projet est toujours sans circuit : une tâche ne peut pas attendre, même indirectement, sa propre fin. Toute la méthode repose sur ce fait et sur les deux outils des chapitres précédents : les niveaux (chapitre 5) et le chemin de valeur maximale (chapitre 6).
Le projet fil rouge et le tableau des tâches
Une PME remplace son vieux serveur de fichiers. Le technicien chargé du projet a listé les tâches, leur durée en jours ouvrés et, pour chacune, les tâches qui doivent être terminées avant qu'elle commence (ses tâches antérieures, ou prédécesseurs) :
| Tâche | Description | Durée (jours) | Tâches antérieures |
|---|---|---|---|
| A | Recueil des besoins | 3 | — |
| B | Rédaction du cahier des charges | 2 | A |
| C | Commande et livraison du serveur | 6 | A |
| D | Choix de la solution de sauvegarde | 2 | B |
| E | Installation et configuration du serveur | 3 | C |
| F | Paramétrage des sauvegardes | 2 | D, E |
| G | Migration des données | 4 | E |
| H | Rédaction de la documentation utilisateur | 2 | B |
| I | Tests et recette | 2 | F, G |
| J | Mise en production | 1 | H, I |
Les tâches antérieures indiquées sont les antériorités immédiates : F attend D et E, donc aussi, indirectement, B, C et A, mais on ne les écrit pas.
Étape 1 : les niveaux des tâches
On détermine les niveaux du graphe des antériorités, avec la méthode du tableau des prédécesseurs. Ils serviront à placer les tâches en colonnes et à faire les calculs dans le bon ordre.
| Tâche | Antérieures | Niveau 0 | Niveau 1 | Niveau 2 | Niveau 3 | Niveau 4 | Niveau 5 |
|---|---|---|---|---|---|---|---|
| A | — | A | |||||
| B | A | B | |||||
| C | A | C | |||||
| D | B | D | |||||
| E | C | E | |||||
| H | B | H | |||||
| F | D, E | F | |||||
| G | E | G | |||||
| I | F, G | I | |||||
| J | H, I | J |
Niveaux : N₀ = {A}, N₁ = {B, C}, N₂ = {D, E, H}, N₃ = {F, G}, N₄ = {I}, N₅ = {J}.
Il est utile aussi de dresser le tableau des successeurs, qu'on lit en retournant les antériorités ; il servira pour les dates au plus tard :
| Tâche | A | B | C | D | E | F | G | H | I | J |
|---|---|---|---|---|---|---|---|---|---|---|
| Successeurs | B, C | D, H | E | F | F, G | I | I | J | J | — |
Étape 2 : construire le graphe MPM
Les conventions du graphe MPM :
- chaque tâche est un sommet, représenté par un rectangle ;
- on ajoute deux sommets fictifs, Début et Fin, qui ne sont pas des tâches (durée nulle) ;
- un arc va de chaque tâche vers chacune de ses tâches suivantes ; il porte la durée de la tâche d'origine (le temps qu'il faut attendre, après le début de x, pour pouvoir commencer y) ;
- Début est relié aux tâches sans antériorité (arcs de valeur 0), et chaque tâche sans successeur est reliée à Fin (arc portant sa durée) ;
- les sommets sont placés en colonnes, niveau par niveau.
Dans chaque rectangle, on écrira deux nombres : la date de début au plus tôt t et la date de début au plus tard T de la tâche. Beaucoup de corrigés écrivent aussi la durée de la tâche dans son rectangle, à côté de son nom, plutôt que sur chacun des arcs qui en partent : c'est la même information, et le dessin reste lisible.
Étape 3 : les dates de début au plus tôt
La date de début au plus tôt t(x) d'une tâche est la date la plus proche à laquelle elle peut commencer, toutes ses tâches antérieures étant finies. Le projet commence à la date 0.
On prend le maximum parce qu'une tâche doit attendre que toutes ses tâches antérieures soient finies : c'est la plus tardive qui décide. C'est exactement la recherche du chemin de valeur maximale du chapitre 6.
| Tâche | Calcul | t |
|---|---|---|
| A | aucune antériorité | 0 |
| B | t(A) + 3 = 0 + 3 | 3 |
| C | t(A) + 3 | 3 |
| D | t(B) + 2 = 3 + 2 | 5 |
| E | t(C) + 6 = 3 + 6 | 9 |
| H | t(B) + 2 | 5 |
| F | max [ t(D) + 2 ; t(E) + 3 ] = max [ 7 ; 12 ] | 12 |
| G | t(E) + 3 | 12 |
| I | max [ t(F) + 2 ; t(G) + 4 ] = max [ 14 ; 16 ] | 16 |
| J | max [ t(H) + 2 ; t(I) + 2 ] = max [ 7 ; 18 ] | 18 |
| Fin | t(J) + 1 | 19 |
Le projet dure au minimum 19 jours ouvrés.
Étape 4 : les dates de début au plus tard
La date de début au plus tard T(x) d'une tâche est la date la plus tardive à laquelle elle peut commencer sans retarder la fin du projet. On la calcule en partant de la fin.
On prend le minimum parce que la tâche x doit être finie avant le début au plus tard de chacune de ses tâches suivantes : c'est la plus exigeante qui décide.
| Tâche | Calcul | T |
|---|---|---|
| Fin | = t(Fin) | 19 |
| J | T(Fin) − 1 = 19 − 1 | 18 |
| I | T(J) − 2 = 18 − 2 | 16 |
| H | T(J) − 2 | 16 |
| F | T(I) − 2 | 14 |
| G | T(I) − 4 = 16 − 4 | 12 |
| E | min [ T(F) ; T(G) ] − 3 = min [ 14 ; 12 ] − 3 | 9 |
| D | T(F) − 2 = 14 − 2 | 12 |
| C | T(E) − 6 = 9 − 6 | 3 |
| B | min [ T(D) ; T(H) ] − 2 = min [ 12 ; 16 ] − 2 | 10 |
| A | min [ T(B) ; T(C) ] − 3 = min [ 10 ; 3 ] − 3 | 0 |
On retrouve bien T(A) = 0, la date de début du projet.
Étape 5 : tâches critiques et chemin critique
Une tâche est critique quand sa date au plus tôt est égale à sa date au plus tard : t(x) = T(x). Elle n'a aucune marge : le moindre retard sur elle retarde la fin du projet.
| Tâche | A | B | C | D | E | F | G | H | I | J |
|---|---|---|---|---|---|---|---|---|---|---|
| t | 0 | 3 | 3 | 5 | 9 | 12 | 12 | 5 | 16 | 18 |
| T | 0 | 10 | 3 | 12 | 9 | 14 | 12 | 16 | 16 | 18 |
| Critique ? | oui | non | oui | non | oui | non | oui | non | oui | oui |
Les tâches critiques sont A, C, E, G, I et J. Un chemin critique est un chemin de Début à Fin qui ne passe que par des tâches critiques : ici Début → A → C → E → G → I → J → Fin. Sa valeur est la somme des durées de ses tâches : 3 + 6 + 3 + 4 + 2 + 1 = 19, la durée minimale du projet. C'est le chemin de valeur maximale du graphe.
Interpréter les résultats
Les sujets demandent presque toujours d'interpréter, avec les mots du contexte :
- « La durée minimale de réalisation du projet est de 19 jours. »
- « Les tâches critiques sont le recueil des besoins, la commande du serveur, son installation, la migration des données, les tests et la mise en production : un retard sur l'une d'elles retarde d'autant la mise en production. »
- « La rédaction du cahier des charges (B) peut commencer au plus tôt le jour 3 et au plus tard le jour 10 sans retarder le projet. »
Et si une durée change ? On refait les calculs à partir de la tâche modifiée, ou on raisonne :
- si la migration des données (G, critique) dure 6 jours au lieu de 4, le chemin critique s'allonge de 2 jours : le projet dure 21 jours ;
- si le choix de la sauvegarde (D, non critique, t = 5, T = 12) dure 9 jours au lieu de 2, D finit au plus tôt à 14, F commence à 14 au lieu de 12 et finit à 16, date où G finit aussi : I commence toujours à 16, le projet dure toujours 19 jours. Mais D, B et F deviennent critiques : il y a maintenant deux chemins critiques, et plus aucune réserve sur cette branche.
En Python : les dates d'un projet
def dates_mpm(taches):
"""taches : dict tâche -> (durée, liste des tâches antérieures),
les tâches étant données dans un ordre compatible avec les niveaux.
Renvoie (durée du projet, dates au plus tôt, dates au plus tard)."""
tot = {}
for x, (d, anterieures) in taches.items():
tot[x] = max((tot[p] + taches[p][0] for p in anterieures), default=0)
fin = max(tot[x] + d for x, (d, _) in taches.items())
suivantes = {x: [y for y, (_, ant) in taches.items() if x in ant] for x in taches}
tard = {}
for x in reversed(list(taches)):
d = taches[x][0]
tard[x] = min((tard[s] for s in suivantes[x]), default=fin) - d
return fin, tot, tard
projet = {"A": (3, []), "B": (2, ["A"]), "C": (6, ["A"]), "D": (2, ["B"]),
"E": (3, ["C"]), "H": (2, ["B"]), "F": (2, ["D", "E"]),
"G": (4, ["E"]), "I": (2, ["F", "G"]), "J": (1, ["H", "I"])}
fin, tot, tard = dates_mpm(projet)
print(fin) # 19
print([x for x in projet if tot[x] == tard[x]]) # ['A', 'C', 'E', 'G', 'I', 'J']
Les logiciels de gestion de projet (GanttProject, ProjectLibre, Microsoft Project) font exactement ces calculs quand tu saisis des tâches, des durées et des liens « fin-début ». Le chapitre Planifier : WBS, diagramme de Gantt et chemin critique du cours Gestion de projet montre comment ce planning s'intègre à la conduite d'un projet informatique, du découpage en tâches au suivi de l'avancement.
Exercices
Exercice 1 sur 4 Un petit projet Réussi À revoir
Un projet comporte six tâches :
| Tâche | A | B | C | D | E | F |
|---|---|---|---|---|---|---|
| Durée (jours) | 2 | 4 | 3 | 5 | 2 | 1 |
| Tâches antérieures | — | — | A | A, B | C | D, E |
- Détermine les niveaux des tâches.
- Construis le graphe MPM et calcule les dates au plus tôt et au plus tard.
- Donne la durée minimale du projet et le chemin critique.
Voir la réponseMasquer la réponse de l'exercice 1
- N₀ = {A, B}, N₁ = {C, D} (D attend A et B, tous deux de niveau 0), N₂ = {E}, N₃ = {F}.
- Graphe : Début → A (0), Début → B (0) ; A → C (2), A → D (2), B → D (4) ; C → E (3) ; D → F (5), E → F (2) ; F → Fin (1).
Dates au plus tôt : t(A) = t(B) = 0 ; t(C) = 0 + 2 = 2 ; t(D) = max [ 0 + 2 ; 0 + 4 ] = 4 ; t(E) = 2 + 3 = 5 ; t(F) = max [ 4 + 5 ; 5 + 2 ] = 9 ; t(Fin) = 9 + 1 = 10.
Dates au plus tard : T(Fin) = 10 ; T(F) = 10 − 1 = 9 ; T(E) = 9 − 2 = 7 ; T(D) = 9 − 5 = 4 ; T(C) = 7 − 3 = 4 ; T(B) = 4 − 4 = 0 ; T(A) = min [ T(C) ; T(D) ] − 2 = min [ 4 ; 4 ] − 2 = 2.
| Tâche | A | B | C | D | E | F |
|---|---|---|---|---|---|---|
| t | 0 | 0 | 2 | 4 | 5 | 9 |
| T | 2 | 0 | 4 | 4 | 7 | 9 |
- Durée minimale : 10 jours. Tâches critiques (t = T) : B, D, F. Chemin critique : Début → B → D → F → Fin, de valeur 4 + 5 + 1 = 10.
Tu avais trouvé ?
Exercice 2 sur 4 Retards Réussi À revoir
On reprend le projet du serveur de fichiers (fil rouge du chapitre).
- La livraison du serveur (C) a 2 jours de retard. Quelle est la conséquence ?
- La rédaction du cahier des charges (B) commence le jour 6 au lieu du jour 3. Le projet est-il retardé ?
- Pour finir en 17 jours, le responsable propose de réduire de 2 jours la rédaction de la documentation (H). Est-ce efficace ? Que proposerais-tu ?
Voir la réponseMasquer la réponse de l'exercice 2
- C est critique : tout retard sur C se reporte sur la fin. Le projet dure 21 jours au lieu de 19.
- T(B) = 10 : B peut commencer jusqu'au jour 10 sans retarder la fin. Commencer le jour 6 ne retarde pas le projet. (On verra au chapitre 9 que cela décale en revanche D et H, qui ne peuvent plus commencer le jour 5.)
- H n'est pas critique (t = 5, T = 16) : la raccourcir ne change pas la durée du projet, qui reste 19 jours. Inefficace. Il faut raccourcir des tâches critiques, par exemple obtenir une livraison du serveur en 4 jours au lieu de 6 (C), si les autres chemins le permettent : avec C = 4, E commence à 7, G et F à 10, I à 14, J à 16, fin à 17. Le chemin par B, D, F reste plus court (F attendrait D à 7 et E à 10), l'objectif est atteint.
Tu avais trouvé ?
Exercice 3 sur 4 Du graphe au tableau Réussi À revoir
Un graphe MPM a pour arcs : Début → A (0), Début → B (0), A → C (4), B → C (3), B → D (3), C → E (5), D → E (2), E → Fin (1).
- Retrouve le tableau des tâches (durées et tâches antérieures).
- Calcule la durée minimale du projet et donne le chemin critique.
Voir la réponseMasquer la réponse de l'exercice 3
- La valeur d'un arc est la durée de sa tâche d'origine :
| Tâche | A | B | C | D | E |
|---|---|---|---|---|---|
| Durée | 4 | 3 | 5 | 2 | 1 |
| Antérieures | — | — | A, B | B | C, D |
- t(A) = t(B) = 0 ; t(C) = max [ 0 + 4 ; 0 + 3 ] = 4 ; t(D) = 0 + 3 = 3 ; t(E) = max [ 4 + 5 ; 3 + 2 ] = 9 ; t(Fin) = 10. Au plus tard : T(E) = 9, T(C) = 9 − 5 = 4, T(D) = 9 − 2 = 7, T(A) = 4 − 4 = 0, T(B) = min [ 4 ; 7 ] − 3 = 1. Durée minimale 10, chemin critique Début → A → C → E → Fin (4 + 5 + 1 = 10).
Tu avais trouvé ?
Exercice 4 sur 4 Programmer le calcul Réussi À revoir
Utilise la fonction dates_mpm du chapitre pour vérifier l'exercice « Un petit projet ». Dans quel ordre faut-il donner les tâches dans le dictionnaire, et pourquoi ?
Voir la réponseMasquer la réponse de l'exercice 4
petit = {"A": (2, []), "B": (4, []), "C": (3, ["A"]),
"D": (5, ["A", "B"]), "E": (2, ["C"]), "F": (1, ["D", "E"])}
fin, tot, tard = dates_mpm(petit)
print(fin, tot, tard)
# 10 {'A': 0, 'B': 0, 'C': 2, 'D': 4, 'E': 5, 'F': 9} {'F': 9, 'E': 7, 'D': 4, 'C': 4, 'B': 0, 'A': 2}
Les tâches doivent être données dans un ordre compatible avec les niveaux (chaque tâche après ses tâches antérieures) : la fonction calcule t(x) à partir des t de ses antérieures, qui doivent donc déjà être connues, et parcourt la liste à l'envers pour les dates au plus tard.
Tu avais trouvé ?