Vous êtes sur la page 1sur 8

Examen de recherche opérationnelle – Corrigé

Marc Roelens
Décembre 2006

1 Ordonnancement de tâches
1.1
On dresse le tableau des contraintes de précédence :
Tâche A B C D E F G H I J
Préc. J H A, H A, B C, I D D, F
On détermine successivement :
– les tâches de niveau 0 (celles qui n’ont pas d’antécédent) : ce sont C, D et F (que l’on peut numéroter
dans cet ordre) ;
– les tâches de niveau 1 (celles qui n’ont que des antécédents de niveau 0) : ce sont I et J (que l’on
numérote dans cet ordre) ;
– les tâches de niveau 2 (celles qui n’ont que des antécédents de niveau 0 ou 1) : ce sont A et H (que
l’on numérote dans cet ordre) ;
– les tâches de niveau 3 (celles qui n’ont que des antécédents de niveau 0, 1 ou 2) : ce sont B et E (que
l’on numérote dans cet ordre) ;
– les tâches de niveau 4 (celles qui n’ont que des antécédents de niveau 0, 1, 2 ou 3) : il ne reste plus
que G !
Voici donc le tableau des tâches avec niveau et numéro d’ordre :
Tâche A B C D E F G H I J
Préc. J H A, H A, B C, I D D, F
Niv. 2 3 0 0 3 0 4 2 1 1
No 6 8 1 2 9 3 10 7 4 5
Comme on a réussi à numéroter tous les sommets, c’est que le graphe de précédence est sans circuit, et la
numérotation des sommets constitue un tri topologique (si la tâche X est avant la tâche Y, alors le numéro
de X est inférieur au numéro de Y).
Une représentation par niveau possible pour ce graphe est la suivante (on a ajouté des tâches fictives
correspondant au début et à la fin des travaux) :

C H B

Déb D I E G Fin

F J A

niveau 0 niveau 1 niveau 2 niveau 3 niveau 4

1
1.2
On porte sur chaque arc du graphe de précédence la durée de la tâche dont cet arc est issu, et on sait que
l’on calcule la date de début au plus tôt en déterminant le chemin le plus long depuis le début des travaux ;
ceci permet de trouver la durée minimale d’exécution qui est la date de début au plus tôt de la tâche fictive
représentant la fin des travaux.
Ensuite, on détermine la date de début au plus tard en calculant le chemin le plus long depuis chaque
sommet jusqu’à cette tâche fictive de fin des travaux.
Comme le graphe est ordonné par niveaux, ces calculs se font par niveaux croissants pour les dates de
début au plus tôt, par niveaux décroissants pour les dates de début au plus tard. Le résultat est résumé sur
le graphe suivant :
0,5 8,9 13,14
4 5
C H B
5 8
0,0 5,6 3 22,31 22,22 32,32
5 10 Fin
Déb D I E G
5
10 10
0,3 5,5 12,12 1
7
F 2 J A

Les dates de début au plus tôt et au plus tard sont indiquées (séparées par des virgules) au dessus des tâches.
On obtient ainsi les réponses :
– la durée minimale d’exécution est de 32 unités ;
– le chemin critique est
Déb −→ D −→ J −→ A −→ G −→ Fin

1.3
Le graphe PERT est décrit ci-après : il comprend 8 étapes et deux tâches fictives (en pointillés), de
durées nulles, servant à représenter les contraintes de précédence.
[8,9] H (5) [13,14] B (8) [22,22]
G (10)
C (4)
[0,0] I (3)
D (5) [5,5] J (7) [12,12] A (10) [22,22] E (1) [32,32]
F (2)

