Ministère de l'Enseignement Supérieur et de la Recherche Scientique Ecole Nationale Supérieure de Technologie Master en GLT, ODD2, TP2, 2ème semaine Problème de remplissage des boites (Bin Packing Problem) BP P Formulation du problème On considère un ensemble de n boites identiques et un ensemble n d'objets dont on connaît le poids pi . Sachant que les boites ne peuvent supporter qu'un poids maximum C , combien faudra-t-il au minimum le nombre de boites Nb pour y ranger l'ensemble des objets considérés ? Ce problème d'optimisation, connu sous le nom de bin packing problem . Le problème consiste à aecter les objets aux diérentes boites de manière à utiliser un nombre minimum de boites. Exemple Soit à ranger les objets suivants dans des boites identiques de capacité max égale à 12 en minimisant Nb le nombre de boite à utiliser : Oi pi O1 3 O2 2 O3 2 O4 O5 2 4 O6 9 O7 4 O8 4 O9 4 Heuristiques Il n'existe pas d'algorithme permettant de trouver la solution optimale de BP P en un temps raisonnable dans le cas général. Toutefois, il existe des méthodes permettant de trouver rapidement une solution qu'on espère bonne à ce problème. Ces méthodes sont appelées des heuristiques. On peut distinguer deux types d'heuristiques : Algorithme de construction Il permet de construire une solution initiale à partir des données du problème. Recherche locale C'est un algorithme qui permet de trouver, à partir d'une solution existante, une solution au moins aussi bonne. Pour cela, l'algorithme améliore tant que possible la solution courante. La solution obtenue à la n de ce processus est un optimum local i.e. la solution est un optimum dans son voisinage de solutions réalisable. La stratégie d'approximation la plus utilisée pour résoudre les problèmes de remplissage de boites est meilleur remplissage par ordre décroissant (Best Fit Decreasing) BF D où un tri décroissant des objets T selon leurs poids est établi. A chaque étape de l'algorithme, on sélectionne les objets un à un dans l'ordre du tri et en ajoutant l'objet sélectionné dans la boite la plus lourde telle que la contrainte de poids maximal reste respectée. Nous présentons maintenant une heuristique de construction pour BP P basée sur une le meilleur remplissage par ordre décroissant T . 1 Algorithme BFD_BP P Var n, C , Nb : entiers Var p, T : tableaux de n entiers Var x : tableau de n × n entiers 1: 2: 3: 4: 5: 6: 7: 8: 9: Début lire(n, p, "Instance.txt") trier(n, p, T ) aecter(n, p, T , C , x) ecrire(n, C , x, "Solution.txt") Fin Dans l'algorithme BFD_BP P à la ligne 5, les paramètres du problème sont lues à partir du chier "Instance.txt" selon le format suivant : n C p1 p2 p3 ... pn Ensuite, le tri des objets T est construit selon l'ordre décroissant des poids pi (voir ligne 6). A la ligne 7, les objets sont aectés aux boites selon le tri T et le résultat est récupéré dans les variables Nb et x. A la ligne 8, le résultat est écrit dans le chier "Solution.txt" selon le format suivant : Nb Objets affectés à la 1ere boite séparées par des espaces Objets affectés à la 2eme boite séparées par des espaces ... Objets affectés à la Nb-eme boite séparées par des espaces Nous détaillons la procédure aecter() : A la ligne 1, la mention "en Entrée" signie que les variables n et C sont données à la procédure mais que toute modication apportée à ces variables à l'intérieur de la procédure ne change pas leurs valeurs à l'extérieure de celle-ci. Par contre la mention "en Entrée/Sortie" signie que si la valeur Nb est modiée à l'intérieure de la procédure alors elle est modiée également à l'extérieure de celle-ci. Dans la déclaration des variables, le tableau cap correspond aux capacités de chaque boite actuellement. Initialement, le vecteur est initialisé à la valeur C pour chacune de ses composantes. La procédure opère comme suit. On considère les objets un à un dans l'ordre T (boucle 7-18). On aecte l'objet courant Ti à la première boite libre j qui peut le contenir (instruction 11) et on recalcule la capacité actuelle de la boite en lui retranchant le poids de l'objet aecté (instruction 12). Le nombre de boite utilisé Nb est calculé en comptant les boites qui ont subis un changement sur leurs capacités initiales capj pour chaque boite j (boucle 20-24). Exercice Appliquer l'algorithme BFD_BP P sur l'exemple de l'introduction puis sur le cas suivant : 6 objets, 6 boites, p1 = 4 , p3 = 4 et pi = 3 pour tous les autres objets. 2 procedure affectcer(n, C : entiers en Entrée, p, T : tableaux de n entiers en Eentrée, Nb : entier en Entrée/Sortie, x : tableau de n × n entiers en Entrée/Sortie) 2: Var cap : tableau de n entiers ; 3: Var i, j : entiers ; 1: 4: 5: 6: 7: 8: 9: 10: 11: 12: Début capj ← C pour tout j i←1 tant que i ≤ n faire j←1 tant que j ≤ n faire si pTi <= capj alors xTi ,j ← 1 capj ← capj − pTi . Recalculer la capacité de la j -ème boite après l'aectation de l'objet i 13: Aller à (17) . Sortir de la deuxième boucle après l'aectation de l'objet i car il ne peut être contenu que dans une seule boite 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: n si j ←j+1 n tant que i←i+1 n tant que Nb ← 0, j ← 0 tant que j ≤ n faire si capj 6= C alors Nb ← Nb + 1 n si n tant que n procedure 3