Il problema dello spostamento delle scorte

Il problema dello spostamento delle scorte












Home » Risorse » Qui di Joannès Vermorel, Novembre 2016

Con l'espressione "spostamento delle scorte" si fa riferimento a un problema della catena logistica, per cui le scorte iniziali devono essere suddivise tra più posizioni. La suddivisione delle scorte deve rispettare la quantità di scorte inizialmente disponibili in ogni posizione e, allo stesso tempo, tenere conto dei costi di trasporto che la suddivisione stessa comporta. Il risolutore dispatch è un solutore numerico che funziona, essenzialmente, in modo simile al risolutore MOQ, ma che ha lo scopo di risolvere il problema dello spostamento delle scorte.

Spostamento delle scorte: uno sguardo d'insieme

Il concetto di spostamento delle scorte fa riferimento a un problema della catena logistica, in cui le scorte di prodotti devono essere riequilibrate tra varie posizioni. Ogni coppia prodotto + posizione è definito SKU (Stock-Keeping Unit).

Esiste una serie di incentivi economici che possono aiutare a decidere se tenere o meno una determinata quantità di scorte per ogni SKU; tali incentivi vengono indicati come rendimenti economici. Aggiungere altre scorte a una posizione può generare un rendimento positivo, se il prodotto è soggetto a domanda in quella particolare posizione; ma può anche generare un rendimento negativo, se invece gonfia i costi di magazzino senza migliorare il servizio in maniera significativa.

È inoltre necessario considerare i costi di trasporto. Questi costi rappresentano di solito l'investimento necessario a trasportare le scorte da una posizione all'altra: essi possono avere una componente lineare (se i costi di trasporto aumentano in modo lineare con le quantità di merci trasportate), oppure non lineare (se i costi sono fissi per qualsiasi operazione di trasporto).

Infine, a causa dei vincoli legati ai trasporti, non tutte le coppie di posizioni si possono considerare adatte a essere spostate. Quando le scorte possono essere suddivise tra una coppia di SKU compatibili, ossia due SKU con lo stesso prodotto, parliamo di vantaggio di trasporto.

Lo scopo principale è quello di massimizzare i ritorni economici associati al trasporto e, quindi, alle nuove posizioni delle scorte, minimizzando allo stesso tempo i costi di trasporto.

Definizione formale del problema

Siano $i$ e $j$ le posizioni, siano $k$ i prodotti. Sia $T_{ijk}$ la quantità intera non negativa trasportata da $i$ a $j$ per il prodotto $k$. Sia $U_{ijk}$ il costo unitario di trasporto. Sia $G$ una partizione delle triplette $(i,j,k)$ e $V_g$ con $g \in G$ il costo di trasporto soglia associato al sottogruppo $g$. Sia $R_{ik}: \mathbb{Z}\to\mathbb{R}$ la funzione di rendimento associata alle variazioni delle scorte alla posizione $i$ per il prodotto $k$. Sia $Q_{ik}$ la quantità massima di scorte che può essere trasportata dalla posizione $i$ per il prodotto $k$. Sia $H$ la funzione gradino di Heaviside.

Stiamo cercando la soluzione di trasporto $T_{ijk}$ che massimizza: $$\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) $$ pur rispettando i seguenti vincoli: $$ \forall i, \forall j, \forall k, T_{ijk} \geq 0 \\ \forall i, \forall k, \sum_j T_{ijk} \leq Q_{ik} $$ Qui, il rendimento $R$ rappresenta generalmente la parte positiva dell'equazione, mentre i costi $U$ e $V$ rappresentano la parte negativa.

In generale, trovare il livello ottimale per il trasporto rappresenta un problema numerico complesso; ciò nonostante, un risolutore apposito può aiutarci a trovare delle soluzioni approssimative.

Sintassi Envision per il risolutore dispatch

Lokad offre un componente apposito per la risoluzione numerica del problema dello spostamento, il risolutore dispatch. In questa sezione, vedremo qual è la sintassi Envision associata al risolutore. La funzione solve.dispatch() sfrutta i seguenti argomenti:
T.Q = solve.dispatch(
  // 'Prd' sta per prodotto, 'Loc' per posizione
  sku: S.Prd, S.Loc
  reward: S.Reward
  stockAvailable: S.Available
  stockEligible: S.Eligible // facoltativo
  // 'Src' sta per sorgente, 'Dest' per destinazione
  edge: T.Prd, T.Src, T.Dest
  unitCost: T.UnitCost // facoltativo
  groupId: T.Group // facoltativo
  groupCost: T.GroupCost) // facoltativo
La tabella S deve intendersi come una rappresentazione di tutte le SKU, ossia di tutte le coppie prodotto + posizione. La tabella T è il grafico dei trasporti, che rappresenta tutti i vantaggi nei casi in cui potrebbe avvenire un trasporto. Le quantità restituite (T.Q) rappresentano le quantità reali di trasporto ottimizzate.

Gli argomenti sono i seguenti:

  • sku (testo, testo): prodotto e posizione della SKU, associata implicitamente all'argomento edge, che elenca tutti i possibili trasferimenti;
  • reward (rendimento - distribuzione): distribuzione del rendimento associato alla posizione finale dell'articolo in una determinata posizione;
  • stockAvailable (scorte disponibili - numero): rappresenta il punto di partenza per calcolare il rendimento per ogni SKU, prima che sia messo in atto qualsiasi trasferimento;
  • stockEligible (scorte trasferibili - numero): rappresenta la quantità massima di scorte che è possibile togliere dalla SKU. Se omesso, tutte le scorte disponibili sono considerate come trasferibili. Nella pratica, le scorte in transito sono considerate come parte delle scorte disponibili, ma non possono essere prese in considerazione per un (ri)trasferimento immediato;
  • edge (vantaggio - testo, testo, testo): rappresenta la lista di tutti i vantaggi di trasporto possibili. Se un vantaggio non è presente nella tabella, allora nessuna quantità può essere trasportata secondo la combinazione indicata dal vantaggio;
  • unitCost (costo unitario - numero): costo di trasporto lineare unitario per il trasporto di quantità secondo la combinazione indicata. Se omesso, è considerato pari a zero;
  • groupId (identificativo gruppo - testo) e groupCost (costo di gruppo - numero): costo di trasporto non lineare, applicabile quando uno qualsiasi dei vantaggi che appartengono al gruppo è diverso da zero. Se omesso, il costo di trasporto è considerato pari a zero.

Il risolutore dispatch sfrutta l'algebra delle distribuzioni, che Envision utilizza per rappresentare i rendimenti economici. Queste distribuzioni sono di solito generate in anticipo sfruttando la funzione di rendimento delle scorte.

Sulla base dei risultati calcolati dal risolutore dispatch, calcolare le variazioni delle scorte per ogni SKU diventa molto più semplice con la sintassi:
S.In = sum(T.Q) by [T.Prd, S.Dest] at [S.Prd, S.Loc]
S.Out = sum(T.Q) by [T.Prd, S.Src] at [S.Prd, S.Loc]
S.Variation = S.In - S.Out

Riferimenti

Il problema dello spostamento delle scorte può essere considerato come un ibrido tra il problema del trasporto (Wikipedia) e il classico problema della distribuzione economica (Wikipedia): il problema del trasporto si concentra sui costi di trasporto generati dallo spostamento di merci da una posizione all'altra; il problema della distribuzione economica cerca invece i rendimenti associati alle quantità ricevute da posizioni diverse. Il problema dello spostamento delle scorte può essere considerato, poi, come un caso particolare del problema dell'allocazione delle risorse.