Pour chaque étape, on a indiqué la date au plus tôt et la date au plus tard (entre crochets). Le chemin critique
est (heureusement !) le même que celui calculé par le graphe de précédence.
On peut alors calculer les marges libres, totales et certaines, dont on rappelle la définition. Pour toute
étape ei , on note ti la date au plus tôt de cette étape, et t∗i la date au plus tard. Alors, pour une tâche Xj de
durée dj , comprise entre l’étape k (avant) et l’étape l (après), on définit :
– MT (Xj ) = t∗l − tk − dj (marge totale de Xj ) ;
– ML (Xj ) = tl − tk − dj (marge libre de Xj ) ;
– MC (Xj ) = tl − t∗k − dj (marge certaine de Xj ).
On obtient les résultats suivants :
Tâche A B C D E F G H I J
MT 0 1 5 0 9 3 0 1 1 0
ML 0 1 4 0 9 3 0 0 0 0
MC 0 0 4 0 9 3 0 0 0 0

2
1.4
On voit sur le tableau précédent que la marge totale de H est de 1 unité : donc, l’augmentation de 1
unité de la durée de H va résorber cette marge (sans pour autant décaler la fin du projet). Si H augmente à
nouveau de 1 unité, alors on obtient un nouveau chemin critique
Déb −→ D −→ I −→ H −→ B −→ G −→ Fin
et la durée minimale d’exécution du projet passe à 33 unités de temps.

2 Allocation de ressources
2.1
On note donc xj la quantité de cageots placée dans le magasin j. Ces variables xj sont entières, posi-
tives, inférieures à la valeur n. Le bénéfice global (que l’on cherche à maximiser) est donc :
m
X
F (x1 , · · · , xm ) = b(xj , j)
j=1

en respectant bien sûr la contrainte que le nombre total de cageots est n, c’est-à-dire :
m
X
xj = n
j=1

C’est donc un problème de programmation dynamique.

2.2
On note alors, pour 0 ≤ i ≤ n et 0 ≤ j ≤ m, P (i, j) le profit maximum obtenu en vendant i cageots
dans les j premiers magasins. On a bien évidemment :

(∀i ∈ {0..n})(P (i, 1) = b(i, 1))

Ensuite, pour j ≥ 2, pour placer optimalement i cageots dans les j premiers magasins, on peut dire l’on
place xj ≤ i cageots dans le magasin j et i − xj de façon optimale dans les j − 1 premiers magasins. On
choisit bien sûr la valeur de xj qui maximise la somme des bénéfices obtenus. En clair :

P (i, j) = max b(xj , j) + P (i − xj , j − 1)


0≤xj ≤i

2.3
D’après ce que l’on vient de démontrer, on connaı̂t les valeurs de P (i, 1) pour 0 ≤ i ≤ n (identiques
aux b(i, 1)). Puis, on peut calculer grâce à la propriété P (i, 2) pour 0 ≤ i ≤ n, . . .puis P (i, j − 1) pour
0 ≤ i ≤ n, et enfin ce que l’on cherche : P (n, m). On a affaire à un algorithme classique de programmation
dynamique.
En regardant plus attentivement la formule de récurrence, on constate que pour calculer P (i, j), on a
besoin de connaı̂tre uniquement les valeurs de P (k, j − 1) pour 0 ≤ k ≤ i. Ceci permet de n’utiliser qu’un
seul tableau pour calculer les valeurs de P :
pour i allant de 0 à n
P(i) = b(i,1)
pour j allant de 2 à m
pour i allant de n à 0
kmin = 0 ; vkmin = P(i)+b(0,j)
pour k allant de 0 à i

3
vk = P(i-k)+b(k,j)
si vk est supérieur à vkmin
kmin = k ; vk = vkmin
finsi
finpour(k)
P(i,j) = vkmin
finpour(i)
finpour(j)
afficher P(n,m)
Cet algorithme permet de déterminer P (n, m) (d’ailleurs, dans la dernière boucle, il n’est pas nécessaire
de calculer P (i, m) pour i < n !) : on souhaite également conserver la répartition correspondante ! Il suffit
pour cela de mémoriser les valeurs de vkmin en cours d’algorithme. En termes de complexité, on a ainsi :
– une complexité en espace proportionnelle à n×m (on conserve pour tout i le bénéfice et la répartition
optimale, de taille m) ;
– une complexité proportionnelle à n2 × m (voir les trois boucles imbriquées de l’algorithme).

