Problème de remplissage des boites (Bin Packing Problem)

publicité
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
Téléchargement