Algorithmes gloutons
Cours · informatique (MP2I/MPI), chapitre 16 · MP2I et MPI · le début du chapitre, la suite sur Adloun
16.1 Choisir sans revenir en arrière
Un algorithme glouton construit une solution par une suite de choix, chacun étant le meilleur sur le moment, et aucun n'étant jamais remis en cause. Il ne revient pas en arrière — c'est ce qui le distingue du chapitre chap:exploration — et il n'explore pas d'alternatives — c'est ce qui le distingue du chapitre chap:dynamique.
D'où sa vitesse : souvent , le temps d'un tri. Et d'où son danger : il donne presque toujours une réponse, et cette réponse est parfois fausse. Tout l'enjeu du chapitre est là. Le programme distingue d'ailleurs nettement les deux régimes : « algorithme glouton fournissant une solution exacte » en première année, « exemple d'algorithme d'approximation fourni par la méthode gloutonne » en seconde.
16.2 Quand le glouton échoue
Commençons par l'échec : il est plus instructif que le succès.
Rendre une somme avec le moins de pièces possible. Le glouton naturel prend à chaque fois la plus grosse pièce qui tient.
Avec le système européen , il est optimal. Avec le système et :
| Choix | Total | |
|---|---|---|
| Glouton | , puis , puis | 3 pièces |
| Optimal | , puis | 2 pièces |
Le glouton a pris le parce qu'il était le plus gros, et s'est condamné à finir en pièces de . Aucun message d'erreur, aucune boucle infinie : simplement une réponse fausse.
C'est la règle du chapitre. Sur un problème d'optimisation, un glouton non démontré est une conjecture, et il faut soit prouver son optimalité, soit exhiber un contre-exemple, soit — si l'on garde le glouton parce qu'il est rapide — prouver une borne sur son écart à l'optimum. Ces trois issues sont les trois sections qui suivent.
16.3 Trois gloutons exacts
Le programme cite trois exemples d'algorithmes gloutons exacts : « codage de Huffman, sélection d'activité, ordonnancement de tâches unitaires avec pénalités de retard sur une machine unique ».
16.3.1 La sélection d'activités
activités, la -ième occupant l'intervalle . Une seule salle. Combien d'activités peut-on tenir sans chevauchement ?
Méthode : Le bon critère : la fin la plus tôt
Trois gloutons plausibles, et un seul juste :
| Critère | Verdict |
|---|---|
| la plus courte d'abord | faux |
| celle qui commence le plus tôt | faux |
| celle qui finit le plus tôt | optimal |
(* Nombre maximal d'activités compatibles. Précondition : a est un tableau de
couples (début, fin) avec début < fin. Complexité : Theta(n log n). *)
let selection a =
let b = Array.copy a in
Array.sort (fun (_, f1) (_, f2) -> compare f1 f2) b; (* tri par FIN *)
let compte = ref 0 and libre = ref neg_infinity in
Array.iter (fun (d, f) ->
if float_of_int d >= !libre then begin
incr compte;
libre := float_of_int f
end) b;
!compte
Le glouton « fin la plus tôt » rend une sélection de cardinal maximal.
Exercices du chapitre
- Les deux mauvais critères de la sélection d'activités corrigé
- Un glouton exact que le cours ne traite pas : minimiser la somme des temps d'attente corrigé
- Le sac à dos fractionnaire : le même glouton, mais exact corrigé
- Pourquoi « au plus tard » et non « au plus tôt » corrigé
- Une parade qui vaut 2, et pourquoi elle vaut 2 corrigé
- La 2-approximation est-elle serrée ? et le glouton « degré maximal » a-t-il une garantie ? corrigé