1. TRAVAIL D’ETUDE ET DE RECHERCHE
Présenté par :
Sarah BOUNEJMATE & Pala-Beh YEBLI
Résolution du sac à dos
bidimensionnel avec contrainte de
précédence
Soutenu le : 12 Mai 2016
Sous l’encadrement de Mr : Jeremy Guillot
Année universitaire : 2015/2016
4. Table des figures
1 Illustration du problème du sac à dos . . . . . . . . . . . . . . . . . . . . . . 1
2.1 Illustration de la méthode du Branch and Bound . . . . . . . . . . . . . . . . 5
2.2 Pseudo code pour le branch and bound appliqué au biknnapsack . . . . . . 8
2.3 Résolution du PCBKS à l’aide du branch and bound et le parcours en BFS par
exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4 Pseudo code pour le DFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.5 Pseudo code pour le BFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.1 Résultats et temps d’exécution . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2 Graphe représentant les temps d’exécution pour le Branch and Bound en DFS
et en BFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3
5. Remerciement
Nous tenons à remercier en premier lieu nos familles et amis pour leur soutien, leur
encouragement et leur patience durant ces mois de recherche et de dur labeur.
Nous remercions aussi notre encadrant, le Professeur Jeremy GUILLOT, qui nous a ac-
cordé de son temps et son soutien pour la parfaite compréhension de ce problème et la
meilleure élaboration de ce rapport.
Une pensée pour tous les professeurs qui nous ont donnés l’enseignement adéquat qui
nous a permit d’aboutir à ce travail, spécialement le Professeur Boris DETIENNE.
6. Introduction
Supposons que nous prévoyons une randonnée ; et nous sommes donc amenés à remplir
un sac à dos avec des items qui sont considérés comme nécessaires pour le voyage. Il y a
différents types d’éléments ; ceux-ci pourraient inclure une bouteille d’eau, pomme, orange,
sandwich, etc. Chaque type d’élément a un ensemble donné de deux attributs, à savoir une
capacité de poids (ou de volume, ou les deux, ou plusieurs caractéristiques même parfois)
et une valeur qui quantifie le niveau d’importance associé à chaque unité de cet item.Étant
donné que le sac a une capacité limitée, le problème d’intérêt consiste donc en savoir com-
ment charger le sac avec une combinaison d’unités des types spécifiés des éléments de façon
à ce que le niveau d’importante de ces derniers soit maximal.
Ce que nous venons de décrire est appelé un problème de sac à dos (en anglais Knapsack
ou Rucksack problem). Le problème tire son nom des travaux du mathématicien Tobias
Danzig et se réfère aux probleme d’emballer les objets les plus précieux sans surcharger les
bagages.
Fig. 1 – Illustration du problème du sac à dos
Dans ce TER, nous nous intéressons au problème du sac à dos contraint à deux capacités
et dont les éléments ont une certaine priorité.
1
7. Chapitre 1
Le problème du Knapsack
bidimensionnel avec contrainte de
précédence
1.1 Introduction
Le problème du sac à dos n’est pas récent, il s’agit d’un problème d’optimisation combi-
natoire qui a été étudié pendant plus d’un siècle avec les premières œuvres datant d’aussi
loin que 1897.Il est aussi l’un des 21 problèmes NP-complets de Richard Karp, exposés dans
son article de 1972.
La famille des problèmes de sac a dos qui nécessitent tous un ensemble d’éléments don-
nés à choisir de telle sorte que la somme des bénéfices correspondants soit maximisé, sans
dépasser la capacité. Cependant, plusieurs variantes de ce problème existent, et dans ce TER
nous nous intéressons à la variante du sac à dos bidimensionnel avec contrainte de précé-
dence, c.-à-d. que chaque élément est caractérisé par deux attributs (par exemple volume
et poids), et par son ordre de précédence ( un élément n’est mis dans le sac que si tous
ses prédécesseurs le sont aussi). Ce probleme est dit Precedence Constrainted Bi-Knapsack
Problem (PCBKS).
Comme on peut le voir dèjà la formulation du problème en un programme linéaire en
variables mixtes est fort simple, mais sa résolution s’avère être plus complexe. Dans notre
recherche, nous allons plutôt avoir une approche exacte en résolvant le problème de deux
manières différentes en utilisant l’algorithme du Branch and Bound et en comparant par la
suite l’efficacité de chacune.
2
8. 1.2 Formulation en programme linéaire
Le 0/1 Knapsack problem est un problème qui consiste à choisir de mettre dans un sac
un sous ensemble d’un ensemble de n éléments donnés de façon à maximiser le profit sans
encombrer le knapsack.
Ceci peut être exprimé par le problème d’optimisation suivant :
Max Σn
i=1xipi
sc.
Σn
i=1xiwi ≤ W
Σn
i=1xiti ≤ T
xi ≤ xi si (i,j) ∈ AP
xi ∈ 0,1
(1.1)
Où :
Les xi sont des variables binaires indiquant si l’élément doit être inclut dans le sac.
Les pi représentent la valeur ou le profit de chaque élément.
Les wi représentent le poids de chaque objet.
Les ti représentent la consommation du temps de chaque objet.
W représente la capacité maximale du sac.
T représente le temps total.
AP représente l’arbre de précédence.
3
9. Chapitre 2
Résolution exacte du Knapsack
bidimensionnel avec contrainte de
précédence en utilisant la méthode du
Branch and Bound
2.1 Introduction
Connu en français sous le nom d’algorithme de Séparation et évaluation, la technique
du Branch and Bound est un algorithme classique pour résoudre certains problèmes d’op-
timisation combinatoire. Il s’agit de rechercher une solution optimale dans un ensemble
combinatoire de solutions possibles.
Le premier algorithme de séparation et évaluation a été introduit par Kolesar pour ré-
soudre le KP mais nécessitait un large temps de résolution.
La méthode repose d’abord sur la séparation (la partie du branchement) de l’ensemble
des solutions en sous-ensembles plus petits. L’exploration de ces solutions utilise ensuite
une évaluation optimiste pour majorer (borner) les sous-ensembles, ce qui permet de ne plus
considérer que ceux susceptibles d’avoir une solution potentiellement plus avantageuse que
la solution courante.
Du fait que cette méthode donne des résultats exactes, et dans le cadre de ce travail
nous allons appliquer cette méthode pour le problème de sac à dos bidimensionnelle avec
contraintes de précédence.
4
10. 2.2 La méthode du Branch and Bound
2.2.1 Contexte général
Le Branch and Bound se présente comme un parcours d’un arbre de recherche dont
chaque nœud représente une éventuelle solution. Ce parcours est caractérisé par deux par-
ties importantes à savoir : La séparation et L’évaluation.
Fig. 2.1 – Illustration de la méthode du Branch and Bound
2.2.1.1 La séparation
Elle consiste à séparer un ensemble de solutions en sous-ensembles. Ainsi en résolvant
tous les sous-problèmes et en gardant la meilleure solution, nous sommes surs de résoudre
le problème initial.
Pour décrire l’opération de séparation, il suffit de dire comment on divise un ensemble
de solutions en sous-ensembles. Cela revient à décrire comment construire l’arbre permet-
tant d’énumérer toutes les solutions. L’ensemble de nœuds de l’arbre qu’il reste encore à
parcourir comme étant susceptibles de contenir une solution optimale, c’est-à-dire encore à
diviser, est appelé ensemble des nœuds actifs (NA) ou non visités.
5
11. 2.2.1.2 L’évaluation
Elle consiste à évaluer les solutions d’un sous-ensemble c’est à dire de trouver la meilleure
solution pouvant être obtenue parmi les solutions réalisables au niveau d’un noeud.
Du fait que l’arbre représente toutes les solutions, chaque feuille contient une solution
dont on peut calculer la valeur exacte. Pour un nœud interne de l’arbre, k, on va évaluer ce
nœud en calculant un majorant de la valeur de toutes les solutions contenues dans le sous-
ensemble représenté par le sous arbre de racine k.
Si l’arbre entier était connu, on pourrait évaluer un nœud par la meilleure solution por-
tée par ses feuilles. Mais ce n’est bien sûr pas le cas ! Il faut donc essayer d’estimer par
majoration la meilleure solution qu’il est possible d’atteindre à partir du nœud. Comme un
nœud interne représente une solution partielle (dont une partie des variables du problème
est partiellement fixée), on calcule sa valeur en cherchant la meilleure valeur qu’on peut
obtenir grâce aux degrés de liberté restants.
Cette fonction d’évaluation, spécifique à chaque problème, est dite « optimiste ou exacte
», car elle calcule « un majorant » du meilleur résultat possible à partir d’une solution par-
tielle. Une bonne fonction doit majorer au plus près la solution maximale, tout en restant
la moins coûteuse possible d’un point de vue algorithmique. C’est un des aspects cruciaux
quant aux performances de la résolution du problème.
En plus de ces deux grandes étapes, s’ajoute l’évolution de l’algorithme suivant les cri-
tères d’arrêt :
2.2.1.3 Elagage
Il s’agit d’une stratégie qui se base sur le fait qu’une fois la borne au niveau d’un nœud
interne est obtenue, l’on peut l’exploiter pour interdire éventuellement de continuer l’explo-
ration de cette partie de l’arbre. En particulier, il est inutile de brancher sur un nœud dans
les cas suivants :
1. L’ évaluation a permis de calculer une solution qui a exactement cette valeur. Cette
solution est nécessairement optimale dans ce sous-ensemble de solutions. Si cette solution
est la meilleure trouvée jusque-là, elle devient la meilleure solution courante. Ce cas est
plutôt rare.
6
12. 2. L’ évaluation au niveau d’un noeud est inférieure ou égale à la valeur de la meilleure
solution entière stockée. En développant ce noeud, on ne peut qu’avoir des solutions moins
avantageuses. Ceci nous apporte beaucoup en temps de calcul, car on élimine une partie et
donc on réduit l’arbre de recherche.
3. Le sous-ensemble est réduit à un seul élément. Dans les cas 1 et 2, on gagne dans
l’exploration de l’arbre puisque la branche suivant le nœud considéré ne sera pas explorée.
On dit que cette branche est élaguée (pruning en anglais). A noter que dans le cas 2, si la
meilleure solution courante a changé, il convient de parcourir tous les nœuds actifs pour
voir si ces noeuds fils seront avantageux.
2.2.1.4 L’approximation
Le succès de la méthode dépend essentiellement de la précision de la fonction d’évalua-
tion. On peut l’accélérer en se contentant d’une solution approchée avec garantie de qualité.
On peut décider d’élaguer tout nœud dont l’évaluation est inférieure à (1+EPSILON) fois la
valeur de la meilleure solution courante. Par exemple si EPSILON = 0, 05, alors quand on
s’arrêtera la valeur de la solution trouvée sera à moins de 5 pour cent de l’optimum.
Suivant les définitions antérieures, on pourra donc définir le Branch and Bound comme
une méthode exacte qui crée et résout une séquence de sous-problèmes au problème initial
et qui évolue de façon restrictive jusqu’à ce qu’une solution entière soit trouvée.
2.3 Branch and Bound appliqué aux PCBKS
Comme dans tous les problèmes d’optimisation, on cherche un élément de valeur opti-
male et non tous. Le problème à résoudre est donc le suivant : trouver dans un ensemble
de solutions potentielles donné, un élément de valeur optimale. Pour fixer les idées nous
supposerons dans ce qui suit que l’on cherche un élément de valeur maximum.
2.3.1 Algorithme
L’algorithme propose de parcourir l’arborescence des solutions possibles en évaluant
chaque sous-ensemble de solutions de façon optimale. Lors de ce parcours, il maintient
la valeur M de la meilleure solution entière trouvée jusqu’à présent. Quand l’évaluation
d’un sous-ensemble donne une valeur plus faible que M, il est inutile d’explorer plus loin ce
sous-ensemble.
7
13. L’algorithme maintient donc la valeur M de la meilleure solution trouvée et la liste NA
des nœuds actifs, susceptibles de contenir de meilleures solutions que M :
Fig. 2.2 – Pseudo code pour le branch and bound appliqué au biknnapsack
Pour le problème étudié, nous avons un ensemble d’objets. A l’étape initiale, on choisit
un nœud racine pour lequel on ne prend aucune décision sur les variables et on résout
sa relaxation puis on le rajoute à la liste des nœuds non traités. Si le résultat ne donne
aucune valeur fractionnaire, alors on s’arrête car celle ci est forcément la solution optimale.
Dans le cas où il a une variable fractionnaire, on branche dessus (souvent sur celle la plus
fractionnaire, c-a-d la plus proche de 0.5), on crée donc deux fils de ce nœud pour lesquels
on prendra une décision sur la variable fractionnaire (0/1) et on recalcule la relaxation pour
ces nouveaux nœuds et on les rajoute à la liste. Tant que la liste n’est pas vide on réitère
cette opération, et une fois qu’on n’aura plus de nœuds à traiter, on retourne la meilleure
valeur de solution entière qu’on a obtenu jusque-là. Ceci est décrit par l’algorithme suivant
qui résume notre approche pour résoudre le problème :
8
14. Fig. 2.3 – Résolution du PCBKS à l’aide du branch and bound et le parcours en BFS par exemple
En fonction de la structure de données utilisée pour la liste des nœuds actifs NA, l’al-
gorithme peut avoir des performances expérimentales très différentes. La façon dont on
parcourt l’arbre des solutions et le choix du prochain nœud actif à diviser sont cruciaux.
Plusieurs stratégies sont à envisager :
9
15. 2.3.1.1 Parcours en profondeur DFS
L’idée de la Recherche en Profindeur d’abord est de rendre cette recherche plus efficace
en gardant la trace de la solution la moins coûteuse trouvée jusqu’à présent.
Comme le coût d’un ajout partiel est la somme des coûts des bords parcouru jusqu’à pré-
sent, chaque fois qu’on en trouve un dont le coût est égal ou supérieur au coût du meilleur
tour complet trouvé à ce jour, la branche représentant cet ajout peut être élagué, puisque
tous ses descendants doivent avoir un coût égal ou inférieur.
Chaque fois qu’on respecte les contraintes appliquées, le meilleur coût est mis à jour à
ce faible coût. En outre, une fonction heuristique admissible comme le coût de l’arbre de re-
couvrement minimal des objets déjà ajoutés au sac, peut être ajouté au coût jusqu’à présent
d’une visite partielle pour augmenter la quantité de nœuds élagués. Enfin, en ordonnant
soigneusement les enfants d’un nœud donné du plus petit au plus grand coût total estimé,
une solution à moindre coût peut être trouvé plus rapidement, améliorant encore plus l’ef-
ficacité de l’élagage.
En somme ce qui concerne cette règle, elle consiste donc à sélectionner le nœud, le plus
récemment créé associé au nœud sur lequel on choisit de brancher. À l’étape de la Sépara-
tion, la variable de base avec le plus grand composant fractionnel est généralement choisie
pour le partitionnement.
10
16. Fig. 2.4 – Pseudo code pour le DFS
2.3.1.2 Parcours en largeur BFS
Le parcours en Largeur d’abord énumère les nœuds suivant l’ordre de création. Il permet
de visiter tous les futurs nœuds crées en gardant la trace de la meilleure solution trouvée
jusqu’à présent, ceci étant il visite tout l’arbre de recherche.
Chaque fois qu’un tour complet à faible coût est trouvé, le coût avantageux suivant les
contraintes est mis à jour à ce faible coût. Toute chose dite, l’on peut retenir de ce parcours,
qu’une telle stratégie consiste traiter les noeuds suivant leur ordre d’ajout dans la liste des
noeuds non traités. L’objectif étant de trouver une bonne solution réalisable en explorant
toutes les possibilités.
11
18. 2.4 Conclusion
Dans ce chapitre, nous avons présenté un tour d’horizon de quelques stratégies de par-
cours d’un arbre de recherche comme dans le cas de notre problème.
L’efficacité de la méthode par séparation et évaluation dépend essentiellement de la stra-
tégie de développement qui peut être en la stratégie de parcours utilisée, soit en largeur ou
en profondeur dans notre cas. De plus, la méthode du branchement employée et la nature
de la fonction d’évaluation utilisée influencent fortement cette méthode.
Les stratégies de parcours de l’arbre de recherche sont nombreuses et diverses. Dans le
cadre de notre travail, l’on sait focaliser sur deux stratégies à savoir une de branchement
qui est nécessaire à l’étape du Branchement (FIFO) et une stratégie de sélection de variables
nécessaire à l’étape de Séparation (LIFO).
Les résultats et observations effectuées suivant la mise en œuvre de chacune de ces
méthodes de recherche sont plutôt exacts dans la résolution d’un programme linéaire en
nombres entiers. Ils feront l’objet du chapitre suivant.
13
19. Chapitre 3
Résultats des implémentations et
comparaison du parcours de l’arbre de
recherche en BFS et en DFS
3.1 Introduction
Dans ce chapitre nous allons présenter les résultats obtenue pour l’implémentation du
branch and bound pour le PCBKS en utilisant une stratégie de parcours de l’arbre des so-
lution BFS et DFS et nous allons ensuite comparer les résultats et essayer d’en tirer des
conclusions.
3.2 Résultats et comparaisons
Ayant implémenté notre algorithme pour la résolution de ce programme linéaire en
nombre entiers pour les instances dans la page à suivre on compare les résultats.
Max Σn
i=1x[i]p[i]
sc.
ΣNbItems
i=1 x[i]Capacity[i] ≤ W
Σn
i=1x[i]CapacityT ime[i] ≤ T
x[j] ≤ x[i] si (i,j) ∈ AP
x[i] ∈ 0,1
(3.1)
14
21. Fig. 3.1 – Résultats et temps d’exécution
On peut constater déjà que les deux méthodes retournent la bonne solution, c’est évident
comme on a résolu le problème en question avec le Branch and Bound qui est une méthode
de résolution exacte.
Essayons de voir maintenant les courbes des temps d’exécution pour chacune des mé-
thodes
16
22. Fig. 3.2 – Graphe représentant les temps d’exécution pour le Branch and Bound en DFS et en BFS
Sans oublier que les temps d’exécution dépendent beaucoup de la nature des instances.On
peut voir qu’il n’y a pas de méthode qui marche mieux que l’autre en terme de temps d’exé-
cution ou qui soit plus avantageuse que l’autre quand la taille de l’instance augmente.
17
23. Conclusion générale et perspectives
Dans ce Travail d’Etude et de Recherche, nous avons étudié le problème du Sac à Dos
Bidimensionnel avec contraintes de précédence.
Dans la première partie de ce rapport, nous nous sommes attelées à expliciter le pro-
blème sous forme d’un programme linéaire en nombre entiers classique. Un peu plus com-
plexe que le problème de sac à dos normal du fait qu’on a deux contraintes de capacité et
une contrainte de précédence. Dans le second chapitre, la méthode de résolution choisie fut
explicitée. D’abord, d’un point de vue global, puis d’un point de vue plus concret adapté à
notre problème. De façon standard, nous avions développé deux stratégies de parcours le
Bfs et le Dfs. Toutefois on distingue bien d’autres stratégies aussi efficaces les unes que les
autres à savoir :
• Stratégie du plus prioritaire : La priorité d’un nœud peut être évaluée par pondération
entre son évaluation et sa profondeur dans l’arbre (sa distance par rapport à une feuille). En
effet, les évaluations loin des feuilles sont souvent plus intéressantes mais moins fiables et
il peut être avantageux de diviser un nœud potentiellement moins bon mais plus profond
dans l’arbre.
• Stratégie mixte : On va en profondeur tant qu’on le peut, mais quand on ne peut plus
on saute au nœud de meilleure évaluation. On explorera les fils dans l’ordre d’évaluation :
le meilleur d’abord.
Le troisième chapitre décrivait les résultats et observations faites après qu’on ait eu à
résoudre le problème suivant les stratégies de parcours mentionnées dans le deuxième cha-
pitre.
18
24. Certes durant notre travail, nous nous sommes focalisées que sur la résolution du pro-
blème par la méthode de Branch and Bound. Toutefois il existe bien d’autres méthodes de
résolution dont quelques-unes à savoir :
• La programmation dynamique (méthode exacte)
• Algorithme du Lagrangien et Algorithme du Surrogate dual (méthodes approchée ou
heuristique).
Ainsi donc parmi les perceptives que nous envisageons très probablement, nous pensions
implémenter ces méthodes sus-citées dont nous n’avions pas eu l’occasion de présenter dans
ce rapport faute de temps afin de comparer les résultats avec ceux des méthodes déjà implé-
mentées.
19