Trasformare una distribuzione in griglia con Envision

Trasformare una distribuzione in griglia












Home » Risorse » Qui

In Envision, le distribuzioni sono uno strumento pratico, poiché sono supportate da un'intera algebra delle distribuzioni. Tuttavia, per poter generare decisioni riguardo il magazzino, è di solito necessario trasformare le distribuzioni in una griglia, ossia in una tabella che elenchi i valori della distribuzione (che generalmente corrispondono a probabilità). Con l'aiuto di questa griglia, è possibile creare una tabella finale che contenga le quantità di riordino consigliate, o i movimenti di magazzino consigliati. Qui di seguito vedremo come utilizzare la funzione extend.distrib() a questo scopo.


Griglie e distribuzioni

Una griglia è una tabella semplice, che contiene una lista di bucket di istogramma: a ogni distribuzione corrisponde un istogramma, a ogni riga corrisponde un bucket all'interno dell'istogramma. In termini generici, una griglia è rappresentata da una tabella con quattro campi:

  • Id, che identifica l'articolo;
  • Min, che identifica il limite inferiore inclusivo del bucket dell'istogramma;
  • Max, che identifica il limite superiore inclusivo del bucket dell'istogramma;
  • Value, che identifica il valore associato al bucket dell'istogramma.

Per ogni articolo, la griglia può contenere una serie di bucket, che rappresentano l'intero istogramma della distribuzione. Se la distribuzione è una variabile casuale, il valore del bucket può essere interpretato come la probabilità della distribuzione sul segmento coperto dal bucket.

Le griglie non sono flessibili come le distribuzioni. Per poter assicurare prestazioni adeguate, spesso non è possibile mantenere bucket di larghezza pari a 1: in questi casi, vengono invece utilizzati bucket più larghi, al fine di lasciare alla griglia requisiti di memoria gestibili attraverso Lokad. I bucket non unitari complicano i calcoli eseguiti sulle griglie. Per impostazione predefinita, poi, le griglie sono a supporto compatto (nel senso matematico del termine): i loro valori diversi da zero, cioè, sono definiti solo per un numero finito di punti.

D'altra parte, le griglie sono tabelle semplici, che possono essere elaborate in altre tabelle attraverso gli operatori Envision consueti. In linea di massima, Envision favorisce un approccio in cui tutti i modelli economici e probabilistici sono elaborati attraverso le distribuzioni, che vengono trasformate in griglie solo alla fine del processo, appena prima di generare le decisioni suggerite in materia di catena logistica.

Sintassi di extend.distrib()

Le distribuzioni Envision sono corredate da un sistema algebrico potente, che può essere utilizzato per evitare farraginosi calcoli di probabilità a partire da elenchi. In alcuni casi, però, avere a disposizione una semplice lista di probabilità può essere utile, se non addirittura preferibile. L'estensione di distribuzione extend.distrib() trasforma un vettore distribuzione in una tabella, come illustra la sintassi qui sotto:
table T = extend.distrib(D)
T.Probability = int(D, T.Min, T.Max)
show table "Distribution details" with 
  Id
  T.Min
  T.Max
  T.Probability
L'argomento D deve essere un vettore di distribuzioni, di quelli prodotti di solito dal motore di previsione probabilistica di Lokad. La tabella T è inserita come estensione delle tabelle originali (nello script sopra, è la tabella Items). La tabella T è popolata con tre campi:

  • T.Min: limite inferiore inclusivo del segmento, in numeri interi;
  • T.Max: limite superiore inclusivo del segmento, in numeri interi;
  • T.Probability: somma della distribuzione nell'intervallo inclusivo.

Nonostante il nome, il campo Probability in realtà fa riferimento alla somma della distribuzione sull'intervallo di bucket che viene restituita. Questo campo non è popolato da extend.distrib(): nel caso il campo fosse richiesto, dovrà essere creato ad hoc, come alla riga 2.

