Les deux mauvais critères de la sélection d'activités
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 16 — Algorithmes gloutons
Énoncé
Le cours affirme que « la plus courte d'abord » et « celle qui commence le plus tôt » sont faux. Exhiber, pour chacun, un contre-exemple à trois activités.
Corrigé
Un glouton par critère se réalise ainsi : prendre la meilleure activité restante, écarter toutes celles qui la chevauchent, recommencer. C'est ce programme, et non un simple parcours dans l'ordre trié, qui a été confronté à l'optimum calculé sur les sous-ensembles.
(* Nombre d'activités retenues par le glouton de critère cle.
Précondition : a est un tableau de couples (début, fin) avec début < fin.
Complexité : O(n^2) telle qu'écrite. *)
let glouton cle a =
let n = Array.length a in
let dispo = Array.make n true and compte = ref 0 and reste = ref true in
while !reste do
let meilleur = ref (-1) in
for i = 0 to n - 1 do
if dispo.(i) && (!meilleur < 0 || cle a.(i) < cle a.(!meilleur))
then meilleur := i done;
if !meilleur < 0 then reste := false
else begin
let (dm, fm) = a.(!meilleur) in
incr compte;
(* [d,f[ chevauche [dm,fm[ exactement quand d < fm et dm < f *)
for i = 0 to n - 1 do
if dispo.(i) then begin
let (d, f) = a.(i) in
if d < fm && dm < f then dispo.(i) <- false end done
end
done; !compte
« La plus courte d'abord » échoue sur , , . Le glouton prend , la plus courte, qui chevauche les deux autres : 1 activité. L'optimum est , soit 2.
Pourquoi : la plus courte peut être au milieu, où elle chevauche deux activités qui, elles, ne se chevauchent pas entre elles. Sa brièveté ne dit rien de son encombrement.
« Celle qui commence le plus tôt » échoue sur , , , . Le glouton prend et n'en prendra pas d'autre : 1 activité, contre 3 pour l'optimum. Une seule activité longue commençant tôt bloque tout le reste, et l'écart est ici arbitrairement grand.
Les trois critères confrontés, d'abord sur les onze activités , , , , , , , , , , , puis sur instances de à activités tirées au hasard :
| Critère | sur le jeu de 11 (optimum ) | instances ratées sur |
|---|---|---|
| celle qui commence le plus tôt | 3 | soit |
| la plus courte d'abord | 4 | soit |
| celle qui finit le plus tôt | 4 | 0 |
Deux remarques que la mesure impose. D'abord, « la plus courte d'abord » trouve l'optimum sur le jeu de onze : un glouton faux réussit souvent, et un unique essai bien choisi ne prouve rien — c'est tout l'objet de l'avertissement du cours. Ensuite, il ne se trompe que sur des instances aléatoires, six fois moins que le critère du début : être moins souvent faux n'est pas être correct, et il n'y a pas de demi-optimalité.
Pourquoi le bon critère est bon, en une phrase. Choisir l'activité qui finit le plus tôt, c'est laisser le plus de temps possible à tout ce qui suit. Aucun autre critère ne maximise la ressource restante — et c'est exactement ce que formalise l'argument d'échange du cours. Un glouton correct optimise, non pas ce qu'il prend, mais ce qu'il laisse.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.