Leçon 13 sur 19

Chapitre 13 — Algorithmes gloutons

Construire une solution par choix locaux, comprendre les preuves et reconnaître les limites

CANDIDATS  →   CHOIX LOCAL  →  TEST DE FAISABILITÉ  →   SOLUTION PARTIELLE  →  OBJECTIF

 

Fiche pédagogique du chapitre

Objectifs d’apprentissage

À la fin de ce chapitre, l’étudiant devra être capable de :

  • expliquer le principe d’un algorithme glouton et distinguer un choix local d’une solution globale ;
  • identifier les candidats, la fonction de sélection, le test de faisabilité et la fonction objectif ;
  • construire progressivement une solution sans retour en arrière ;
  • reconnaître la propriété du choix glouton et la sous-structure optimale ;
  • justifier la correction d’une stratégie par un argument d’échange, une preuve par induction ou une propriété de coupe ;
  • appliquer la méthode au rendu de monnaie, à la sélection d’activités, à la planification de tâches et au codage de Huffman ;
  • produire des contre-exemples lorsqu’un choix local ne conduit pas à l’optimum ;
  • comparer une solution gloutonne avec une solution fondée sur la programmation dynamique ;
  • analyser la complexité temporelle et spatiale d’un algorithme glouton.

Prérequis

  • tableaux, listes, ensembles et dictionnaires ;
  • fonctions, procédures, récursivité et invariants ;
  • algorithmes de tri et notion de file de priorité ;
  • complexités O(1), O(log n), O(n) et O(n log n) ;
  • notions de preuve de correction et de solution optimale.

Organisation indicative

Partie

Contenu

Durée indicative

13.1Principe, choix local, construction progressive et absence de retour2 h
13.2Conditions d’utilisation et méthodes de preuve2 h 30
13.3Rendu de monnaie, activités, tâches et Huffman4 h
13.4Limites, contre-exemples et comparaison avec la programmation dynamique2 h
TD / TPConception, justification et expérimentation4 h à 6 h

 

Idée directrice

Une stratégie gloutonne choisit, à chaque étape, la décision qui paraît la meilleure immédiatement. Ce choix est définitif : l’algorithme n’explore pas toutes les possibilités et ne revient pas sur ses décisions.

Cette simplicité peut produire des algorithmes très rapides, mais l’optimalité n’est garantie que lorsque le problème possède des propriétés structurelles particulières.

 


 

 

13.1 Principe

Définition générale

Un algorithme glouton construit une solution étape par étape. À chaque étape, il sélectionne le candidat qui optimise un critère local, vérifie que ce candidat peut être ajouté sans rendre la solution invalide, puis poursuit avec les candidats restants.

La méthode est dite « gloutonne » parce qu’elle cherche à obtenir le meilleur gain immédiat, sans examiner toutes les conséquences futures du choix.

Composant

Rôle

Question à poser

Ensemble de candidatsContient les éléments encore disponiblesQuels éléments peuvent encore être choisis ?
Fonction de sélectionDésigne le meilleur candidat localQuel candidat paraît le plus avantageux maintenant ?
Test de faisabilitéPréserve les contraintes du problèmeLe choix maintient-il une solution valide ?
Fonction objectifÉvalue la qualité de la solutionQue cherche-t-on à minimiser ou à maximiser ?
Critère d’arrêtDétermine la fin de la constructionLa solution est-elle complète ?

 

Choix local

Le choix local est la décision considérée comme la meilleure à l’étape courante. Il est déterminé par une règle simple : plus petite pièce, plus grande valeur, date de fin la plus proche, fréquence la plus faible, rapport valeur/poids maximal, etc.

Attention

Un choix local intuitif n’est pas automatiquement correct. Il faut démontrer que ce choix peut appartenir à au moins une solution optimale.

Une stratégie gloutonne doit être définie précisément : « choisir le meilleur » n’a de sens que si le critère de comparaison est explicite.

 


 

 

Solution construite progressivement

Après chaque sélection, la solution partielle doit rester faisable. Elle est étendue jusqu’à ce qu’aucun candidat ne puisse être ajouté ou jusqu’à ce que l’objectif soit atteint.

Étape

État des candidats

Choix

Solution partielle

0Tous disponiblesVide
1Un candidat retiréMeilleur candidat localUn élément
2Deuxième sélectionMeilleur parmi les restantsDeux éléments compatibles
Candidats restantsChoix successifsSolution progressivement complétée
FinAucun ajout utile ou possibleSolution finale

 

Absence de retour en arrière

Contrairement au retour sur trace, un algorithme glouton ne supprime pas un choix précédent pour explorer une autre branche. Cette absence de retour réduit fortement le coût de calcul, mais elle rend la qualité du critère local décisive.

