Le problème d’acheminement du stock

Le problème d’acheminement du stock










Accueil » Ressources » Ici « Par Joannès Vermorel, novembre 2016 »

L’« acheminement du stock » désigne un problème logistique dans lequel des quantités de stock initiales doivent être réparties de façon équilibrée entre plusieurs lieux. Le partage doit respecter le stock disponible à l'origine dans chaque lieu et l’acheminement lui-même implique généralement des coûts de transport. Le « solutionneur d’acheminement » est un solutionneur numérique, similaire au solutionneur de quantités minimales de commande, mais conçu pour le problème d’acheminement.

Présentation du problème d’acheminement

L’acheminement du stock désigne un problème quantitatif logistique dans lequel des « stocks » de « produits » doivent être répartis entre plusieurs « lieux ». Chaque paire « produit - lieu » correspond à une unité de gestion des stocks (SKU).

Les quantités stockées pour chaque SKU sont gouvernées par des motivations économiques modélisées sous la forme de « conséquences économiques ». L’augmentation du stock dans un lieu donné a potentiellement des conséquences positives si le produit est demandé à cet endroit, mais le stock supplémentaire peut également avoir des conséquences négatives s’il augmente uniquement les coûts de stockage sans améliorer sensiblement le service.

En plus de ces conséquences, les « coûts de transport » sont aussi pris en compte. Ceux-ci représentent généralement l’investissement nécessaire au déplacement du stock d’un lieu à l’autre. Ces coûts peuvent avoir des composants linéaires — des coûts de transport qui augmentent de façon linéaire avec les quantités transportées — et non linéaires — des coûts fixes liés à toute opération de transport.

Enfin, à cause des contraintes de transport, certaines paires « produit - lieu » sont potentiellement inéligibles au transport. Lorsque du stock peut être réparti entre deux SKU compatibles, c’est-à-dire deux SKU liés au même produit, ces derniers forment une « arête de transport ».

L’objectif principal est de maximiser les conséquences économiques positives du stock supplémentaire obtenu en déplaçant des produits, tout en réduisant les coûts de transport associés.

Définition formelle du problème d’acheminement

Soient $i$ et $j$ des lieux et $k$ des produits. Soit $T_{ijk}$ la quantité intégrale non négative transportée de $i$ à $j$ pour le produit $k$. Soit $U_{ijk}$ le coût de transport par unité. Soit $G$ une sous partie des triplets $(i,j,k)$ et $V_g$ avec $g \in G$ le coût de transport seuil associé au sous-ensemble $g$. Soit $R_{ik}: \mathbb{Z}\to\mathbb{R}$ la fonction de conséquence associée aux variations de stock dans $i$ pour le produit $k$. Soit $Q_{ik}$ la quantité de stock maximale qui peut être ponctionnée sur le lieu $i$ pour le produit $k$. Soit $H$ la fonction de Heaviside.

Nous cherchons une solution de transport $T_{ijk}$ qui maximise : $$\sum_{i,k} R_{ik}\left(\sum_j (T_{ijk} - T_{jik}) \right) + \sum_{i,j,k} T_{ijk} U_{ijk} + \sum_{g \in G} V_g\ H\left(\sum_{(i,j,k) \in g} T_{ijk}\right) $$ tout en respectant les contraintes suivantes : $$ \forall i, \forall j, \forall k, T_{ijk} \geq 0 \\ \forall i, \forall k, \sum_j T_{ijk} \leq Q_{ik} $$ La conséquence $R$ représente généralement la partie « positive » de l’équation alors que les coûts $U$ et $V$ représentent la partie « négative ».

La plupart du temps, l’identification du transport optimal passe par la résolution rigoureuse d’un problème numérique, mais des solutions approximatives peuvent être trouvées via un solutionneur dédié.

Syntaxe Envision pour le solutionneur d’acheminement

Lokad fournit un composant dédié à la résolution numérique du problème d’acheminement appelé « solutionneur d’acheminement ». Dans cette section, nous présentons la syntaxe Envision associée à ce solutionneur. La fonction solve.dispatch() utilise des arguments nommés :
T.Q = solve.dispatch(
  sku: S.Product, S.Location
  reward: S.Reward
  stockAvailable: S.Available
  stockEligible: S.Eligible // facultatif
  edge: T.Product, T.Source, T.Destination
  unitCost: T.UnitCost // facultatif
  groupId: T.Group // facultatif
  groupCost: T.GroupCost) // facultatif
La table S liste tous les SKU, c’est-à-dire les paires « produit-lieu ». La table T représente le graphique de transport, toutes les arêtes sur lesquelles des produits peuvent être transportés. Les quantités renvoyées T.Q sont les quantités à transporter optimisées.

Les arguments sont les suivants :

  • sku (text, text) : produit et lieu du SKU, implicitement lié à l’argument edge qui liste les transferts possibles.
  • reward (distribution) : distribution des conséquences associée au niveau de stock final du produit dans le lieu donné.
  • stockAvailable (number) : point de départ du calcul des conséquences pour chaque SKU avant que tout transfert de stock n’ait eu lieu.
  • stockEligible (number) : stock maximal pouvant être prélevé du SKU. Si cet argument n’est pas fourni, l’ensemble du stock disponible stockAvailable est considéré comme éligible. En pratique, le stock « en transit » est compté dans le stock disponible (stockAvailable), mais il n’est cependant pas disponible immédiatement pour un nouveau transfert.
  • edge (text, text, text) : liste des arêtes de transfert acceptables. Si une arête n’est pas dans cette liste, aucune quantité ne peut être transportée sur celle-ci.
  • unitCost (number) : coût de transport linéaire « par unité » associé à l’arête. Si cet argument n’est pas fourni, ce coût est considéré comme nul.
  • groupId (text) et groupCost (number) : coût de transport non linéaire activé si une arête du groupe est non nulle. Sinon, le coût de transport reste nul. Si cet argument n’est pas fourni, ce coût est considéré comme nul.

Le solutionneur d’acheminement exploite l’algèbre des distributions disponible dans Envision afin de représenter les conséquences économiques. Ces distributions sont la plupart du temps générées en amont grâce à la fonction de récompense associée au stock.

Les variations de stocks correspondantes sont faciles à obtenir pour chaque SKU à partir des résultats calculés par le solutionneur d’acheminement :
S.Added = sum(T.Q) by [T.Product, S.Destination] at [S.Product, S.Location]
S.Taken = sum(T.Q) by [T.Product, S.Source] at [S.Product, S.Location]
S.Variation = S.Added - S.Taken

Références

Le problème logistique d’acheminement du stock présenté ici peut être considéré comme un hybride entre les classiques théorie du transport et problème de répartition économique (article en anglais). La théorie du transport porte principalement sur les coûts de transport entre les différents lieux de stockage. Le problème de répartition économique quant à lui met en évidence les conséquences des quantités reçues dans chaque lieu de stockage. Enfin, le problème d’acheminement peut être vu comme un cas particulier du problème d’allocation des ressources.