Umwandlung einer Verteilung in eine Tabelle mit Envision

Umwandlung einer Verteilung in eine Tabelle mit Envision












Startseite » Ressourcen » Hier

In Envision sind Verteilung sehr praktisch, da sie von einer ganzen Algebra der Verteilung unterstützt werden. Doch zur Erstellung von Entscheidungen bezüglich des Bestands ist es normalerweise erforderlich, diese Verteilungen in ein Raster umzuwandeln, also eine Tabelle, in der die Werte der Verteilung, gewöhnlich in Form von Wahrscheinlichkeiten, aufgezählt werden. Durch die Nutzung solcher Raster kann die endgültige Tabelle erstellt werden, die die vorgeschlagenen Mengen für Bestellung und Bestandsbewegung enthält. Hier erklären wir, wir die extend.distrib()-Funktion dafür eingesetzt werden kann.


Raster vs. Verteilungen

Ein Raster ist eine einfache Tabelle, die eine Liste von Histogramm-Buckets enthält, wobei für jede ursprüngliche Verteilung ein Bucket entsteht und eine Zeile pro Bucket im Histogramm. Generisch wird ein Raster als Tabelle mit vier Feldern dargestellt:

  • Id, das den Artikel identifiziert
  • Min, die untere inklusive Grenze des Histogramm-Buckets
  • Max, die höhere inklusive Grenze der Histogramm-Buckets
  • Value, der dem Histogramm-Buckets zugeordnete Wert

Für einen bestimmten Artikel kann das Raster eine Reihe von Buckets enthalten, die das gesamte Histogramm der Verteilung darstellen. Ist die Verteilung eine Zufallsvariable, kann der Bucket-Wert als die Wahrscheinlichkeit der Verteilung bezüglich des vom Bucket gedeckten Segments interpretiert werden.

Doch Raster sind nicht so flexibel wie Verteilungen. Um die erforderliche Leistung zu erzielen, ist es oft nicht möglich, Buckets mit einer Breite von 1 zu warten. Daher werden größere Buckets benutzt, um den Speicherbedarf der Raster in Lokad übersichtlich zu gestalten. Nicht unitäre Buckets erschweren die Berechnungen, die auf Rastern ausgeführt werden. Außerdem haben sie per Definition einen kompakten Träger (im mathematischen Sinne): Die Werte ungleich Null werden nur für eine endliche Anzahl von Punkten definiert.

Auf der anderen Seite sind Raster einfache Tabellen und können in anderen Tabellen über die gewöhnlichen Envision-Operatoren verarbeitet werden. Hier nimmt Envision einen besonderen Ansatz an, in dem die gesamte Modellierung der Wahrscheinlichkeit und der wirtschaftlichen Aspekten über Verteilungen vorgenommen wird, wobei die Umwandung in Raster erst in einem der letzten Schritte erfolgt direkt vor der Erstellung der empfohlenen Entscheidungen bezüglich der Lieferkette.

Syntax von extend.distrib()

Envisions Verteilungen bieten eine leistungsfähige Algebra, mit der gefaltete Berechnungen von Wahrscheinlichkeiten mit Listen vermieden werden können. Dennoch ist eine rohe Liste mit Wahrscheinlichkeiten in manchen Fällen ausreichend oder sogar erwünscht. Die Erweiterung der Verteilung extend.distrib() wandelt einen Verteilungsvektor in eine Tabelle um, wie in der folgenden Syntax veranschaulicht wird:
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
Es wird erwartet, dass das Argument D ein Verteilungsvektor ist, wie er gewöhnlich von Lokads probabilistischen Prognose-Engine erstellt wird. Tabelle T ist als Erweiterung der ursprünglichen Tabellen und der impliziten Items-Tabelle im oberen Skript typisiert. Tabelle T wird mit drei Feldern befüllt:

  • T.Min: die untere inklusive Grenze des Integrals des Segments
  • T.Max: die obere inklusive Grenze des Integrals des Segments
  • T.Probability: die Summe der Verteilungen über den inklusiven Bereich

Trotz seines Namens bezieht sich das Probability-Feld eigentlich auf die Summe der Verteilungen über den Bucket-Bereich, der zurückgegeben wird. Bitte beachten Sie, dass dieses Feld nicht von extend.distrib() befüllt wird. Wird dieses Feld benötigt, muss es eigens, wie in Zeile 2, erstellt werden.

Für relativ kompakte Verteilungen haben Segmente die Länge 1, womit T.Min == T.Max. Doch wenn sich die Verteilung über höhere Werte verbreitet, würden Segmente mit der Länge 1 möglicherweise Millionen von Zeilen erstellen, was nicht zu handhaben ist. Daher aggregiert Envision diese Verteilungen bei größeren Segmenten automatisch, wenn solche Verteilungen mit großen Werten auftreten. Hierfür werden Algorithmen fein abgestimmt, um die Größe der erstellten Tabellen übersichtlich zu gestalten.