Méthode

Retour sur un choix ?

Nombre de possibilités explorées

Garantie typique

GloutonneNonUne trajectoire principaleOptimale seulement si les propriétés requises sont vérifiées
Retour sur traceOuiPlusieurs branches, parfois toutesSolution exacte, coût souvent exponentiel
Programmation dynamiquePas au sens du retour ; mémorise les sous-problèmesÉtats distinctsSolution optimale si la relation de récurrence est correcte

 

 

PSEUDO-CODE — Schéma générique d’un algorithme glouton

Fonction Glouton(candidats) : Solution

       solution ← solution vide

 

       TantQue candidats n’est pas vide ET solution non complète Faire

           candidat ← SélectionnerMeilleur(candidats)

           Retirer candidat de candidats

 

           Si Faisable(solution, candidat) Alors

               Ajouter candidat à solution

           FinSi

       FinTantQue

 

       Retourner solution

FinFonction

Remarque : La correction dépend de la règle SélectionnerMeilleur et non du seul schéma général.

 

 

Invariant de construction

Un invariant utile est : « après chaque itération, la solution partielle est faisable et peut encore être complétée ». La faisabilité ne suffit toutefois pas à garantir l’optimalité ; elle garantit seulement que les contraintes ne sont pas violées.

Checklist de conception
  • Définir précisément l’objectif à minimiser ou maximiser.
  • Identifier les candidats et les contraintes.
  • Proposer un critère local mesurable.
  • Définir le test de faisabilité.
  • Déterminer la structure de données permettant de sélectionner rapidement le meilleur candidat.
  • Prouver l’optimalité ou chercher un contre-exemple.
  • Analyser le coût du tri initial et des sélections successives.

 

13.2 Conditions d’utilisation

Pourquoi une preuve est nécessaire

Un algorithme glouton peut être très convaincant sur quelques exemples et néanmoins échouer sur une instance particulière. Avant d’affirmer qu’il est optimal, il faut montrer que ses choix locaux sont compatibles avec une solution globale optimale.

Propriété du choix glouton

La propriété du choix glouton affirme qu’il existe au moins une solution optimale commençant par le choix local effectué par l’algorithme. Le premier choix peut donc être fixé sans perdre l’optimalité.

Formulation
Soit c le candidat sélectionné par la règle gloutonne. Pour toute instance du problème, on doit pouvoir montrer qu’une solution optimale contient c ou peut être transformée en une solution optimale contenant c sans dégrader sa valeur.

 

Sous-structure optimale

Après avoir effectué un choix glouton, le problème restant doit être une instance plus petite du même problème. Une solution optimale du problème initial est alors formée du choix effectué et d’une solution optimale du sous-problème résiduel.

Problème

Choix fixé

Sous-problème restant

Sélection d’activitésActivité terminant le plus tôtChoisir un maximum d’activités commençant après sa fin
HuffmanFusion des deux fréquences minimalesConstruire un code optimal sur le nouvel ensemble de fréquences
Rendu de monnaie canoniquePlus grande pièce ne dépassant pas le resteRendre le montant restant
Arbre couvrant minimalArête sûre traversant une coupeRelier les composantes restantes

 

Méthodes de preuve de correction

1. Argument d’échange

On part d’une solution optimale quelconque. Si son premier choix diffère du choix glouton, on remplace ce choix par le choix glouton et on montre que la solution reste faisable et ne devient pas moins bonne. On obtient ainsi une solution optimale compatible avec l’algorithme.

2. Preuve par induction

On montre que le choix initial est sûr, puis que le sous-problème possède la même structure. L’hypothèse d’induction garantit que les choix suivants produisent une solution optimale du sous-problème.

3. Méthode « rester en avance »

On compare, étape par étape, la solution gloutonne à une solution optimale. On prouve qu’après chaque étape, la solution gloutonne n’est jamais en retard selon une mesure adaptée.

4. Propriété de coupe

Dans certains problèmes de graphes, une coupe sépare les sommets en deux groupes. On prouve qu’une arête de poids minimal traversant cette coupe est sûre et peut appartenir à un optimum.

Méthode

Idée essentielle

Exemple adapté

ÉchangeTransformer une solution optimale pour intégrer le choix gloutonSélection d’activités, ordonnancement
InductionRéduire à un sous-problème de même natureRendu de monnaie dans certains systèmes
Rester en avanceComparer les solutions préfixe par préfixePlanification et minimisation de temps
CoupeMontrer qu’un élément minimal est sûrArbres couvrants minimaux

 

 

PSEUDO-CODE — Démarche de validation d’une stratégie gloutonne

