Algorithmes gloutons
Numérique et sciences informatiques

Lors d'un trek en Basse Terre, vous tombez sur un gisement de pierres précieuses. A l'aide du web vous identifiez la valeur des pierres facilement.
Le problème du sac à dos : quelles boîtes choisir afin de maximiser la somme emportée tout en ne dépassant pas les 15 kg autorisés ?

Entraînement 1
Déterminez les objets que vous auriez intérêt à emporter, sachant que :
- tous les objets devront tenir dans le sac à dos (15 Kg maxi)
- vous cherchez à obtenir un gain maximum.
Ce genre de problème est un grand classique en informatique, on parle de problème d'optimisation . Il existe toujours plusieurs solutions possibles à un problème d'optimisation (dans le problème du sac à dos, on peut choisir A + E, D + C, B + E, ... Toutes les combinaisons sont possibles à partir du moment où la masse totale ne dépasse pas 15 Kg), mais on ne cherche pas n'importe quelle solution, on cherche une solution dite optimale : dans notre exemple on cherche le plus grand gain possible. Souvent, dans les problèmes d'optimisation, il n'existe pas une solution optimale, mais plusieurs solutions optimales, résoudre un problème d'optimisation c'est donc trouver une des solutions optimales .
Il existe différentes méthodes algorithmiques permettant de trouver une solution optimale à un problème d'optimisation : il peut, en effet, être intéressant "d'automatiser" la résolution des problèmes d'optimisation à l'aide d'algorithme (dans notre cas, trouver un algorithme qui trouve une solution optimale au problème du sac à doc).
En apparence, la solution la plus simple dans le cas du sac à dos serait d'écrire un algorithme qui teste toutes les combinaisons d'objets possibles et qui retient les solutions qui offrent un gain maximum.
Dans notre cas précis, avec seulement 5 objets, cette solution pourrait être envisagée, mais avec un plus grand nombre d'objets, le temps de calculs, même pour un ordinateur très puissant, deviendrait trop important.
En effet l'algorithme qui testerait toutes les combinaisons possibles (on parle de force brute) aurait une complexité en temps en O(an) avec a une constante et n les nombre d'objets.
On parle d'une complexité exponentielle.
Les algorithmes à complexité exponentielle ne sont pas efficaces pour résoudre des problèmes, le temps de calcul devient beaucoup trop important quand n devient très grand.
À la place de cette méthode "je teste toutes les possibilités", il est possible d'utiliser une méthode dite gloutonne (greedy en anglais).
Qu'est-ce qu'une méthode gloutonne ?
La résolution d'un problème d'optimisation se fait généralement par étapes : à chaque étape on doit faire un choix. Par exemple, dans le problème du sac à dos, nous ajoutons les objets un par un, chaque ajout d'un objet constitue une étape: à chaque étape on doit choisir un objet à mettre dans le sac. Le principe de la méthode gloutonne est de, à chaque étape de la résolution du problème, faire le choix qui semble le plus pertinent sur le moment, avec l'espoir qu'au bout du compte, cela nous conduira vers une solution optimale du problème à résoudre. Autrement dit, on fait des choix localement optimaux dans l'espoir que ces choix mèneront à une solution globalement optimale (le "localement" signifie ici "à chaque étape de la résolution du problème").
Appliquons une méthode gloutonne à la résolution du problème du sac à dos :
-
Sachant que l'on cherche à maximiser le gain, commençons par établir un tableau nous donnant la "valeur massique" de chaque objet (pour chaque objet on divise sa valeur par sa masse) :
Optimisation du sac
À gauche : tri des boîtes par ordre d'intérêt (ici en dollars par kilogramme). À droite : insertion dans l'ordre des boîtes, si cela est possible.valeur massique des objets objet A B C D E masse 12 Kg 9 Kg 7 Kg 5 Kg 2 Kg valeur marchande en k$ 7 10 3 2 1 valeur massique 0,58 k$/Kg 1,11 k$/Kg 0,43 k$/Kg 0,4 k$/Kg 0,5 k$/Kg
- On classe ensuite les objets par ordre décroissant de valeur massique : B(9kg) - A(12kg) -E(2kg) - C(7kg) - D(5kg)
-
Enfin, on remplit le sac en prenant les objets dans l'ordre et en s'arrêtant dès que la masse limite est atteinte. C'est ici que ce fait "le choix glouton", à chaque étape, on prend l'objet
ayant le rapport "valeur-masse" le plus intéressant au vu des objectifs :
- 1re étape : B (9 Kg)
- 2e étape : B + A (9+ 12 = 21 Kg) => impossible, on dépasse les 15 Kg.
- 3e étape : B + E (9+ 2 = 11 Kg)
- 4e étape : B + E + C > 15 kg => impossible, on dépasse les 15 Kg.
- 5e étape : B + E + D > 15 kg => impossible, on dépasse les 15 Kg.
On obtient ici une solution de 11 $ pour 11 kg.
Cette méthode gloutonne peut être "automatisée", il est donc possible d'écrire un algorithme glouton (un algorithme qui est basé sur une méthode gloutonne) afin de trouver une solution au problème du sac à dos avec n'importe quelles valeurs (nombre d'objets, masse des objets, valeur des objets, masse maximum).
La solution trouvée ci-dessus est-elle optimale ?
On constate rapidement que la réponse est non, car la solution optimale est de 12 $ et 14 kg. Dans notre problème, la méthode gloutonne ne nous donne pas une solution optimale.
Plus généralement , il est important de bien comprendre qu'un algorithme glouton ne donne pas forcement une solution optimale.
Examinons un autre problème d'optimisation : le problème du rendu de monnaie
Nous sommes des commerçants, nous devons rendre la monnaie à un client.
Ce problème est un grand classique de l'algorithmique.

Supposons qu'on doive vous rendre la somme de 4.34€ (10 - 5.66).
Il y a plusieurs façons de procéder. On peut par exemple vous rendre 434 pièces de 1 cent ou 43 pièces de 10 cents et 4 pièces de 1 cents.
Il y a bien évidemment énormément de possibilités.
Il y a fort à parier que les solutions du type "434 pièces de 1 cent" ne vous conviennent pas, pour cause, personne n'a envie de remplir son porte monnaie avec autant de pièces...