Vous êtes sur la page 1sur 8

Le problme du sac dos

Prsentation du problme (daprs http://interstices.info/jcms/c_19213/le-probleme-du-sac-a-dos) Lnonc de ce problme fameux est simple : tant donn plusieurs objets possdant chacun un poids et une valeur et tant donn un poids maximum pour le sac, quels objets faut-il mettre dans le sac de manire maximiser la valeur totale sans dpasser le poids maximal autoris pour le sac ? Toute formulation de ce problme commence par un nonc des donnes. Dans notre cas, nous avons un sac dos de poids maximal P et n objets. Pour chaque objet i, nous avons un poids pi et une valeur vi. Pour quatre objets (n = 4) et un sac dos d'un poids maximal de 30 kg (P = 30), nous avons par exemple les donnes suivantes : Objets 1 2 3 4 vi 7 4 3 3 pi 13 12 8 10 Ensuite, il nous faut dfinir les variables qui reprsentent en quelque sorte les actions ou les dcisions qui amneront trouver une solution. On dfinit la variable xi associe un objet i de la faon suivante : xi = 1 si lobjet i est mis dans le sac, et xi = 0 si lobjet i nest pas mis dans le sac. Dans notre exemple, une solution ralisable est de mettre tous les objets dans le sac dos sauf le premier, nous avons donc : x1 = 0, x2 = 1, x3 = 1, et x4 = 1. Puis il faut dfinir les contraintes du problme. Ici, il n'y en a quune : la somme des poids de tous les objets dans le sac doit tre infrieure ou gale au poids maximal du sac dos. Cela scrit ici x1.p1 + x2.p2 + x3.p3 + x4.p4 P et pour n objets :
i=n

x .p P
i i

Pour vrifier que la contrainte est respecte dans notre exemple, il suffit de calculer cette somme : 0 13 + 1 12 + 1 8 + 1 10 = 30, ce qui est bien infrieur ou gal 30, donc la contrainte est respecte. Nous parlons alors de solution ralisable. Mais ce nest pas ncessairement la meilleure solution. Enfin, il faut exprimer la fonction qui traduit notre objectif : maximiser la valeur totale des objets dans le sac. Pour n objets, cela scrit :
i=n

i=1

max xi .vi
Dans notre exemple, la valeur totale contenue dans le sac est gale 10. Cette solution nest pas la meilleure, car il existe une autre solution de valeur plus grande que 10 : il faut prendre seulement les objets 1 et 2 qui donneront une valeur totale de 11. Il nexiste pas de meilleure solution que cette dernire, nous dirons alors que cette solution est optimale.
i=1

Mthodes de rsolution Il existe deux grandes catgories de mthodes de rsolution de problmes doptimisation combinatoire : les mthodes exactes et les mthodes approches. Les mthodes exactes permettent dobtenir la solution optimale chaque fois, mais le temps de calcul peut tre long si le problme est compliqu rsoudre. Les mthodes approches, encore appeles heuristiques, permettent dobtenir rapidement une solution approche, donc pas ncessairement optimale. Nous allons dtailler un exemple dalgorithme de rsolution de chaque catgorie. Mthode approche Une mthode approche a pour but de trouver une solution avec un bon compromis entre la qualit de la solution et le temps de calcul. Pour le problme du sac dos, voici un exemple dalgorithme de ce type : calculer le rapport (vi / pi) pour chaque objet i ; trier tous les objets par ordre dcroissant de cette valeur ; slectionner les objets un un dans lordre du tri et ajouter lobjet slectionn dans le sac si le poids maximal reste respect. Droulons cet algorithme sur notre exemple : Premire tape : Objets 1 2 3 4 vi / pi 0,54 0,33 0,37 0,30 Deuxime tape : Objets vi pi vi / pi Troisime tape : Objet 1 : on le met dans le sac vide, le poids du sac est alors de 13 et infrieur 30 ; Objet 3 : on le met dans le sac car 13 + 8 = 21 est infrieur 30 ; Objet 2 : on ne le met pas dans le sac car le poids total (33) dpasserait 30. Objet 4 : on ne le met pas dans le sac (poids total de 31). La solution trouve est donc de mettre les objets 1 et 3 dans le sac, ce qui donne une valeur de 10. Cette solution nest pas optimale, puisquune solution avec une valeur totale de 11 existe. Nanmoins, cet algorithme reste rapide mme si le nombre dobjets augmente considrablement. Ce type dalgorithme est aussi appel algorithme glouton, car il ne remet jamais en cause une dcision prise auparavant. Ici, lorsque lobjet 2 ne peut pas entrer dans le sac, lalgorithme nessaie pas denlever lobjet 3 du sac pour y mettre l'objet 2 sa place. 1 7 13 0,54 3 3 8 0,37 2 4 12 0,33 4 3 10 0,30

Mthode exacte Pour trouver la solution optimale, et tre certain quil ny a pas mieux, il faut utiliser une mthode exacte, qui demande un temps de calcul beaucoup plus long (si le problme est difficile rsoudre). Il nexiste pas une mthode exacte universellement plus rapide que toutes les autres. Chaque problme possde des mthodes mieux adaptes que d'autres. Nous allons prsenter un exemple dalgorithme de ce type, nomm procdure par sparation et valuation (PSE), ou en anglais branch and bound. Nous nexposerons ici quune version simplifie dune PSE. Une PSE est un algorithme qui permet dnumrer intelligemment toutes les solutions possibles. En pratique, seules les solutions potentiellement de bonne qualit seront numres, les solutions ne pouvant pas conduire amliorer la solution courante ne sont pas explores. Pour reprsenter une PSE, nous utilisons un arbre de recherche constitu : de nuds ou sommets, o un nud reprsente une tape de construction de la solution d'arcs pour indiquer certains choix faits pour construire la solution. Dans notre exemple, les nuds reprsentent une tape pour laquelle des objets auront t mis dans le sac, dautres auront t laisss en dehors du sac, et dautres, encore, pour lesquels aucune dcision naura encore t prise. Chaque arc indique laction de mettre un objet dans le sac ou, au contraire, de ne pas le mettre dans le sac. La figure suivante reprsente larbre de recherche du problme donn en exemple.
{1,2,3} {1,2} {1,2} {1} {1,3} {1} {1} {} {2,3} {2} {2} {} {3} {} {} {1,2,3,4} {1,2,3} {1,2,4} {1,2} {1,3,4} {1,3} {1,4} {1} {2,3,4} {2,3} {2,4} {2} {3,4} {3} {4} {}

On associe lensemble vide la racine (dont la profondeur est 0) et pour un nud de profondeur i-1, on construit deux fils : celui du haut o lon ajoute lobjet i dans le sac et celui du bas o le sac reste tel quel. Larbre de recherche achev, chaque feuille reprsente alors une solution potentielle mais pas forcment ralisable. Dans le schma, les feuilles au bord pais reprsentent les propositions irralisables car suprieures au poids maximal ne pas

dpasser. Pour dterminer la solution, il suffit de calculer la valeur du sac pour chaque nud feuille acceptable et de prendre la solution ayant la plus grande valeur. Cependant la taille de larbre de recherche est exponentielle en le nombre dobjets. Aussi il existe de nombreuses techniques algorithmiques de parcours de ce type darbre. Ces techniques ont pour but de diminuer la taille de larbre et daugmenter la rapidit du calcul. Par exemple, on peut remarquer que le poids du nud interne {1,2,3} dpasse dj le poids maximal, il ntait donc pas ncessaire de dvelopper ltape suivante avec lobjet 4. Les procdures par sparation et valuation (PSE) permettent dlaguer encore plus cet arbre en utilisant des bornes infrieures et suprieures de la fonction objectif : Une borne infrieure est une valeur minimum de la fonction objectif. Autrement dit, cest une valeur qui est ncessairement infrieure la valeur de la meilleure solution possible. Dans notre cas, une configuration du sac ralisable quelconque fournit une borne infrieure. Une borne suprieure est une valeur maximale de la fonction objectif. Autrement dit, nous savons que la meilleure solution a ncessairement une valeur plus petite. Dans notre cas, nous savons que la valeur de la meilleure solution est ncessairement infrieure la somme des valeurs de tous les objets (comme si on pouvait tous les mettre dans le sac).

Supposons maintenant que la borne infrieure soit initialise par lalgorithme heuristique vu prcdemment. Pendant la recherche chaque nud, nous pouvons dterminer une borne suprieure : la somme de toutes les valeurs de tous les objets dj mis dans le sac plus la somme des valeurs des objets restants dont on ne sait pas encore sils seront dans le sac. partir dun nud et de sa borne suprieure, nous savons que les solutions descendantes de ce nud ne pourront pas avoir une valeur plus grande que cette borne suprieure. Si jamais, un nud donn, la valeur de la borne suprieure est infrieure la valeur de la borne infrieure, alors il est inutile dexplorer les nuds descendants de celui-ci. On dit quon coupe larbre de recherche. En effet, si partir dun nud, nous savons que nous ne pourrons pas faire plus de 10 (borne suprieure calcule) et que la borne infrieure existante est 11 (on a dj une solution de valeur 11), alors les solutions descendantes de ce nud ne sont pas intressantes. Enfin, dernire remarque, la valeur de la borne infrieure peut tre actualise lorsquest trouve une solution ralisable qui possde une valeur plus grande. Ce systme de calcul de bornes demande un faible cot de temps de calcul, et permet daugmenter la rapidit de la PSE puisquelle coupe des branches darbre pour ne pas perdre de temps les explorer. D'autres techniques servent diminuer la taille de larbre et augmenter la rapidit. Par exemple, elles sont bases sur lordre dans lequel on prend les dcisions sur les objets, ou sur une valuation chaque nud, ou encore sur des proprits du problme qui permettent de dduire des conclusions sur certains objets. Sur notre exemple initial, il est possible dobtenir de faon exacte la solution optimale en nexaminant que 9 nuds au lieu de 31.

Travail demand Il sagit tout dabord de comparer diffrentes mthodes pour rsoudre des instances du problme du sac dos selon quatre mthodes : mthode approche gloutonne ; mthode numrative (dcrite ci-aprs) ; mthode rcursive (sans optimisation); mthode PSE. Le premier objectif est de prsenter lors du premier TD une implmentation de la mthode gloutonne. Dans un premier temps vous pourrez vous concentrer sur la mise au point des algorithmes : lnonc des donnes pourra tre contenu dans un tableau constant et le code source pourra tre concentr dans un seul fichier. Ensuite, dans la version finale, vous proposerez une organisation modulaire des sources afin damliorer votre code et la qualit de votre travail en terme de lisibilit, maintenabilit, portabilit, extensibilit et rutilisabilit. Il sagira aussi de proposer un programme de dmonstration dont le synopsis est le suivant :
resoudre-sac-a-dos chemin poids-maximal methode

o
chemin :

le chemin du fichier texte contenant lnonc du sac dos rsoudre, chaque ligne contiendra le nom dun objet (une squence dau plus 30 caractres sans espace au sens large), son poids et sa valeur (deux nombres rels) ; poids_maximal : un nombre rel ; methode : gloutonne, enumerative, recursive, pse.

La mthode itrative se base sur une bijection entre les parties dun ensemble de n lments et les entiers naturels infrieurs 2n : il suffit didentifier la prsence du ime objet au ime bit de lcriture binaire. Ainsi le vecteur {true,true,true,false} de lexemple prcdent correspond lentier 11102 cest dire 1410. Ainsi pour numrer (passer en revue) tous les sous ensembles, on peut utiliser un indice de boucle parcourant les entiers compris entre 0 (correspondant lensemble vide) et 2n-1 (lensemble initial). Mais plutt que traduire chaque tour de boucle lentier en ensemble, on peut directement raliser lopration dincrmentation sur le vecteur de boolens. Par exemple, pour passer de 1 4 (soit 0001 0010 0011 0100) :
{false, false, false, true}{false, false, true, false }{false, false, true, true}{false, true, false, false}

Organisation Le projet est travaill et tudi en trinme mais la notation est individuelle. L'enseignant valuera la contribution de chacun des lments du trinme au travail commun. L'enseignant se rservera la possibilit de modifier la composition de chacun des trinmes. Afin de permettre un travail profitable, il est conseill de ne pas crer de groupes avec des niveaux trop diffrents. TD - Chaque semaine, deux jours avant le TD, une brve synthse (1/2 page environ) des travaux effectus depuis la sance prcdente sera transmis (mail ou papier) l'enseignant. On prcisera les points que l'on dsire plus particulirement aborder avec l'enseignant charg de suivre le projet. Ce courrier comprendra aussi le code source. Tous les documents numriques seront regroups dans un unique fichier au format pdf (voire postscript). Chaque document contiendra la date et les noms du trinme.

Soutenance - La prsentation finale du projet se fera en salle de TD. Cette prsentation se fera autour d'une dmonstration et d'un compte rendu crit prsentant : les objectifs atteints et ceux qui ne le sont pas ; l'expos d'un problme technique rencontr et sa rsolution ; quelques exemples montrant que vous avez su viter des redondances dans votre code. Il s'agira aussi de bien prciser l'origine de toute portion de code emprunte (sur internet, par exemple) ou ralise en collaboration avec tout autre trinme. Il est vident que tout manque de sincrit sera lourdement sanctionn. Notation - La note est compose de 3 lments. Ces trois lments sont cumulatifs (pour obtenir la note finale, on ajoute les diffrents lments) Contrle continu (40/200) : une note sur 8 est attribue l'issue de chaque sance de TP. Cette note sera tablie partir des critres suivants: respect des consignes ; valuation de la synthse et du code fourni ; travail accompli depuis la sance prcdente ; volution du projet. Soutenance (80/200) : une note sur 80 est attribue l'issue de la soutenance. Cette note sera tablie partir des critres suivants: o valuation de la prsentation orale et la dmonstration de l'excution (10 pts) o Rponses aux questions poses sur le projet (10 pts) o valuation du rapport sur le projet (20 pts) o Qualit du code fourni (40 pts) (non duplication de code, concision et lisibilit du code, modularit et qualit du dcoupage, gnricit, rponse aux spcifications, extensions ventuelles, prsence d'un fichier makefile) Devoir surveill (80/200)

