Le sac de valeur maximum
Cours · algorithmique (école d'ingénieur), chapitre 2 · école d'ingénieur, informatique · le début du chapitre, la suite sur Adloun
Objectifs du chapitre
- Modéliser un problème de choix d'objets sous contrainte de contenance (le « sac à dos »).
- Montrer, par des contre-exemples, que les stratégies gloutonnes naturelles ne le résolvent pas.
- Établir l'équation de récurrence à deux paramètres , la calculer dans un tableau à deux dimensions et reconstruire un sac optimal.
- Réutiliser le même schéma sur deux variantes : les spots publicitaires et le sous-ensemble de somme donnée.
2.1 Le problème
On dispose de objets numérotés . L'objet a une taille et une valeur , deux entiers strictement positifs. On dispose aussi d'un sac de contenance , un entier positif ou nul.
La taille d'un sous-ensemble d'objets est la somme des tailles de ses éléments ; sa valeur est la somme de leurs valeurs. Un sac de contenance est un sous-ensemble d'objets de taille inférieure ou égale à . Chaque objet est disponible en un seul exemplaire : il est dans le sac ou il n'y est pas.
Problème
Calculer un sac de contenance de valeur maximum.
Ce problème, connu en anglais sous le nom de 0/1 knapsack problem, est l'un des plus étudiés de l'optimisation discrète. Il modélise d'innombrables situations : choisir des projets sous une contrainte de budget, charger un camion, découper une barre de métal, remplir un créneau publicitaire (section 2.8), composer un portefeuille d'investissements…
| objet | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| valeur | 11 | 4 | 5 | 4 | 4 |
| taille | 9 | 3 | 2 | 3 | 3 |
Le sac a pour taille et pour valeur . Nous verrons qu'aucun sac de contenance ne fait mieux. On remarque que ce sac optimal n'est pas « rempli à ras bord » : il reste deux unités de place libre, et pourtant on ne peut pas faire mieux.
En Java, les données sont deux tableaux et de termes généraux et , et un entier .
2.2 Deux gloutons et un contre-exemple
2.2.1 Glouton par valeurs décroissantes
Première idée : « je prends d'abord les objets les plus précieux ». On range les objets par valeurs décroissantes, puis on les examine dans cet ordre en ajoutant au sac chaque objet qui tient dans la place restante.
Sur l'exemple, l'objet (valeur , taille ) est pris en premier ; il ne reste qu'une unité de place, aucun autre objet n'entre. Le sac glouton vaut , contre pour le sac . L'objet le plus précieux est aussi le plus encombrant : il « bouche » le sac.
2.2.2 Glouton par rapport valeur/taille
Deuxième idée, plus fine : « je prends d'abord les objets les plus rentables », c'est-à-dire ceux dont la valeur par unité de taille est la plus grande. Sur l'exemple, l'objet a le meilleur rapport (), suivi des objets (), puis de l'objet (). Ce glouton construit de valeur : il trouve l'optimum… par chance.
Trois objets de (taille, valeur) , , , et un sac de contenance . Le premier objet a le meilleur rapport () ; une fois pris, il reste unités de place et aucun autre objet n'entre. Le sac glouton vaut . Or le sac formé des deux autres objets vaut .
Le programme SacGlouton.java compare les deux gloutons à la valeur maximum calculée plus loin :
$ java SacGlouton
V = [11, 4, 5, 4, 4], T = [9, 3, 2, 3, 3], C = 10
glouton par valeurs : 11
glouton par valeur/taille : 13
valeur maximum m(n,C) : 13
V = [7, 5, 5], T = [6, 5, 5], C = 10
glouton par valeurs : 7
glouton par valeur/taille : 7
valeur maximum m(n,C) : 10
À retenir
Aucun des deux gloutons ne résout le problème du sac. Le second est souvent bon en pratique, mais « souvent bon » n'est pas « juste ».
2.2.3 L'énumération exhaustive
Chaque objet est dans le sac ou n'y est pas : il y a sous-ensembles. Pour objets, : à un milliard de sous-ensembles examinés par seconde, il faudrait plus de 36 ans. L'énumération est juste mais inutilisable dès que dépasse quelques dizaines.
2.3 Supposons le problème résolu
Appliquons la méthode du chapitre 1. Notons la valeur maximum d'un sac de contenance dont le contenu est un sous-ensemble des objets, et considérons un tel sac optimal . Regardons le dernier objet, celui de numéro . Il n'y a que deux cas.
La suite du cours est sur Adloun
Le chapitre en entier, formules et figures comprises, avec le tuteur, les fiches, les QCM et les exercices.
Lire la suite du coursEn accès libre, sans inscription.