Per Design erfasst extend.distrib() immer die Null-Segmente. Folglich erhält das Segment [0;0] immer seine eigene Zeile in der erzeugten Tabellen. Dieses Verhalten ist tatsächlich in vielen Betriebsfällen nützlich, bei denen ein Bestand von null, einen Grenzfall darstellt, wie bei unendlicher Bestandsdeckung - die einer besonderen Logik bedarf.

Dann werden drei zusätzliche Überladungen für extend.distrib() angegeben, um mehr Kontrolle über die bestimmte Granularität der erstellten Tabelle zu gewinnen.

Gap-Option

Die erste Überladung ist zur Priorisierung der Einkaufsliste unter Berücksichtigung des aktuellen Bestands gedacht. Die Syntax lautet, wie folgt:
table T = extend.distrib(D, S)
Das erste Argument D ist wie oben definiert. Vom zweiten Argument S wird eine ganze Zahl erwartet. Wenn dieses zweite Argument vorliegt, enthält die erstellte Tabelle immer zwei Zeilen für die zwei Segmente [0;0] und [1;S]. Die zusätzlichen Segmente werden, wie oben beschrieben, automatisch ab S+1 generiert. Wenn er nicht angegeben wird, wird für diesen Wert ist als Standardwert null festgelegt.

In der Praxis wird das Argument S oft als die Summe des vorhandenen Bestands plus den bestellten Bedarf definiert. Tatsächlich sollten bei einer erneuten Bestellung nur jene Bedarfswahrscheinlichkeiten, die den aktuellen Bestand überschreiten, berücksichtigt werden.

Multiplikator-Option

Die zweite Überladung ist für Fälle gedacht, in denen Multiplikatoren für Losgrößen vorkommen. Hier sollte Tabellen in Segmenten bestimmter Größen wiederholt werde:
table T = extend.distrib(D, S, M)
Die Argumente D und S sind wie oben beschrieben. Das dritte Argument M sollte eine ganze Zahl sein. Es stellt die gewünschte Segmentlänge dar. So enthält die Tabelle eine Segmentliste [0;0], [1;S], [S+1;S+M] [S+M+1;S+2M] … Wenn M null ist, wird die Größe der Segmente automatisch durch die Funktion bestimmt.

In der Praxis könnte das Erzwingen von Segmenten mit einer Länge von 1 zu Leistungsproblemen führen, da die Größe der Tabelle beliebig sein kann. Daher bietet Envision die Möglichkeit, auf ein Vielfaches von M zurückzugreifen. Durch die Benutzung eines Vielfachen wird sichergestellt, dass die Logik des Multiplikators für Losgrößen weiterhin funktioniert, während gleichzeitig die Anzahl der erstellten Zeilen begrenzt wird, sodass sie überschaubar bleibt.

Als Faustregel raten wir davon ab, diese spezifische Überladung zu nutzen, außer im Falle von Multiplikatoren von Losgrößen. Und wenn diese auftreten, empfehlen wir, M für alle Artikel, die über keinen bestimmten Multiplikator von Losgrößen verfügen, auf null zu halten.

Reach-Option

Die dritte Überladung ist für Fälle gedacht, bei denen MOQs vorkommen. In solchen Fällen, sollte die Tabelle oft genug wiederholt werden, um bestimmte erwünschte Werte zu erreichen. Die relevante Syntax lautet:
table T = extend.distrib(D, S, M, R)
Die Argumente D, S und M sind, wie sie oben definiert werden. Das vierte Argument R soll eine nicht negative ganze Zahl sein. Es stellt den erwünschten Höchstwert dar, der vom Raster erreicht werden soll. Dies bedeutet, dass es eine Zeile gibt bei der T.Max größer oder gleich R ist. Wenn kein Wert bestimmt wird, ist der Standardwert für dieses Argument null.

In der Praxis kommt dieses Argument bei Bedingungen mit einer großen Mindestbestellmenge (MOQ) zum Tragen, die nur erfüllt werden können, wenn die erstellten Verteilungen weit genug reichen, um die MOQ-Werte zu decken.

Als Faustregel raten wir davon ab, diese Überladung zu benutzen, außer im Falle, dass bestimmte MOQs erreicht werden müssen. Ist dies der Fall, sollte R so klein wie möglich gehalten werden. Ein kleiner R-Wert verhindert nicht, dass die Tabelle T höhere Werte erreicht, sondern stellt lediglich sicher, dass größere Werte erreicht werden.