Procédure ValiderStrategie(instance)

       Définir objectif, candidats et contraintes

       Définir la règle de sélection locale

       Vérifier que chaque ajout conserve la faisabilité

 

       Chercher un contre-exemple sur de petites instances

 

       Si aucun contre-exemple n’est trouvé Alors

           Identifier la propriété du choix glouton

           Identifier la sous-structure optimale

           Construire une preuve de correction

       FinSi

FinProcédure

Remarque : L’absence de contre-exemple lors de tests n’est pas une preuve mathématique.

 

 

Comment chercher un contre-exemple ?

  • tester de petites instances permettant une énumération complète des solutions ;
  • modifier légèrement les poids, durées ou valeurs pour créer un conflit entre gain immédiat et gain futur ;
  • examiner les cas où deux choix locaux sont proches mais conduisent à des sous-problèmes très différents ;
  • comparer la solution gloutonne à une recherche exhaustive ou à une programmation dynamique ;
  • tester les égalités et les règles de départage.
Critère de décision
Une méthode gloutonne est appropriée lorsque le choix local peut être démontré sûr et lorsque le problème restant conserve une structure optimale. Sans ces propriétés, elle peut servir d’heuristique rapide, mais non de méthode exacte.

 

13.3 Exemples

Exemple 1 — Rendu de monnaie

Le problème consiste à rendre un montant avec le plus petit nombre de pièces. Une stratégie gloutonne naturelle choisit toujours la plus grande pièce ne dépassant pas le montant restant.

 

PSEUDO-CODE — Rendu de monnaie glouton

Fonction RendreMonnaie(montant, piecesDécroissantes) : Liste

       rendu ← liste vide

       reste ← montant

 

       PourChaque pièce dans piecesDécroissantes Faire

           TantQue pièce ≤ reste Faire

               Ajouter pièce à rendu

               reste ← reste - pièce

           FinTantQue

       FinPourChaque

 

       Si reste ≠ 0 Alors

           Signaler « montant impossible à rendre »

       FinSi

 

       Retourner rendu

FinFonction

 

 

Trace avec les pièces {25, 10, 5, 1} et le montant 63

Reste avant

Pièce choisie

Reste après

Rendu partiel

63253825
38251325, 25
1310325, 25, 10
31225, 25, 10, 1
21125, 25, 10, 1, 1
11025, 25, 10, 1, 1, 1

 

Le résultat contient six pièces. Pour de nombreux systèmes monétaires usuels, la stratégie est optimale. Elle ne l’est cependant pas pour tous les ensembles de pièces.

Contre-exemple classique

Pièces : {4, 3, 1}, montant : 6.

Le glouton choisit 4 + 1 + 1, soit 3 pièces. La solution optimale est 3 + 3, soit 2 pièces. Le choix de la plus grande pièce n’est donc pas toujours sûr.

 

Complexité

Si l’on utilise des divisions entières pour calculer directement le nombre de pièces de chaque valeur, le coût est O(k), où k est le nombre de types de pièces. Avec une boucle retirant une pièce à la fois, le coût dépend aussi du nombre total de pièces rendues.

Exemple 2 — Sélection d’activités

On dispose d’activités utilisant une même ressource. Chaque activité possède une heure de début et une heure de fin. L’objectif est de sélectionner le plus grand nombre d’activités compatibles.

La stratégie optimale consiste à choisir, parmi les activités compatibles, celle qui se termine le plus tôt. Ce choix laisse le maximum de temps disponible pour les activités suivantes.

 

PSEUDO-CODE — Sélection d’un maximum d’activités compatibles

Fonction SelectionActivites(activites) : Liste

       Trier activites par date de fin croissante

       selection ← liste vide

       finDerniere ← -∞

 

       PourChaque activité a dans activites Faire

           Si a.debut ≥ finDerniere Alors

               Ajouter a à selection

               finDerniere ← a.fin

           FinSi

       FinPourChaque

 

       Retourner selection

FinFonction

 

 

Exemple de trace

Activité

Début

Fin

Décision

Raison

A114ChoisiePremière fin la plus proche
A235RejetéeCommence avant 4
A306RejetéeCommence avant 4
A457Choisie5 ≥ 4
A539Rejetée3 < 7
A689Choisie8 ≥ 7
A7911Choisie9 ≥ 9

 

La sélection obtenue est {A1, A4, A6, A7}.

Esquisse de preuve par échange

1.  Soit G l’activité qui se termine le plus tôt et O la première activité d’une solution optimale.

2.  Comme fin(G) ≤ fin(O), remplacer O par G ne rend aucune activité ultérieure incompatible.

