# Problème de bin packing

En recherche opérationnelle et en optimisation combinatoire, le bin packing est un problème algorithmique. Il s'agit de ranger des objets dans un nombre minimum de boîtes. Le problème classique se définit en une dimension, mais il existe de nombreuses variantes en deux ou trois dimensions.

## Applications pratiques

Le problème de bin packing peut s'appliquer à un grand nombre de secteurs industriels ou informatiques.
Pour la version classique en une dimension :
* rangement de fichiers sur un support informatique ;
* découpe de câbles ;
* remplissage de camions ou de containers avec comme seule contrainte le poids ou le volume des articles.
Pour la version en deux dimensions :
* découpe de matière première ;
* placement de boîtes sur une palette (sans superposition de boîtes) ;
* placement dans un entrepôt (sans superposition de boîtes).
Pour la version en trois dimensions :
* rangement d'objets physiques dans des boîtes, un entrepôt, des camions, etc. (avec superposition de boîtes, de palettes, etc.).

## Formulation du problème

Dans sa forme générale le Bin-Packing est un problème d'optimisation, on a une population d'objets à ranger avec des contraintes dans le moins de boîtes identiques possibles (appelées bins).

### En une dimension
#### Formulation mathématique

Lorsqu'il n'y a qu'une dimension, il n'y a pas de problème de placement au départ, voici la formulation du problème.
Soit $a_{1},\dots ,a_{n}$, des réels positifs tous non nuls, trouver $k\in \mathbb {N^{*}}$et une fonction d'assignation $f:\{1,\dots ,n\}\mapsto \{1,\dots ,k\}$ tels que :
$\forall j\in \{1,\dots ,k\},\,\sum \limits _{i\in f^{-1}(\{j\})}a_{i}\leq 1$ (la somme des tailles des objets de chaque bin n'excède pas sa capacité), de façon que $k$ soit minimal.
Ici on a opéré une normalisation de la capacité de chaque boîte pour avoir moins de variables entrant en jeu.
On peut noter qu'une solution n'est pas unique, sauf si $k=1$ : en introduisant la relation d'équivalence entre deux solutions non nécessairement optimales :
$(k_{1},f_{1})\sim (k_{2},f_{2})\Leftrightarrow k_{1}=k_{2}=k\ et\ \exists \sigma \in {\mathfrak {S}}_{k}\vert f_{1}=\sigma \circ f_{2}$, qui veut dire que deux solutions sont égales à permutation des indices des bins près, on montre qu'il y a une multitude de solutions possibles, ainsi pour les rechercher, il sera utile de quotienter l'ensemble des solutions admissibles mais pas optimales par cette relation d'équivalence, afin de n'avoir qu'un représentant de chaque classe à gérer.
On remarque également que si la taille de tous les objets est $\leqslant 1$, il y a une solution non optimale triviale : $(n,f:i\in \{1,\dots ,n\}\mapsto i)$, donc une solution minimale existe.

#### Formulation itérative

Il existe une version plus itérative et propre à la programmation :
* un nombre infini de boîtes de taille $C$ ;
* une liste $1,2,\ldots ,n$ d'articles $i$ de taille $c_{i}$.
On cherche à trouver le rangement valide pour tous ces articles qui minimise le nombre de boîtes utilisées. Pour qu'un rangement soit valide, la somme des tailles des articles affectés à une boîte doit être inférieure ou égale à $C$.
Pour décrire une solution, on peut utiliser un codage binaire pour indiquer dans quelle boîte $j$ chaque objet $i$ est rangé.
* La variable $x_{ij}$ vaudra $1$ si l'article $i$ est rangé dans la boîte $j$, et $0$ sinon.
* La variable binaire $y_{j}$ est égale à $1$ si la boîte $j$ est utilisée, $0$ sinon.
On cherche donc à minimiser le nombre de boîtes utilisées
    $min\sum _{j=1}^{\infty }y_{j}$
Sous les contraintes suivantes :
    $\sum _{i=1}^{\infty }c_{i}x_{ij}\leq Cy_{j},j=1,\ldots ,n$
    $\sum _{j=1}^{\infty }x_{ij}=1,i=1,\ldots ,n$
    $x_{ij}\in \{0,1\},i=1,\ldots ,n,j=1,\ldots ,n$
    $y_{j}\in \{0,1\},j=1,\ldots ,n$
La première inégalité signifie qu'on ne peut dépasser la taille d'une boîte pour un rangement. À noter que la partie droite de l'inégalité oblige $y_{j}$ à prendre la valeur $1$ dès qu'un article est rangé dans la boîte $j$. La deuxième inégalité impose à tous les objets d'être rangés dans une boîte et une seule. Toute solution pour laquelle la famille d'équations précédente est vérifiée est dite réalisable.
La modélisation décrite plus haut a été proposée par Leonid Kantorovich en 1960. Il existe d'autres formulations linéaires pour ce problème, sous forme d'un problème de flot maximum dans un graphe, ou utilisant une décomposition de Dantzig-Wolfe (en).

## NP-complétude

Ce problème fait partie de la classe des problèmes NP-difficiles. Sauf si P = NP, on ne peut pas le résoudre à l'aide d'un algorithme de complexité polynomiale. La preuve de ce résultat se fait par réduction à partir du problème de bipartition.

## Méthodes de résolution

Le problème de bin packing a été largement étudié dans la communauté de recherche opérationnelle. Il existe des heuristiques très efficaces pour le résoudre, et une modélisation très efficace utilisant l'optimisation linéaire.

### Méthode heuristiques

Pour résoudre le problème de bin packing, on utilise souvent des algorithmes simples comme first-fit decreasing (FFD) ou best-fit decreasing (BFD). Les deux méthodes fonctionnent suivant un principe similaire : on trie la liste d'articles par ordre décroissant de taille, puis on range chaque article dans l'ordre. Dans first-fit, on range l'article courant dans la première boîte qui peut le contenir. Dans best-fit, on range l'article dans la boîte la mieux remplie qui puisse le contenir. Ces algorithmes ne sont pas optimaux, mais ils permettent d'obtenir de très bons résultats en pratique.
Les algorithmes Best Fit Decreasing et First Fit Decreasing n'utilisent jamais plus de 11/9 OPT + 1 boîtes (où OPT est le nombre optimal de boîtes dans une solution optimale). La procédure de tri est la partie la plus coûteuse de l'algorithme, mais sans elle, la qualité de la méthode est beaucoup moins bonne. On obtient dans ce cas des solutions utilisant au pire 17/10 OPT.
Une version plus efficace de FFD utilise au plus 71/60 OPT + 1 boîtes.

### Méthodes exactes

On utilise aujourd'hui essentiellement l'optimisation linéaire en nombres entiers pour résoudre ce problème. Lorsque l'instance traitée est de faible taille, la formulation de Kantorovich peut être utilisée. Lorsque le nombre d'articles est grand, on utilise plutôt une résolution par génération de colonnes utilisant le modèle de Gilmore et Gomory, ou des modèles reposant sur la résolution d'un problème de flot maximal. La grande qualité des méthodes obtenues est due à l'excellente relaxation linéaire du modèle. La qualité de cette relaxation fait d'ailleurs l'objet d'une conjecture, appelée MIRUP : si $L$ est la valeur de la solution de ce modèle en nombres réels et $OPT$ la valeur de la solution en nombres entiers, alors on aurait $\lceil L\rceil +1\geq OPT$.

## Extensions, généralisations

Le problème de bin packing a de fortes connexions avec le problème du sac à dos (knapsack). Ces deux problèmes sont les représentants les plus connus de ce qu'on appelle dans la communauté de recherche opérationnelle les problèmes de découpe et de conditionnement (cutting and packing).
Il existe de nombreuses extensions pour le problème de bin packing basique. On peut considérer ces articles possédant deux ou trois dimensions, interdire à certains articles d'être rangés dans la même boîte, ou autoriser l'usage de boîtes de tailles différentes. Les objets peuvent prendre des formes différentes : rectangles (pavés), cercles (sphères). Lorsque les formes ne sont pas convexes, on parlera plutôt de problème de nesting.
La version du problème où l'on ne connaît pas la liste d'objets par avance a été longuement étudiée. On parle de version on-line du problème.
Lorsque des articles de même taille apparaissent de nombreuses fois dans le problème, on parlera plutôt de problème de cutting-stock.