Vous êtes sur la page 1sur 4

Présenter le problème d’une manière simple et précise :

Historique :

Ce problème fait partie des 21 problèmes NP-complets identifiés par Richard Karp en 1972.

Ces 21 problèmes sont considérés comme les problèmes les plus difficiles en optimisation combinatoire. (approché-
exacte)

Ce problème suscite encore un intérêt majeur pour la communauté des chercheurs

On a 2 type du problème du sac-`a-dos

 unidimensionnel (noté KP) (càd 1 contrainte)


 multidimensionnel (noté MKP) (càd plusieurs contrainte)

Son application dans la vie réelle :


Nous pouvons retrouver le problème du sac à dos dans de nombreux domaines :

 en cryptographie,il fut à l’origine du premier algorithme de chiffrement


asymétrique en 1976 ;
 dans les systèmes financiers, où l’idée est la suivante : étant donné un certain montant
d’investissement dans des projets, quels projets choisir pour que le tout rapporte le plus
d’argent possible ;
 pour la découpe de matériaux, afin de minimiser les pertes dues aux chutes ;
 dans le chargement de cargaisons (avions, camions, bateaux…) ;
 ou encore, dès qu’il s’agit de préparer une valise ou un sac à dos pour

une randonnée.

Les différents algorithmes existants

Il existe deux grandes catégories de méthodes de résolution de problèmes d’optimisation combinatoire : les
méthodes exactes et les méthodes approchées

Une méthode approchée a pour but de trouver une solution avec un bon compromis entre la
qualité de la solution et le temps de calcul. Pour le problème du sac à dos, voici un exemple
d’algorithme de ce type :

 Algo Glouton
 Algo générique

Pour trouver la solution optimale, et être certain qu’il n’y a pas mieux, il faut utiliser une
méthode exacte, qui demande un temps de calcul beaucoup plus long
Principe :

1. imaginez un sac à dos qui peut contenir au maximum 10kg  poids = 10kg
2. on dispose de plusieurs objets de poids et de valeurs différentes
3. l’objectif est de connaitre quel objet on va prendre et le mettre dans le sac pour avoir une
valeur qui est maximale sans dépasser le poids de 10kg que le sac peut contenir
4. il faut choisir des objets à prendre ou non et savoir qu’on ne peut pas prendre un objet
plusieurs fois

Exemple :

Objet 1 2 3
Valeur 2 3 5
Poids 5 6 2

https://interstices.info/le-probleme-du-sac-a-dos/

Méthode numérique : pour résoudre le problème grace à la méthode heuristique ( stratégie de calcul
rapide)

1. mettre en premier dans le sac les objets qui nt la plus grande valeur avec le plus petit poids
possible
2. calculer pour chaque objet : valeur/poids
3. au début mettre dans le sac l’objet 3 vu qu’il est le plus gros nombre des trois objets puis
l’objet 2 (poids 6 + 2)
cette méthode est rapide mais elle n’est pas génial
Car le problème qu’on peut mettre qu’une seule fois l’objet d’un sac et on ne peut pas
l’enlever pour tester d’autres possibilités.--> algorithme gluton

algorithme gluton : on met une fois l’objet dans d’un sac et on peut plus le ressortir

Méthode complète :

arbre

Sac : profit + poids

On va sélectionner un ensemble de sac (k)

Le but est de trouver k qui maximise le profit total avec le respect d’une contrainte de capacité de
poids.

Algorithme glouton :

L'algorithme le plus simple est un algorithme glouton. L'idée est d'ajouter en priorité les objets les plus efficaces, jusqu'à
saturation du sac :
2 objets à placer dans le sac.
1er objet : profit=2, poids=1
2ème objet : profit=poids=W
 on choisit en premier le 1er objet il est plus efficace empêcher la prise du second
nbr element 5
capacité sac 15

Elément Quantité profits

1 6 16

2 6 11

3 6 15

4 3 24

5 2 7

1. initialiser monnaie à une liste vide


2. initialiser la somme_restante à somme
3. tant que somme_restante >0 :
o On choisit la plus grande valeur dans systeme inférieure à somme_restante
o on ajoute cette valeur à monnaie
o on ajoute cette valeur à somme_restante
4. renvoyer monnaie

trier les objets par ordre décroissant d'efficacité // par rapport leurs profit
w_capActu := 0 // représente la capacité actuelle

pour i de 1 à n
si w[i] + w_capActu  ≤ W alors //w[i]:cap de l’élémént; W: capTotaleSac
x[i] := 1 //element accepté
w_capActu := w_capActu  + w[i]
sinon
x[i] := 0
fin si
fin pour

Vous aimerez peut-être aussi