3.  La solution transformée contient autant d’activités et commence par G.

4.  Le problème restant est le même problème sur les activités commençant après fin(G).

5.  En répétant l’argument, la sélection gloutonne est optimale.

Relation / résultat

Complexité : O(n log n) pour le tri + O(n) pour le parcours = O(n log n).

Si les activités sont déjà triées par date de fin, la sélection est O(n).

 

Exemple 3 — Planification de tâches

Considérons des tâches de durée unitaire. Chaque tâche possède une échéance et un profit obtenu si elle est exécutée avant ou à son échéance. L’objectif est de maximiser le profit total.

Une stratégie classique trie les tâches par profit décroissant et place chaque tâche dans le créneau libre le plus tardif qui respecte son échéance. Placer tardivement une tâche préserve les créneaux précoces pour les tâches ayant des échéances plus contraintes.

 

PSEUDO-CODE — Planification de tâches unitaires avec échéances

Fonction PlanifierTaches(taches) : Tableau

       Trier taches par profit décroissant

       D ← échéance maximale

       planning[1..D] ← VIDE

 

       PourChaque tâche t dans taches Faire

           créneau ← Min(t.echeance, D)

 

           TantQue créneau ≥ 1 ET planning[créneau] ≠ VIDE Faire

               créneau ← créneau - 1

           FinTantQue

 

           Si créneau ≥ 1 Alors

               planning[créneau] ← t

           FinSi

       FinPourChaque

 

       Retourner planning

FinFonction

 

 

Exemple

Tâche

Échéance

Profit

Créneau choisi

T121002
T21701
T3260Aucun créneau libre
T43403
T5120Aucun créneau libre

 

Le planning final est [T2, T1, T4] et le profit total vaut 210.

Analyse

Avec une recherche linéaire du créneau libre, le coût est O(n log n + nD), où D est la plus grande échéance. Une structure d’ensembles disjoints permet d’accélérer la recherche du dernier créneau libre.

Différentes variantes
  • Minimiser le retard maximal : trier les tâches par échéance croissante.
  • Minimiser le temps moyen d’achèvement sur une machine : trier par durée croissante.
  • Maximiser le nombre d’intervalles compatibles : trier par date de fin.
  • Maximiser le profit de tâches unitaires avec échéances : trier par profit et placer au dernier créneau possible.

 

Exemple 4 — Codage de Huffman simplifié

Le codage de Huffman construit un code binaire préfixe dans lequel les symboles fréquents possèdent des codes courts. La stratégie fusionne répétitivement les deux nœuds de fréquence minimale.

Une file de priorité minimale permet d’extraire rapidement les deux fréquences les plus faibles et de réinsérer leur somme.

 

PSEUDO-CODE — Construction d’un arbre de Huffman

Fonction ConstruireHuffman(symboles, frequences) : Noeud

       file ← file de priorité minimale vide

 

       Pour i de 1 à Nombre(symboles) Faire

           Insérer(file, NouveauNoeud(symboles[i], frequences[i]))

       FinPour

 

       TantQue Taille(file) > 1 Faire

           x ← ExtraireMinimum(file)

           y ← ExtraireMinimum(file)

           parent ← NouveauNoeud(aucun symbole, x.frequence + y.frequence)

           parent.gauche ← x

           parent.droite ← y

           Insérer(file, parent)

       FinTantQue

 

       Retourner ExtraireMinimum(file)

FinFonction

 

 


 

 

Exemple de fusions

Étape

Fréquences disponibles

Deux minimums

Nouvelle fréquence

0A:5, B:9, C:12, D:13, E:16, F:455 et 914
1C:12, D:13, 14, E:16, F:4512 et 1325
214, E:16, 25, F:4514 et 1630
325, 30, F:4525 et 3055
4F:45, 5545 et 55100

 

Génération des codes

On étiquette conventionnellement les arêtes gauches par 0 et les arêtes droites par 1. Le code d’un symbole est la suite des bits rencontrés de la racine à sa feuille. Aucun code n’est préfixe d’un autre, ce qui garantit un décodage sans séparateur.

 

PSEUDO-CODE — Extraction des codes de Huffman

Procédure GenererCodes(noeud, prefixe)

       Si noeud est une feuille Alors

           Afficher noeud.symbole, prefixe

       Sinon

           GenererCodes(noeud.gauche, prefixe + "0")

           GenererCodes(noeud.droite, prefixe + "1")

       FinSi

FinProcédure

 

 

Relation / résultat

Complexité : O(k log k)

k désigne le nombre de symboles distincts. Chaque fusion effectue deux extractions et une insertion dans la file de priorité.

 

