Adloun

Probleme – Trois gloutons pour un même ordonnancement, et un seul qui répond à la question posée

Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 16 — Algorithmes gloutons

Énoncé

tâches de durées et d'échéances , sur une machine unique, exécutées sans interruption. Le retard d'une tâche finissant à l'instant est .

Corrigé

1. Le glouton : par échéance croissante (règle edd, earliest due date).


(* Retard maximal minimal. Précondition : durées > 0.
   Complexité : Theta(n log n). *)
let edd durees echeances =
  let n = Array.length durees in
  let ordre = List.sort (fun i j -> compare echeances.(i) echeances.(j))
                        (List.init n (fun i -> i)) in
  let t = ref 0 and pire = ref min_int in
  List.iter (fun i ->
    t := !t + durees.(i);
    if !t - echeances.(i) > !pire then pire := !t - echeances.(i)) ordre;
  !pire

La démonstration, par échange. Soit un ordre optimal. S'il n'est pas trié par échéance, il contient deux tâches consécutives puis avec . Notons l'instant où commence : finit en , et en . Après échange, finit en et en . Les autres tâches ne bougent pas.

Le retard maximal des deux tâches concernées vaut, avant l'échange,

et après,

Or chacun des deux termes de la seconde expression est majoré par le second terme de la première : car , et car . L'échange ne peut donc pas augmenter le retard maximal. En répétant — c'est un tri par bulles —, on transforme en l'ordre edd sans jamais dégrader : edd est optimal.

Vérification : sur instances tirées au hasard (jusqu'à six tâches), edd a été confronté à l'optimum obtenu en énumérant les ordres. Aucun désaccord.

2. « La plus courte d'abord » ne convient pas. Sur instances, elle s'est trompée fois, soit . Contre-exemple mesuré : durées et échéances . La règle spt donne un retard maximal de , l'optimum est — c'est-à-dire que toutes les tâches peuvent finir avant leur échéance, avec une marge d'une unité.

Pourquoi elle échoue : elle range selon une grandeur qui n'apparaît pas dans le critère à minimiser. Le retard dépend des échéances ; spt ne les regarde pas.

3. Les trois ordonnancements du chapitre, côte à côte. C'est le tableau à retenir.

Ce qu'on minimiseLe bon gloutonLa preuve
somme des achèvementsdurée croissante (spt)réécriture du coût
retard maximaléchéance croissante (edd)échange de deux voisines
pénalité des tâches en retardpénalité décroissantematroïde
poids des activités retenuesaucuncontre-exemple

Ce que ce tableau enseigne, et c'est la conclusion du chapitre. Les trois premières lignes portent sur la même machine et les mêmes tâches. Seule change la quantité à minimiser — et à chaque fois, le critère de tri change avec elle. Il n'existe pas de « bon ordre » d'exécution en soi ; il n'existe qu'un bon ordre pour une fonction de coût donnée, et la trouver demande à chaque fois une démonstration neuve.

C'est exactement pourquoi le cours exige qu'un glouton se démontre. Un ordre de tri paraît toujours raisonnable ; ce qui décide est de savoir si l'échange de deux voisins mal rangés améliore le coût qu'on a écrit, et non le coût qu'on avait en tête.

Toutes les mesures de ce chapitre, rassemblées. Chaque glouton y a été confronté à un oracle exhaustif écrit indépendamment, sur des instances petites et nombreuses.

Gloutoninstancesdésaccordsstatut
activités, fin la plus tôt0démontré
tâches unitaires, créneau le plus tard0démontré (matroïde)
spt, somme des achèvements0démontré
edd, retard maximal0démontré
activités, celle qui commence le plus tôtréfuté
activités, la plus courte d'abordréfuté
tâches unitaires, créneau le plus tôtréfuté
activités pondérées, fin la plus tôtréfuté

Comment lire ce tableau, et c'est le dernier mot. Les quatre lignes du bas prouvent quelque chose : une faute. Les quatre du haut ne prouvent rien — un glouton peut être exact sur toutes les instances à cinq tâches et faux à six. La mesure réfute, elle ne démontre pas ; c'est le statut exact du test au chapitre chap:discipline.

Mais elle réfute vite, et c'est ce qui en fait le premier geste. La conduite est donc, dans cet ordre : (1) confronter à un oracle exhaustif sur des dizaines de milliers de petites instances — la plupart des candidats y meurent en dix secondes ; (2) si le glouton survit, le démontrer, par échange ou par réécriture du coût ; (3) si la démonstration résiste, chercher une garantie d'approximation, et la démontrer aussi.

Un avertissement sur le taux : « la plus courte d'abord » ne rate que des instances. Sur un jeu d'essai de trente cas, il y avait moins d'une chance sur deux de le prendre en défaut — et il donne d'ailleurs l'optimum sur le jeu de onze activités du cours. Un générateur trop petit ou trop régulier laisse passer les fautes rares, et un glouton faux qui a survécu à trente essais est bien plus dangereux qu'un glouton faux qui échoue tout de suite.

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.