2.4
Voici l’algorithme détaillé sur l’exemple :
– calcul de P(6,2) : on détermine les répartitions possibles
– 0 cageots sur le magasin 2, 6 sur le premier magasin : 0 + 4 = 4
– 1 cageots sur le magasin 2, 5 sur le premier magasin : 4 + 4 = 8
– 2 cageots sur le magasin 2, 4 sur le premier magasin : 6 + 4 = 10
– 3 cageots sur le magasin 2, 3 sur le premier magasin : 7 + 4 = 11
– 4 cageots sur le magasin 2, 2 sur le premier magasin : 8 + 4 = 12
– 5 cageots sur le magasin 2, 1 sur le premier magasin : 8 + 3 = 11
– 6 cageots sur le magasin 2, 0 sur le premier magasin : 8 + 0 = 8
P(6,2) = 12, répartition optimale 2+4
– calcul de P(5,2) : on détermine les répartitions possibles
– 0 cageots sur le magasin 2, 5 sur le premier magasin : 0 + 4 = 4
– 1 cageots sur le magasin 2, 4 sur le premier magasin : 4 + 4 = 8
– 2 cageots sur le magasin 2, 3 sur le premier magasin : 6 + 4 = 10
– 3 cageots sur le magasin 2, 2 sur le premier magasin : 7 + 4 = 11
– 4 cageots sur le magasin 2, 1 sur le premier magasin : 8 + 3 = 11
– 5 cageots sur le magasin 2, 0 sur le premier magasin : 8 + 0 = 8
P(5,2) = 11, répartition optimale 2+3
– calcul de P(4,2) : on détermine les répartitions possibles
– 0 cageots sur le magasin 2, 4 sur le premier magasin : 0 + 4 = 4
– 1 cageots sur le magasin 2, 3 sur le premier magasin : 4 + 4 = 8
– 2 cageots sur le magasin 2, 2 sur le premier magasin : 6 + 4 = 10
– 3 cageots sur le magasin 2, 1 sur le premier magasin : 7 + 3 = 10
– 4 cageots sur le magasin 2, 0 sur le premier magasin : 8 + 0 = 8
P(4,2) = 10, répartition optimale 2+2
– calcul de P(3,2) : on détermine les répartitions possibles
– 0 cageots sur le magasin 2, 3 sur le premier magasin : 0 + 4 = 4
– 1 cageots sur le magasin 2, 2 sur le premier magasin : 4 + 4 = 8
– 2 cageots sur le magasin 2, 1 sur le premier magasin : 6 + 3 = 9
– 3 cageots sur le magasin 2, 0 sur le premier magasin : 7 + 0 = 7
P(3,2) = 9, répartition optimale 1+2
– calcul de P(2,2) : on détermine les répartitions possibles
– 0 cageots sur le magasin 2, 2 sur le premier magasin : 0 + 4 = 4
– 1 cageots sur le magasin 2, 1 sur le premier magasin : 4 + 3 = 7
– 2 cageots sur le magasin 2, 2 sur le premier magasin : 6 + 0 = 6

4
P(2,2) = 7, répartition optimale 1+1
– calcul de P(1,2) : on détermine les répartitions possibles
– 0 cageots sur le magasin 2, 1 sur le premier magasin : 0 + 3 = 3
– 1 cageots sur le magasin 2, 0 sur le premier magasin : 4 + 0 = 4
P(1,2) = 4, répartition optimale 0+1
– calcul de P(0,2) : on détermine les répartitions possibles
– 0 cageots sur le magasin 2, 0 sur le premier magasin : 0 + 0 = 0
P(0,2) = 0, répartition optimale 0+0
– calcul de P(6,3) : on détermine les répartitions possibles
– 0 cageots sur le magasin 3, 6 sur les deux premiers magasins : 0 + 12 = 12
– 1 cageots sur le magasin 3, 5 sur les deux premiers magasins : 2 + 11 = 13
– 2 cageots sur le magasin 3, 4 sur les deux premiers magasins : 4 + 10 = 14
– 3 cageots sur le magasin 3, 3 sur les deux premiers magasins : 6 + 9 = 15
– 4 cageots sur le magasin 3, 2 sur les deux premiers magasins : 7 + 7 = 14
– 5 cageots sur le magasin 3, 1 sur les deux premiers magasins : 8 + 4 = 12
– 6 cageots sur le magasin 3, 0 sur les deux premiers magasins : 9 + 0 = 9
P(6,3) = 15, répartition optimale 1+2+3
Ainsi, le grossiste doit placer 1 cageot dans le premier magasin, 2 dans le second magasin, 3 dans le
troisième magasin : son bénéfice (maximal) est de 15.