Pourquoi la fusion des deux plus faibles est-elle sûre ?
Dans un code préfixe optimal, deux symboles de fréquences minimales peuvent être placés comme feuilles sœurs au niveau le plus profond. En les fusionnant, on réduit le problème à une instance plus petite, ce qui établit la propriété du choix glouton et la sous-structure optimale.

 


 

 

Comparaison des quatre exemples

Problème

Choix local

Structure utile

Optimalité

Rendu de monnaiePlus grande pièce admissibleListe triéeSeulement pour certains systèmes de pièces
Sélection d’activitésFin la plus précoceTableau triéGarantie par argument d’échange
Tâches avec profitProfit maximal puis dernier créneau libreTableau / ensemble disjointGarantie pour la variante unitaire décrite
HuffmanDeux fréquences minimalesTas minimumGarantie pour le coût pondéré des codes préfixes

 

Observation commune
Dans chaque problème correct, le choix local élimine une partie de l’espace de recherche sans supprimer toutes les solutions optimales. La preuve explique précisément pourquoi cette élimination est sûre.

 

13.4 Limites des algorithmes gloutons

Choix local non optimal

Un choix offrant le meilleur gain immédiat peut empêcher une combinaison future plus avantageuse. La stratégie échoue lorsque les décisions interagissent fortement et qu’un bénéfice local masque une perte globale.

Contre-exemples fondamentaux

Rendu de monnaie non canonique

Pour les pièces {4, 3, 1} et le montant 6, choisir 4 conduit à trois pièces, alors que 3 + 3 en utilise deux.

Sac à dos 0/1

Dans le sac à dos fractionnaire, choisir le meilleur rapport valeur/poids est optimal parce qu’un objet peut être fractionné. Dans le sac à dos 0/1, le même critère peut échouer puisque chaque objet doit être pris entièrement ou rejeté.

Objet

Poids

Valeur

Rapport valeur/poids

A10606
B201005
C301204

 

Avec une capacité de 50, le glouton par rapport choisit A puis B pour une valeur 160. La solution optimale choisit B et C pour une valeur 220.

Plus proche voisin pour le voyageur de commerce

Choisir systématiquement la ville la plus proche produit rapidement une tournée, mais un choix court au début peut forcer une très longue arête à la fin. La méthode est une heuristique, sans garantie d’optimalité générale.

Leçon
La plausibilité du critère local et ses bons résultats sur quelques exemples ne remplacent ni une preuve ni une garantie d’approximation.

 

Comparaison avec la programmation dynamique

Critère

Algorithme glouton

Programmation dynamique

DécisionDéfinitive et localeÉvalue plusieurs transitions entre états
Sous-problèmesSouvent un seul sous-problème résiduelNombreux sous-problèmes qui se recouvrent
MémoireSouvent faibleTable ou mémoïsation parfois volumineuse
TempsSouvent O(n) ou O(n log n)Souvent polynomial mais plus élevé
OptimalitéNécessite le choix glouton et une preuveDécoule de la relation de récurrence exhaustive sur les états
ExemplesActivités, Huffman, Kruskal, PrimSac à dos 0/1, rendu de monnaie général, distance d’édition

 

Glouton exact ou heuristique ?

Lorsque la correction est démontrée, la méthode gloutonne est un algorithme exact. Lorsqu’aucune preuve n’existe mais que la solution est généralement acceptable, elle devient une heuristique. Il faut alors évaluer expérimentalement la qualité des résultats et, si possible, fournir une borne d’approximation.

Situation

Décision recommandée

Propriété du choix glouton démontréeUtiliser l’algorithme glouton exact
Petite instance et besoin d’optimalitéUtiliser recherche exhaustive, retour sur trace ou programmation dynamique
Grande instance, exact difficileUtiliser heuristique gloutonne et mesurer l’écart
Sous-problèmes répétés et états bien définisUtiliser programmation dynamique
Contraintes évolutives ou en ligneEnvisager une stratégie gloutonne adaptative

 

 

PSEUDO-CODE — Comparaison expérimentale glouton / optimum

Fonction EvaluerGlouton(instances)

       PourChaque instance dans instances Faire

           solutionG ← RésoudreGlouton(instance)

           solutionOpt ← RésoudreExactement(instance)

 

           valeurG ← Evaluer(solutionG)

           valeurOpt ← Evaluer(solutionOpt)

           ecart ← CalculerEcart(valeurG, valeurOpt)

 

           Afficher instance, valeurG, valeurOpt, ecart

       FinPourChaque

FinFonction

Remarque : La solution exacte peut être obtenue par énumération seulement sur de petites instances de test.

 

 