Prsence - Les prsences aux TD, la soutenance et au devoir surveill sont obligatoires. Toute absence injustifie donnera la note 0 pour lpreuve concerne. En cas de circonstances exceptionnelles, contacter son enseignant de TD par mail au plus tard le jour de la sance de TD concerne ou le jour du devoir surveill. Groupe CSB4A1 CSB4A2 CSB4A3 CSB4A4 MHT63 Enseignant S. Gueorguieva M.C. Counilh B. Mery P.A. Wacrenier F. Broquedis Adresse lectronique stefka@labri.fr counilh@labri.fr mery@labri.fr wacrenier@labri.fr broquedis@labri.fr TD mercredi 14h mardi 14h mardi 14h vendredi 9h30 vendredi 14h

Universit Bordeaux 1 Licence INF 255 Examen seconde session juin 2008

Dure : 1h30 Sans document

Projet de programmation 2 On utilisera le langage C pour rpondre aux questions. Implmentation des exceptions en C 1. Rappeler le prototype et le rle des deux fonctions sur lesquelles se base le mcanisme dexception en C vu en cours. 2. Quelle structure de donnes est ncessaire toute implmentation du mcanisme dexception? Le problme du sac dos. Les questions 3 4 - 5 sont indpendantes. On dispose dun sac capable de supporter un poids (en gramme) maximal et dun ensemble dobjets ayant chacun un poids et une valeur (en euro). Lobjectif est de remplir le sac dobjets sans dpasser le poids maximal tout en maximisant la somme des valeurs des objets quil contient. Exemple : on dispose dun sac supportant 3 kg et des objets suivants : Bague 12g 3400 Tournevis 270g 7 Ordinateur 2500g 1234 Baguette 250g 0,95 Ne pouvant emporter tous les objets, on slectionnera les objets Bague , Tournevis et Ordinateur pour un montant de 4641 et un poids de 2782g. 1. Dfinir un type objet afin de mmoriser le nom, le poids et la valeur dun objet. 2. Dfinir un type sac_a_dos capable de mmoriser lensemble initial dobjets (un vecteur dobjets), le poids maximal du sac dos et de dcrire la slection retenue (sous ensemble des objets, poids et montant du sac). NB. Pour mmoriser lensemble des objets retenus on pourra associer un vecteur de boolens au vecteur dobjets. Ainsi, la solution de lexemple prcdent peut tre reprsente par le vecteur {true,true,true,false} en rfrence au tableau dobjets ci-dessus. Il sagit de rsoudre le problme du sac dos en testant systmatiquement tous les sous ensembles de lensemble de dpart. Dans ce devoir nous allons programmer deux techniques : une itrative, lautre rcursive. La mthode itrative se base sur une bijection entre les parties dun ensemble de n lments et les entiers naturels infrieurs 2n : il suffit didentifier la prsence du ime objet au ime bit de lcriture binaire. Ainsi le vecteur {true,true,true,false} de lexemple prcdent correspond lentier 11102 cest dire 1410. Ainsi pour numrer (passer en revue) tous les sous ensembles, on peut utiliser un indice de boucle parcourant les entiers compris entre 0 (correspondant lensemble vide) et 2n-1 (lensemble initial). Mais plutt que traduire chaque tour de boucle lentier en ensemble, on peut directement raliser lopration dincrmentation sur le vecteur de boolens. Par exemple, pour passer de 1 4 (soit 0001 0010 0011 0100) : {false, false, false, true}{false, false, true, false }{false, false, true, true}{false, true, false, false} 3. crire la fonction bool incrementer(bool *bit, int nombre_de_bits) qui transforme le tableau bit en utilisant lalgorithme dincrmentation binaire et retourne true si et seulement si la configuration obtenue contient au moins une fois la valeur true. 4. En utilisant la fonction incrmenter, crire la fonction rsoudre_sac_a_dos() qui prend en paramtre un sac dos et qui calcule une (la) meilleure solution possible. La mthode rcursive utilise un schma de rsolution rcursif analogue celui employ en cours pour rsoudre le problme des n-reines. Ici, il sagit dexplorer (sans le construire) un arbre

binaire complet o chaque niveau on choisit de slectionner ou non un objet (ici suivant lordre bague tournevis ordinateur baguette) :
{bague,tournevis, ordinateur} {bague, tournevis} {bague} {bague} ... {} {tournevis} ... {} {ordinateur} {ordinateur} {} {baguette} {}
{}

{bague,tournevis,ordinateur,baguette} {bague,tournevis,ordinateur} {bague,tournevis}

{bague,tournevis} {bague,tournevis,baguette} ...

...

{ordinateur,baguette}

5. crire la fonction resoudre_sac_a_dos() en utilisant une stratgie rcursive. On pourra saider en dfinissant des fonctions auxiliaires. On souhaite acclrer la vitesse de traitement en supprimant le plus possible les calculs inutiles. Par exemple, pour le voyageur de commerce on peut arrter une exploration ds lors que la longueur de la tourne en cours dexploration est plus longue que la plus petite tourne calcule jusqu lors. 6. Proposer une optimisation base sur la valeur des objets restant prendre. Montrer comment cette optimisation peut sintgrer la version rcursive. Peut-on optimiser de la sorte la version itrative ?