3 Production à optimiser
3.1
On note x1 et x2 les quantités de produits P1 et P2 . Ainsi, on cherche à maximiser le produit de la
vente, c’est-à-dire la quantité :
F (x1 , x2 ) = 40x1 + 50x2
sachant que l’on doit bien sûr respecter les contraintes de stock des ingrédients A, B et C :

 5 x1 + 4 x2 ≤ 80
x1 + 2 x2 ≤ 24
3 x1 + 2 x2 ≤ 36

On a affaire à un (classique) problème de programmation linéaire.

3.2
Comme on n’a que deux variables, une résolution graphique (planaire) est donc possible. La figure 1
reprend cette résolution graphique.
Sur ce graphique, on a tracé les droites de contrainte, le polytope [O,X1,X,X2] des solutions admissibles
(solutions vérifiant les contraintes, en hachuré), et une droite d’isobénéfice (en pointillés). La solution
optimale est le point du polytope par lequel passe une parallèle à la droite d’isobénéfice qui est la plus
éloignée possible de l’origine : ce point est le point X de la figure.
Pour déterminer précisément ce point, on remarque qu’il est l’intersection des droites de contraintes
relatives à B et C : c’est donc la solution du système linéaire :

x1 + 2 x2 = 24
3 x1 + 2 x2 = 36

qui donne comme solution optimale :

x1 = 6
x2 = 9
F = 6 × 40 + 9 × 50 = 690

5
x2

20

D(A)

D(C)

10 X2
1111111
0000000
0000000
1111111 X

0000000
1111111
0000000
1111111
X’

0000000
1111111
D(B)
x1
O 10 X1 20
droite d’isobénéfice

F IG . 1 – Résolution graphique

3.3
On va maintenant résoudre le problème par la méthode du simplexe. On sait que par cette méthode, on
se déplace sur les sommets du polytope des solutions admissibles : ainsi, à partir du sommet O, on veut
aboutir au sommet X. Que l’on passe par X1 ou par X2, il suffit dans les deux cas de deux étapes, ce qui
explique pourquoi on aura trois tableaux. Voici les tableaux successifs en prenant comme critère de choix
de colonne celui du coefficient maximal pour la fonction économique.
On introduit donc 3 variables d’écart yA , yB et yC (qui représentent les quantités non utilisées des
ingrédients A, B et C), et le tableau initial du simplexe s’écrit alors :

x1 x2 yA yB yC
yA 5 4 1 0 0 80
yB 1 2 0 1 0 24
yC 3 2 0 0 1 36
40 50 0 0 0 F

Ce tableau correspond à la solution initiale (x1 = 0, x2 = 0, yA = 80, yB = 24, yC = 36), qui est
géométriquement représentée par le sommet O.
Le choix du pivot se fait alors :
– en déterminant la colonne où le coefficient est maximal dans la fonction économique : c’est la co-
lonne de x2 ;
– pour cette colonne, et pour chaque ligne, on calcule le quotient entre la valeur du second membre
(s’il est positif) et le coefficient de la ligne (s’il est non nul) :
– pour la ligne yA , on obtient le quotient 80 4 = 20 ;
– pour la ligne yB , on obtient le quotient 24 2 = 12 ;
– pour la ligne yA , on obtient le quotient 36 2 = 18 ;
– on retient comme pivot la valeur réalisant le minimum, soit ici la ligne yB
On dit que yB sort de la base et que x2 entre dans la base. Cela signifie que l’on passe de la solution
initiale à une nouvelle solution en se déplaçant sur l’arête [O ;X2] : on cherche le point le plus éloigné sur