Erreurs fréquentes

  • confondre faisabilité et optimalité ;
  • décrire un critère local ambigu ou dépendant d’un ordre non défini ;
  • oublier les égalités et les règles de départage ;
  • prouver seulement que l’algorithme termine ;
  • généraliser un résultat valable pour une variante à une autre variante ;
  • ignorer le coût du tri ou de la file de priorité ;
  • utiliser un glouton comme solution exacte sans preuve ni mesure de qualité.

Applications guidées

Application 1 — Concevoir un rendu de monnaie

On dispose des pièces {1, 2, 5, 10, 20, 50}. Concevoir une stratégie gloutonne pour rendre 87, produire la trace et préciser la complexité.

 

PSEUDO-CODE — Solution guidée — Monnaie canonique

pieces ← [50, 20, 10, 5, 2, 1]

reste ← 87

rendu ← []

 

PourChaque p dans pieces Faire

       q ← reste DIV p

       Ajouter q occurrences de p à rendu

       reste ← reste MOD p

FinPourChaque

 

Afficher rendu

 

 

Résultat : 50 + 20 + 10 + 5 + 2, soit cinq pièces. Le parcours des k types de pièces est O(k).

Application 2 — Réserver une salle

Une salle ne peut accueillir qu’une activité à la fois. L’objectif est de maximiser le nombre de réservations acceptées. La règle de fin la plus proche permet de libérer la salle le plus tôt possible.

Travail attendu
  • trier les demandes par date de fin ;
  • sélectionner la première demande ;
  • ajouter chaque demande commençant après la fin de la dernière demande retenue ;
  • justifier le choix par un argument d’échange.

 

Application 3 — Compresser un message

À partir des fréquences des caractères d’un message, construire un arbre de Huffman, générer les codes et calculer la longueur totale du message codé.

Relation / résultat

Coût total du code = Σ fréquence(symbole) × longueur(code(symbole))

Huffman minimise ce coût parmi les codes binaires préfixes.

 

Application 4 — Ordonner des interventions urgentes

Une file de priorité peut sélectionner la prochaine intervention selon un score local combinant urgence, échéance et ancienneté. Ce système est glouton au sens opérationnel, mais il n’est optimal que si l’objectif et le modèle de tâches correspondent à une variante démontrée.

Dimension éthique et pratique
Dans les applications réelles, le critère de priorité doit être transparent, auditable et protégé contre la famine des tâches peu prioritaires. Une règle d’augmentation progressive de la priorité peut être nécessaire.

 

Travaux dirigés

TD 1 — Identifier les composants d’un glouton

Pour le problème de sélection d’activités, identifier les candidats, le critère de sélection, le test de faisabilité, la fonction objectif et le critère d’arrêt.

TD 2 — Rendu de monnaie canonique

Appliquer la stratégie gloutonne au montant 289 avec les pièces {100, 50, 20, 10, 5, 2, 1}. Donner le rendu et le nombre de pièces.

TD 3 — Construire un contre-exemple

Montrer que le système de pièces {1, 5, 6, 9} n’est pas toujours compatible avec le choix de la plus grande pièce. Chercher un montant inférieur ou égal à 15.

TD 4 — Sélection d’activités

Sélectionner un nombre maximal d’activités parmi : A(0,3), B(1,2), C(3,5), D(4,7), E(5,7), F(7,9), G(8,10). Présenter la trace.

TD 5 — Argument d’échange

Rédiger une preuve concise montrant que choisir l’activité qui termine le plus tôt est un choix sûr.

TD 6 — Planification avec profits

Planifier les tâches unitaires T1(échéance 2, profit 60), T2(1, 100), T3(3, 20), T4(2, 40), T5(1, 20). Donner le planning et le profit total.

TD 7 — Huffman

Construire les fusions de Huffman pour les fréquences A:2, B:3, C:7, D:8, E:12. Proposer un code binaire valide et calculer son coût pondéré.

TD 8 — Glouton ou programmation dynamique ?

Pour chacun des problèmes suivants, proposer la méthode la plus adaptée et justifier : rendu de monnaie général, sélection d’activités, sac à dos 0/1, sac à dos fractionnaire, plus longue sous-suite commune.

TD 9 — Analyse de complexité

Analyser la complexité d’un algorithme de sélection d’activités avec tri, puis celle de Huffman avec une file de priorité binaire.

TD 10 — Évaluer une heuristique

On utilise la méthode du plus proche voisin pour construire une tournée. Proposer un protocole expérimental permettant de comparer cette heuristique à l’optimum sur de petites instances.

Corrigés indicatifs des travaux dirigés

Correction du TD 1

Composant

Réponse

