Transformer une distribution en grille dans Envision

Transformer une distribution en grille










Accueil » Ressources » Ici

Dans Envision, l’utilisation de distributions est facilitée par une algèbre spécifique. Cependant, pour générer des décisions à propos du stock, ces distributions doivent être transformées « grille », c’est-à-dire une table qui contient les valeurs de la distribution, généralement sous forme de probabilités . Une telle grille permet de créer la table finale qui contient les quantités de commande suggérées ou les mouvements de stock suggérés. Nous présentons dans cet article l’utilisation de la fonction extend.distrib() dans ce contexte.


Grilles vs distributions

Une « grille » est une simple table qui contient une « liste » de classes d’histogrammes. Chaque histogramme correspond à une distribution et chaque ligne de la table à une classe d’un histogramme. La représentation générique d’une grille est une table qui contient 4 champs :

  • Id identifie l’article.
  • Min est la limite inférieure de l’intervalle de classe.
  • Max est la limite supérieure de l’intervalle de classe.
  • Value est la valeur associée à la classe.

Pour un article donné, la grille peut contenir plusieurs classes qui représentent l’histogramme de la distribution. Si la distribution est une « variable aléatoire », la valeur de la plage peut être interprétée comme la « probabilité » de la distribution sur l’intervalle de la classe.

Les grilles sont moins flexibles que les distributions. Pour atteindre le niveau de performance requis, il n’est souvent pas possible de gérer des classes d’un intervalle de 1. Des intervalles plus larges sont utilisés afin que les besoins en mémoire de la grille restent gérables par Lokad. Mais les classes non unitaires compliquent les calculs effectués sur la grille. De plus les grilles sont conçues pour disposer d’un « support compact » (au sens mathématique) : leurs valeurs non nulles ne sont définies que pour un nombre fini de points.

D’autre part, les grilles sont de simples « tables » et peuvent être transformées en d’autres tables grâce aux opérateurs Envision habituels. En règle générale, Envision met l’accent sur une approche dans laquelle toute la modélisation économique et probabiliste est réalisée avec des distributions. La transformation en grilles est une des étapes finales et précède la génération des décisions logistiques suggérées.

Syntaxe de extend.distrib()

Les distributions dans Envision offrent une algèbre puissante, qui peut être utilisée pour éviter les calculs alambiqués de probabilités sur des listes. Mais, dans certains cas, une liste brute de probabilités est tout à fait satisfaisante et même souhaitable. L’extension de distribution extend.distrib() transforme un vecteur de distributions en table, comme l’illustre la syntaxe suivante :
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’argument D doit être un vecteur de distributions, comme ceux produits par le moteur de prévisions probabilistes de Lokad. La table T est une extension des tables d’origine, la table implicite Items dans le script ci-dessus. Elle contient trois champs :

  • T.Min : limite inférieure entière inclusive du segment ;
  • T.Max : limite supérieure entière inclusive du segment ;
  • T.Probability : la somme de la distribution sur la plage inclusive.

Malgré le nom du champ, Probability, il s’agit bien de la somme de la distribution sur la plage de classes renvoyée. Notez que ce champ n'est pas renseigné par extend.distrib(). Si nécessaire, il doit être créé spécifiquement, comme à la ligne 2.

Pour les distributions relativement compactes, les segments ont une longueur de 1, d’où T.Min == T.Max. Cependant, si la distribution s’étale sur des valeurs plus grandes, les segments dont la longueur est égale à 1 peuvent générer des millions de lignes, ce qui devient ingérable. Par conséquent, dans le cas-là, Envision agrège automatiquement les distributions sur des segments plus importants. Les algorithmes sont donc réglés pour garantir que les tables générées gardent des tailles gérables.

Extend.distrib() isole délibérément les segments nuls. Ainsi, le segment [0;0] obtient toujours sa propre ligne dans la table générée. Ce comportement est utile dans plusieurs situations, lorsque la demande nulle est un cas limite, tout comme une couverture de stock infinie, qui requiert une logique spécifique.

De plus, trois surcharges supplémentaires sont fournies pour extend.distrib() afin de mieux contrôler la granularité de la table générée.

Option d’écart

La première surcharge est conçue pour aider à élaborer une liste de priorités d’achat en prenant en compte le niveau de stock actuel. La syntaxe est la suivante :
table T = extend.distrib(D, S)
Le premier argument D est tel que défini ci-dessus. Le deuxième argument S doit être un nombre entier. Lorsque ce second argument est présent, la table générée inclut deux lignes consacrées aux deux segments [0;0] et [1;S]. Les autres segments sont générés automatiquement à partir de S+1 comme indiqué ci-dessus. La valeur par défaut de cet argument, si non fourni, est zéro.

En pratique, l’argument S est fréquemment défini par la somme du stock disponible et du stock en commande. En effet, lors du réapprovisionnement, seules les probabilités de demande supérieure au niveau de stock actuel doivent être prises en compte.

Option de multiples

La seconde surcharge est conçue pour des situations qui impliquent des multiples de commande. Dans ces cas-là, la table doit faire des itérations sur des segments de taille donnée. La syntaxe est la suivante :
table T = extend.distrib(D, S, L)
Les arguments D et S sont tels que définis ci-dessus. Le troisième argument M doit être un nombre entier. Il représente la longueur de segment voulue. Ainsi la table contient la liste de segments [0;0], [1;S], [S+1;S+L] [S+L+1;S+2L] … Si M est zéro, la fonction détermine la taille des segments automatiquement.

En pratique, si la longueur de segment imposée est 1, des problèmes de performance peuvent apparaître, car la table peut devenir très volumineuse. Ainsi, il se peut qu’à la place Envision utilise un « multiple » de M. La logique des « multiples de commande » fonctionne toujours, mais le nombre de lignes générées reste raisonnable.

D’une manière générale, nous vous conseillons de ne pas utiliser cette surcharge si vous ne devez pas gérer des multiples de commande. Si vous devez l’utiliser, nous vous suggérons d’indiquer zéro pour l’argument L des articles qui ne sont pas soumis à un tel multiple.

Option atteindre

La troisième surcharge est conçue pour des situations qui impliquent des quantités minimales de commande. Dans ces cas-là, la table doit faire des itérations jusqu’à ce que certaines valeurs soient « atteintes ». La syntaxe est la suivante :
table T = extend.distrib(D, S, M, R)
Les arguments D, S et M sont tels que définis ci-dessus. Le quatrième argument R doit être un nombre entier non négatif. Il représente la valeur « max » à atteindre par la grille, c’est dire qu’une ligne pour laquelle T.Max est supérieur ou égal à R sera créée. La valeur par défaut de cet argument, si non fourni, est zéro.

En pratique, cet argument sert à gérer les quantités minimales de commande importantes qui ne peuvent être respectées que si les distributions générées vont assez loin pour couvrir les valeurs des quantités minimales de commande.

D’une manière générale, nous vous conseillons de ne pas utiliser cette surcharge, si vous ne devez pas gérer des quantités minimales de commande. Si vous devez l’utiliser, nous vous suggérons de faire en sorte que R soit aussi petit que possible. Une valeur de R faible n’empêche pas la table T d’atteindre les valeurs supérieures, elle garantit simplement que ces dernières soient atteintes.