Vous êtes sur la page 1sur 2

Notes de cours : algorithmes approchés Université Pierre et Marie Curie

3 Le problème du sac à dos

Nous nous intéressons dans cette section au problème d’optimisation du sac à dos : étant donnés
un sac à dos de capacité B ∈ N et un ensemble S de n objets {a1 , . . . , an }, définis par leurs poids et
leurs valeurs, poids(ai )∈ N et valeur(ai )∈ N, le but est de déterminer un sous-ensemble d’objets de S
dont le poids est au plus B et dont la valeur totale est maximum.

3.1 Un algorithme pseudo-polynomial

Avant de décrire un schéma d’approximation pour le problème du sac à dos, présentons tout d’abord
un algorithme, basé sur la programmation dynamique, qui résoud de manière exacte ce problème. Cet
algorithme n’est pas polynomial car ce problème est NP-difficile, mais il est dit pseudo-polynomial.
Un algorithme pseudo-polynomial est un algorithme dont le temps d’exécution est, pour chaque
instance I, borné par un polynôme en la taille de I dans laquelle les nombres sont notés en unaire et
non en binaire (i.e. pour coder chaque nombre - ici le poids et la valeur de chaque objet -, le nombre
de bits nécessaires est le nombre de bits nécessaires pour écrire le nombre en unaire : 1000 bits pour
écrire le nombre 1000 par exemple). Un algorithme pseudo-polynomial est donc efficace si les nombres
ne sont pas trop grands.
L’algorithme pseudo-polynomial résolvant le problème du sac à dos est le suivant :
Notons OP T la valeur des objets sélectionnés dans une solution optimale, et Vmax la valeur maxi-
male d’un objet de S. On a nVmax ≥ OP T . Pour tout i ∈ {1, . . . , n} et v ∈ {0, . . . , nVmax }, notons
Si,v un sous-ensemble de {a1 , . . . , ai } de valeur exactement v et dont le poids est minimum. Notons
P (i, v) le poids cumulé des objets de Si,v ( P (i, v) = +∞ s’il n’existe pas de tel ensemble).

Il est facile de calculer P (1, v) pour tout v ∈ {0, . . . , nVmax } (seul le premier objet est sélectionné) :
P (1, 0) = 0, P (1, v) = poids(a1 ) si v = valeur(a1 ), et P (1, v) = +∞ sinon.
La récurrence suivante permet de calculer toutes les valeurs P (i, v) en temps O(n2 Vmax ) :

min{P (i, v), poids(ai+1 ) + P (i, v − valeur (ai+1 ))} si valeur(ai+1 ) ≤ v
P (i + 1, v) =
P (i, v) sinon
La valeur maximum est alors OP T = max{v : P (i, v) ≤ B} pour un sac à dos de capacité B.
En pratique, pour calculer OP T on construit un tableau de taille n × (nVmax + 1), dans lequel on
stocke les valeurs P (i, v). Une fois OP T trouvée, il suffit de remonter dans le tableau pour voir quels
objets ont été sélectionnés : on part de la case menant à la solution optimale P (n, v) (avec v = OP T ),
et on regarde si an a été sélectionné en regardant si P (n, v) = P (n − 1, v) (an n’a pas été sélectionné)
ou si P (n, v) = poids(an ) + P (n − 1, v − valeur (an )) (an a été sélectionné), et ainsi de suite pour les
autres objets.

3.2 Un schéma d’approximation totalement polynomial

La complexité temporelle de l’algorithme que nous venons de présenter étant en O(n2 Vmax ), si
Vmax est borné par un polynôme en n alors cet algorithme est polynomial. Cet algorithme est donc
efficace pour les petits nombres. Pour obtenir un schéma d’approximation fortement polynomial, on
va exploiter ce fait : nous allons ignorer les bits les moins significatifs des valeurs des objets (ce nombre
dépendra de la précision ε voulue). Nous obtiendrons alors, en un temps borné par n et par 1ε , une
solution de valeur au moins égale à (1 − ε)OP T .
Cet algorithme est le suivant :

4
Notes de cours : algorithmes approchés Université Pierre et Marie Curie

εVmax
1. Etant donné ε > 0, poser K = n .

2. Pour chaque objet ai , poser valeur’(ai )=� valeur


K
(ai )
�.
3. Lancer l’algorithme de progammation dynamique avec ces valeurs arrondies et trouver un
ensemble S � de valeur maximum.
4. Retourner S � .

Théorème : Cet algorithme est un schéma d’approximation totalement polynomial pour le problème
du Sac à dos.
Preuve : Le temps d’exécution de l’algorithme est en O(n2 � Vmax 2 n
K �) = O(n � ε �), ce qui est bien un
1
polynôme en n et en ε . Montrons maintenant que la solution retournée a une valeur supérieure ou
égale à (1 − ε)OP T .
Notons O l’ensemble des valeurs (non arrondies) correspondant à une solution optimale. Pour tout
objet ai , du fait de l’arrondi vers le bas, K.valeur’(ai ) est inférieur ou égal à valeur(ai ), mais pas de
plus que K : valeur(ai ) = K. valeur’(ai ) + xi , avec 0 ≤ xi < K. Ainsi,

valeur(O) − K. valeur’(O) ≤ nK.

L’algorithme de programmation dynamique retourne une valeur totale au moins aussi bonne que celle
de O avec les valeurs arrondies (valeur’(S � ) ≥ valeur’(O)). On a donc :

valeur(S � ) ≥ K. valeur’(O) ≥ valeur(O) − nK = OP T − εVmax ≥ (1 − ε)OP T

La dernière inégalité vient du fait que OP T ≥ Vmax . �

Vous aimerez peut-être aussi