CandidatsLes activités non encore examinées
SélectionActivité de date de fin minimale
FaisabilitéSon début est supérieur ou égal à la fin de la dernière activité choisie
ObjectifMaximiser le nombre d’activités retenues
ArrêtToutes les activités triées ont été examinées

 

Correction du TD 2

289 = 2×100 + 1×50 + 1×20 + 1×10 + 1×5 + 2×2. Le rendu contient 8 pièces : 100, 100, 50, 20, 10, 5, 2, 2.

Correction du TD 3

Pour le montant 11, le glouton choisit 9 + 1 + 1, soit 3 pièces. La solution 6 + 5 utilise seulement 2 pièces. Le système n’est donc pas canonique.

Correction du TD 4

Après tri par date de fin : B(1,2), A(0,3), C(3,5), D(4,7), E(5,7), F(7,9), G(8,10).

Activité

Décision

Fin de la dernière activité retenue

B(1,2)Choisie2
A(0,3)Rejetée2
C(3,5)Choisie5
D(4,7)Rejetée5
E(5,7)Choisie7
F(7,9)Choisie9
G(8,10)Rejetée9

 

Sélection : B, C, E, F, soit quatre activités.

Correction du TD 5

Soit O une solution optimale dont la première activité est X. Soit G l’activité qui se termine le plus tôt. Comme fin(G) ≤ fin(X), remplacer X par G conserve la compatibilité avec toutes les activités suivantes de O. On obtient donc une solution optimale commençant par G. Le même raisonnement s’applique au sous-problème restant.

Correction du TD 6

Tri par profit : T2(100), T1(60), T4(40), T3(20), T5(20).

Tâche

Échéance

Créneau

T211
T122
T42Aucun
T333
T51Aucun

 

Planning : [T2, T1, T3]. Profit total : 100 + 60 + 20 = 180.

Correction du TD 7

Étape

Fusion

Nouvel ensemble

12 + 3 = 55, 7, 8, 12
25 + 7 = 128, 12, 12
38 + 12 = 2012, 20
412 + 20 = 3232

 

Un codage possible dépend du départage des fréquences égales. Par exemple : E=0, D=10, C=111, A=1100, B=1101. Le coût pondéré vaut 12×1 + 8×2 + 7×3 + 2×4 + 3×4 = 69 bits.

Correction du TD 8

Problème

Méthode

Justification

Rendu de monnaie généralProgrammation dynamiqueLe choix de la plus grande pièce peut échouer
Sélection d’activitésGloutonChoix de la fin la plus précoce démontré optimal
Sac à dos 0/1Programmation dynamiqueLes objets indivisibles créent des dépendances
Sac à dos fractionnaireGloutonChoisir le rapport valeur/poids maximal est optimal
Plus longue sous-suite communeProgrammation dynamiqueSous-problèmes répétés sur deux préfixes

 

Correction du TD 9

Sélection d’activités : tri O(n log n), parcours O(n), soit O(n log n) et O(n) de mémoire si une nouvelle liste est créée. Huffman : k insertions ou construction initiale du tas, puis k−1 fusions avec deux extractions et une insertion, soit O(k log k).

Correction du TD 10

1.  Générer de petites instances de 5 à 10 villes avec des distances symétriques.

2.  Calculer la tournée du plus proche voisin à partir de chaque ville possible.

3.  Calculer l’optimum par énumération des permutations, uniquement pour ces petites tailles.

4.  Comparer le coût absolu, l’écart relatif et le temps de calcul.

5.  Répéter sur plusieurs distributions de points et présenter moyenne, maximum et écart-type de l’erreur.

Travail pratique — Glouton, optimum et contre-exemples

Objectifs

  • implémenter plusieurs stratégies gloutonnes ;
  • construire une solution exacte de référence sur de petites instances ;
  • mesurer la qualité et le temps de calcul ;
  • identifier automatiquement des contre-exemples ;
  • présenter une preuve ou conclure que la stratégie n’est qu’une heuristique.

Partie A — Rendu de monnaie

1.  Implémenter le rendu glouton avec des pièces triées en ordre décroissant.

2.  Implémenter une programmation dynamique calculant le nombre minimal de pièces.

3.  Tester les systèmes {1,2,5,10,20,50}, {1,3,4} et {1,5,6,9}.

4.  Générer les montants de 1 à 200 et relever les premiers contre-exemples.

5.  Comparer le temps et la mémoire des deux méthodes.

 

PSEUDO-CODE — Programmation dynamique pour le rendu minimal