6
cette arête qui est donc X2. On obtient le nouveau tableau :
x1 x2 yA yB
yC
yA 3 0 1 −20 32
1 1
x2 2 1 0 2 0 12
yC 2 0 0 −1 1 12
15 0 0 −25 0 F − 600
correspondant à la nouvelle solution (x1 = 0, x2 = 12, yA = 32, yB = 0, yC = 12) de bénéfice 600.
Comme il reste un coefficient positif dans la fonction économique, ce n’est pas encore l’optimum. On
choisit à nouveau le pivot selon les mêmes règles : c’est la colonne de x1 (qui va donc entrer dans la base),
et la ligne de yC (qui va donc sortir de la base). On obtient le tableau final :
x1 x2 yA yB yC
yA 0 0 1 − 12 − 23 14
3
x2 0 1 0 4 − 41 9
x1 1 0 0 − 12 1
2 6
0 0 0 − 35
2 − 15
2 F − 690
correspondant à la nouvelle solution (x1 = 6, x2 = 9, yA = 14, yB = 0, yC = 0) de bénéfice 690. Comme
les coefficients de la fonction économique sont maintenant négatifs, on est bien à l’optimum (on retrouve
le point X du graphique).

3.4
On peut réécrire les équations du problème au voisinage de l’optimum trouvé (c’est le tableau final du
simplexe !) :
yA = 14 + 21 yB + 32 yC



x2 = 9 − 34 yB + 14 yC


 x1 = 6 + 12 yB − 12 yC
F = 690 − 35 15
2 yB − 2 y C

Comme on utilise toute la quantité de l’ingrédient C disponible, on peut se demander comment l’optimum
va évoluer si on augmente cette quantité. L’hypothèse essentielle est la suivante : si l’augmentation est petite
(ε), les pivots vont rester les mêmes, et on peut donc déduire la solution optimale du nouveau problème à
partir de la solution optimale de l’ancien problème en affectant la valeur −ε à la variable yC .
On lit sur le tableau final du simplexe comment vont varier les différentes variables :
– yA diminue de − 32 ε ;
– x2 diminue de − 14 ε ;
– x1 augmente de 12 ε ;
– F augmente de 15 2 ε.
Ceci permet de calculer la valeur maximale du ε : c’est celle qui provoquera l’annulation de la première
variable. Dans notre cas :
– x1 augmente donc ne peut s’annuler ;
– yA s’annule pour une valeur de ε de 14 28
3 = 3 ;
2
9
– x2 s’annule pour une valeur de ε de 1 = 36.
4
28
On en déduit que la valeur maximale est valeur limite pour laquelle il y a alors annulation de yA . Ceci
3 ,
explique pourquoi l’énoncé indiquait :
quelle quantité supplémentaire de C faut-il acheter pour épuiser complètement les 80 kg de
A?
On obtient alors comme nouvelle solution optimale :
yA = 14 − 32 28


 3 =0
x2 = 9 − 14 28 3 = 3
20


 x1 = 6 + 2 3 = 32
1 28
3
F = 690 + 15 28
2 3 = 760

7
Graphiquement parlant, augmenter la quantité de l’ingrédient C revient à « décaler » la droite D(C) pa-
rallèlement à elle-même en l’éloignant de l’origine : on voit alors que le point correspondant à la solution
optimale se déplace sur la droite D(B) en se rapprochant du point X’. La limite est atteinte lorsque les
trois droites D(A), D(B) et D(C) deviennent concourantes : c’est le point X’ correspondant à la nouvelle
solution !
Cette opération est-elle rentable ? On voit que la fonction économique augmente proportionnellement
à l’augmentation de la quantité de l’ingrédient C, le rapport étant de 15 2 : ainsi, si le prix au kg de C est
inférieur à cette valeur, l’opération est rentable ; si le prix est supérieur, elle ne l’est pas.

Vous aimerez peut-être aussi