Per distribuzioni relativamente compatte, i segmenti hanno lunghezza pari a 1, da cui T.Min == T.Max. Se, però, la distribuzione raggiunge valori più elevati, i segmenti di lunghezza pari a 1 finirebbero per generare anche milioni di righe, rendendo di fatto ingestibile l'operazione: in questi casi, quindi, Envision aggrega automaticamente le distribuzioni attorno a segmenti più ampi. Di conseguenza, gli algoritmi sono "tarati" per fare in modo che le dimensioni delle tabelle generate siano sempre gestibili.

La funzione extend.distrib() è fatta per isolare sempre il segmento zero: il segmento [0;0] avrà quindi una riga dedicata all'interno della tabella. Questa caratteristica è utile in molte situazioni di business, in cui la domanda pari a zero rappresenta un caso limite (come la copertura di stock infinita), che richiede una logica specifica.

Per extend.distrib() sono poi previsti altri tre sovraccarichi, che consentono un maggiore controllo sulla particolare granularità della tabella generata.

Opzione divario

Il primo sovraccarico è utile a stilare una lista di priorità degli acquisti tenendo conto dell'attuale livello di scorte. La sintassi è la seguente:
table T = extend.distrib(D, S)
Il primo argomento, D, è lo stesso definito prima. Il secondo argomento, S, deve essere un numero intero. Se il secondo argomento è presente, la tabella generata include sempre due righe dedicate ai segmenti [0;0] e [1;S]. Gli altri segmenti sono generati a partire da S+1, come specificato sopra. Se l'argomento non è specificato, il valore predefinito che gli viene assegnato è zero.

Nella pratica, l'argomento S è spesso definito come somma di scorte disponibili e scorte ordinate: durante un riordino, infatti, vanno considerate solo le probabilità di domanda che superano il livello attuale di scorte.

Opzione moltiplicatore

Il secondo sovraccarico è utile nei casi in cui viene utilizzato un moltiplicatore di partite: qui, la tabella dovrebbe ripetersi su segmenti di dimensioni specifiche. La sintassi corrispondente è la seguente:
table T = extend.distrib(D, S, M)
Gli argomenti D e S sono quelli definiti precedentemente. Il terzo argomento, M, deve essere un numero intero, che rappresenti la lunghezza del segmento desiderata. La tabella include quindi la lista dei segmenti [0;0], [1;S], [S+1;S+M] [S+M+1;S+2M] … Se M è pari a zero, la funzione ridimensiona i segmenti automaticamente.

Nella pratica, forzare segmenti di lunghezza pari a 1 potrebbe peggiorare le prestazioni, poiché le dimensioni della tabella possono crescere a dismisura. Envision sfrutta allora un multiplo di M: questo ci garantisce che la logica moltiplicatore di partite continui a funzionare, ma pone dei limiti ragionevoli alle righe che vengono generate per la tabella.

In linea generale, suggeriamo di non applicare questo sovraccarico se non è presente un moltiplicatore di partite e, anche se questo fosse presente, di mantenere M pari a zero per tutti gli articoli che non sono associati a uno specifico moltiplicatore di partite.

Opzione quantità minime

Il terzo sovraccarico è utile nelle situazioni in cui sono presenti quantitativi minimi di ordine: in questi casi, infatti, la tabella dev'essere abbastanza lunga da raggiungere determinati valori. La sintassi da utilizzare è la seguente:
table T = extend.distrib(D, S, M, R)
Gli argomenti D, S e M restano quelli definiti sopra. Il quarto argomento, R, deve essere un numero intero non negativo, che rappresenti il valore massimo desiderato per la griglia (si tratta, insomma, di indicare a quale riga T.Max supererà o sarà uguale a R). Se l'argomento non è specificato, il valore predefinito assegnato sarà zero.

Nella pratica, questo argomento è usato per soddisfare quantitativi minimi di ordine (o MOQ) particolarmente restrittivi, che possono essere rispettati solo se la tabella generata è abbastanza grande da raggiungere i valori minimi richiesti.

In linea di massima, raccomandiamo di applicare questo sovraccarico solo se sono presenti vincoli di tipo MOQ. Qualora fossero presenti vincoli di questo tipo, suggeriamo comunque di assegnare a R il valore minimo possibile, in modo da raggiungere le quantità necessarie, senza però far lievitare la tabella T.