Fonction MonnaieOptimale(montant, pieces) : Entier

       dp[0] ← 0

 

       Pour s de 1 à montant Faire

           dp[s] ← +∞

           PourChaque p dans pieces Faire

               Si p ≤ s ET dp[s - p] ≠ +∞ Alors

                dp[s] ← Min(dp[s], 1 + dp[s - p])

               FinSi

           FinPourChaque

       FinPour

 

       Retourner dp[montant]

FinFonction

 

 

Partie B — Sélection d’activités

1.  Générer un ensemble d’intervalles aléatoires.

2.  Implémenter le glouton par fin croissante.

3.  Pour n ≤ 20, calculer l’optimum par exploration de tous les sous-ensembles.

4.  Vérifier expérimentalement que les cardinalités coïncident.

5.  Rédiger un argument d’échange indépendant des tests.

Partie C — Huffman

1.  Compter les fréquences des caractères d’un texte.

2.  Construire l’arbre avec une file de priorité minimale.

3.  Produire le dictionnaire caractère → code.

4.  Encoder puis décoder le texte.

5.  Comparer la taille obtenue à un codage fixe de 8 bits par caractère.


 

 

Jeux d’essai minimaux

Test

Entrée

Résultat attendu

M1{1,2,5,10}, montant 18Glouton optimal : 10+5+2+1
M2{1,3,4}, montant 6Glouton 3 pièces ; optimum 2 pièces
A1Intervalles déjà compatiblesToutes les activités sélectionnées
A2Intervalles tous chevauchantsUne seule activité sélectionnée
H1Un seul symboleCas spécial : code 0 ou longueur 1
H2Fréquences égalesCode valide ; le départage peut modifier les bits mais pas le coût optimal

 

Livrables

  • code source organisé et documenté ;
  • description des structures de données utilisées ;
  • tableau des résultats glouton / optimum ;
  • liste des contre-exemples trouvés ;
  • analyse de complexité ;
  • courte justification de correction pour la sélection d’activités et Huffman ;
  • discussion sur les limites de l’expérimentation.

Grille d’évaluation

Critère

Points

Correction des implémentations gloutonnes4
Solution exacte de référence et reconstruction3
Jeux d’essai et détection de contre-exemples3
Huffman : encodage et décodage3
Analyse de complexité et mesures3
Justification théorique et qualité du rapport3
Lisibilité, modularité et gestion des erreurs1

 


 

 

Synthèse du chapitre

Notion

À retenir

Choix localDécision considérée comme la meilleure à l’étape courante
Construction progressiveLa solution est étendue par ajouts faisables
Absence de retourUn choix accepté n’est pas annulé
Choix gloutonIl existe un optimum compatible avec le choix local
Sous-structure optimaleLe reste du problème doit être résolu optimalement
PreuveÉchange, induction, avance ou propriété de coupe
LimiteUne règle intuitive peut être seulement heuristique
ComplexitéSouvent dominée par un tri ou une file de priorité : O(n log n)

 

Méthode en sept questions
  • Quel est l’objectif exact ?
  • Quels sont les candidats ?
  • Quel critère local est utilisé ?
  • Comment vérifier la faisabilité ?
  • Pourquoi le choix est-il sûr ?
  • Quel sous-problème reste à résoudre ?
  • Existe-t-il un contre-exemple ou une meilleure méthode ?

 

Glossaire

Terme

Définition

Algorithme gloutonAlgorithme construisant une solution par décisions locales définitives
CandidatÉlément susceptible d’être ajouté à la solution
Choix localMeilleure décision selon le critère courant
FaisabilitéRespect des contraintes par la solution partielle
Fonction objectifMesure à minimiser ou maximiser
Propriété du choix gloutonExistence d’un optimum compatible avec le choix effectué
Sous-structure optimaleComposition d’un optimum à partir d’optima de sous-problèmes
Argument d’échangeTransformation d’un optimum pour intégrer le choix glouton
HeuristiqueMéthode rapide sans garantie générale d’optimalité
Code préfixeCode dans lequel aucun mot n’est préfixe d’un autre

 

Auto-évaluation

Je peux…

Oui

À revoir

définir une stratégie gloutonne et ses composants
distinguer choix local, faisabilité et optimalité
expliquer la propriété du choix glouton
reconnaître une sous-structure optimale
rédiger un argument d’échange simple
appliquer la sélection d’activités
construire un arbre de Huffman
produire un contre-exemple au rendu glouton
comparer glouton et programmation dynamique
analyser la complexité d’une solution gloutonne

 

Conclusion
Les algorithmes gloutons combinent simplicité, rapidité et élégance. Leur force ne repose pas seulement sur un choix intuitif, mais sur la démonstration que ce choix ne compromet pas l’optimum. Savoir chercher une preuve et savoir construire un contre-exemple sont donc deux compétences indissociables.