Priorisierte Bestellungen mit probabilistischen Prognosen - Optimierung

Wirtschaftliche Priorisierung des Einkaufs












Startseite » Ressourcen » Hier

Probabilistische Vorhersagen bieten im Vergleich zu herkömmlichen Prognoseansätze viele detaillierte Erkenntnisse über die Zukunft und lassen uns den gesamten Bestellprozess überdenken. In diesem Abschnitt beschreiben wir, wie eine Prioritätenliste für Einkäufe mit Lokad erstellt werden kann. Die zwei Hauptvorteile dieses Ansatzes, im Vergleich zu den Reorder-Points, sind, dass man keine Service Level mehr pflegen und abstimmen muss und dass eine flexiblere Einkaufsmethodik benutzt wird, die mit Versorgungsengpässen besser umgehen kann.

Die Prioritätenliste für Einkäufe ist ein Beispiel für eine priorisierte Bestellpolitik. Diese breite Art von Bestandspolitiken bietet im Vergleich zu herkömmlichen Bestandspolitiken höhere Bestandsleistungen. Wenn möglich, empfiehlt Lokad immer, eine priorisierte Bestellpolitik anzuwenden.

Skript-Vorlage für die Prioritätenliste

Zur Erstellung einer Prioritätenliste müssen wir ein kleines Envision-Skript benutzen (s. unten). Dieses Skript können Sie in Ihrem Lokad-Konto über den Button Create Envision script erstellen. Wenn dieses neue Projekt erstellt ist, sehen Sie einen Code-Editor. Kopieren Sie den unteren Code und speichern Sie ihn, indem Sie auf Save klicken.

read "/sample/Lokad_Items.tsv" with
Supplier: text
Category: text
SubCategory: text
read "/sample/Lokad_Orders.tsv" as Orders
read "/sample/Lokad_PurchaseOrders.tsv" as PO

orderingLeadtime := 7 // 7 Tage

// nicht erfüllte Aufträge ausschließen
where PO.DeliveryDate > PO.Date
  Leadtime = forecast.leadtime(
    hierarchy: Category, SubCategory
    present: (max(Orders.Date) by 1) + 1
    leadtimeDate: PO.Date
    leadtimeValue: PO.DeliveryDate - PO.Date + 1)

Demand = forecast.demand(
  horizon: Leadtime +* dirac(orderingLeadtime)
  hierarchy: Category, SubCategory
  present: (max(Orders.Date) by 1) + 1
  demandDate: Orders.Date
  demandValue: Orders.Quantity)

show form "Purchase simulator" a1b3 tomato with
Form.budget as "Max budget"

M = SellPrice - BuyPrice
// Bestrafung für Fehlbestände
S = - 0.25 * SellPrice
// % '0.3' als jährliche Lagerhaltungskosten
C = - 0.3 * BuyPrice * mean(Leadtime) / 365 
// Auftragstrückstand
MB = 0.5 * SellPrice
MBU = MB * uniform(1, Backorder)
// Auftragstrückstand
SB = 0.5 * SellPrice
SBU = SB * uniform(1, Backorder)
// Chance späteren Kaufs
AM = 0.3
// % '0.2' als jährlicher Abzinsungsfaktor
AC = 1 - 0.2 * mean(Leadtime) / 365

RM = MBU + (stockrwd.m(Demand, AM) * M) >> Backorder
RS = SBU + zoz(stockrwd.s(Demand) * S) >> Backorder
RC = (stockrwd.c(Demand, AC) * C) >> BackOrder
// gesamte erneute Erstellung
R = RM + RS + RC

Stock = StockOnHand + StockOnOrder

DBO = Demand >> BackOrder
table G = extend.distrib(DBO, Stock, LotMultiplier)

where G.Max > Stock
  G.Q = G.Max - G.Min + 1
// Integral der Bestands-Belohnungsfunktion
  G.Reward = int(R, G.Min, G.Max)
  G.Score = G.Reward / max(1, BuyPrice * G.Q)

// Beste Ergebnisse zuerst
//doch die Reihenfolge von Paaren (Id, G.Max) bleibt erhalten
   G.Rank = rank(G.Score, Id, -G.Max)
   G.Invest = cumsum(BuyPrice * G.Q) sort [G.Rank]

  where G.Invest < Form.budget + 0
  where exists(G.Q)
    show table "Purchase priority list with $\{Form.budget}" c1g3 tomato with
      Id as "Id"
      Supplier as "Supplier"
      StockOnHand as "OnHand"
      StockOnOrder as "OnOrder"
      sum(G.Q) as "Qty"
      mean(Leadtime) as "Leadtime"
      sum(G.Reward) as "Reward" unit:"$"
      sum(BuyPrice * G.Q) as "Cost" unit:"$"
      group by Id
      order by avg(G.Score) desc

Dieses Skript erstellt ein Dashboard, das eine Tabelle enthält. Ein Planer für die Lieferkette sollte dann den Kauf der Artikel nach der Reihenfolge der Liste vornehmen. Bei den vorgeschlagenen Mengen werden Auftragsrückstände, sowie Multiplikatoren für Losgrößen berücksichtigt.

Image

Lassen Sie uns den Inhalt des Skripts genauer analysieren. Die erste Zeile liest die Daten aus dem Ordner /sampel, in denen erwartet wird, dass sich die Beispieldateien befinden.

Was die Datei Lokad_Items.tsv betrifft, die die Produktliste oder SKUs enthält, werden zwei „besondere“ Spalten erwartet:

  • SellPrice: Der Einheitsverkaufspreis (abzüglich Steuer)
  • BuyPrice: Der Einheitskaufpreis (abzüglich Steuer)

Wenn Sie das Skript angepasst haben, so dass es die Daten aus dem richtigen Eingabeordner extrahiert, und sofern die Felder SellPrice und BuyPrice, wie von unserer Technologie erwartet, vorhanden sind, klicken Sie auf den Run Button. Somit wird das Skript ausgeführt und ein Dashboard erstellt, das eine einzige große Tabelle enthält. Klicken Sie am Ende des Bildschirms auf die Tabelle, um die Möglichkeit zu erhalten, die Tabelle als Excel-Blatt herunterzuladen.

Der oberste Bereich des Skripts beinhaltet auch zwei Aufrufe an den probabilistischen Prognose-Engine Lokads zur jeweiligen Prognose der Durchlaufzeit und des Bedarfs.

Dann werden die für die Berechnung der Bestands-Belohnungsfunktion relevanten Wirtschaftsvariablen eingeführt:
  • M: die Belohnung (Bruttogewinnspanne) pro gelieferte Einheit aus dem Bestand.
  • S: die Bestrafung, wenn eine Nachfrage nicht mit dem Bestand gedeckt werden kann.
  • C: jährliche Lagerhaltungskosten pro Einheit.
  • AM: Abzinsungsfaktor der Komponente der Gewinnspanne.
  • AC: Abzinsungsfaktor der Komponente der Lagerhaltungskosten.

Der Kern der Priorisierungslogik findet in der Berechnung von G.Reward und G.Score statt.
  • G.Reward: stellt die wirtschaftlichen Belohnung von G.Q der zusätzlichen Einheiten im Bestand (gewöhnlich ist G.Q gleich 1) dar.
  • G.Score: stellt einen Anteil der Höhe der Rendite in Dollar dar, für jeden in Bestand investierten Dollar.

Der danach auftauchende Filter where schließt die Fälle aus, in denen sich der Reorder-Point unter dem aktuellen Bestand befindet. Diese Situationen werden ausgeschlossen, da wir nur solche Einkaufszenarien in Betracht ziehen, durch die eine Erweiterung des Bestands erzielt wird. In diesem Block wird eine zweite Reihe von Berechnungen ausgeführt, die die Priorisierung selbst antreiben:

  • G.Rank: Sortiert alle Tabelleneinträge nach Ihrem Ergebnis. Doch diese Sortierung hat einen Haken, da für jeden Artikel die neue Sortierung, die Sortierung der Reorder-Points erhalten bleibt.
  • G.Invest: Zeigt, wie man kumulative Berechnungen erstellen kann. Hier berechnen wir die Gesamtinvestitionen (kumulativ), indem wir davon ausgehen, dass jeder Artikel nach der Reihenfolge der Liste gekauft wird.

Die Tabelle endet dann mit der Anweisung show table und alle Zeilen der Tabelle werden nach Id aggregiert, um eine Liste zu erhalten, in der jeder Artikel nur einmal vorkommt.

Fine-Tuning der Priorisierung

Das zuvor betrachtete Skript geht von etwas vereinfachten Voraussetzungen aus, was die Wirtschaftsvariablen, die zur Berechnung der Bestands-Belohnungsfunktion genutzt werden, betrifft. Nicht alle Ihre Artikel sind mit denselben Lagerhaltungskosten verbunden. Manche Artikel können verderblich sein, manche sehr sperrig, usw. Um eine genauere Vorstellung über diese Kosten zu erhalten, können Sie unseren Eintrag über Bestandskosten lesen. In der Praxis können wir immer wieder beobachten, wie Händler die Bestandskosten systematisch unterschätzen. Unserer Erfahrung nach sind jährliche Lagerhaltungskosten, die unter 25% liegen, zweifelhaft.

Obwohl es anfänglich etwas mühsam erscheinen kann, das gesamte Skript zu durchforsten, ist es unserer Erfahrung nach eine der wenigen Optionen, die die Flexibilität bietet, die man zur Implementierung der Annahmen Ihres Unternehmens benötigt. Das Envision-Skript bietet Ihnen die Art von Ausdruck, die Sie gewöhnlich in einem Excel-Blatt vorfinden würden.

Was den Gewinn betrifft, fördert das zuvor beschriebene Skript die Maximierung der Gewinnspanne. Dies kann sich jedoch auch negativ auf Ihr Unternehmen auswirken, wenn zufällig Artikel mit niedrigeren Gewinnspannen Ihr Unternehmen treiben, indem sie viele kleine aber rentablere Verkäufe erzeugen (z.B. beim Kauf eines Kunden von einem Smartphone mit einer Bruttogewinnspanne von 2,5% und dem anschließenden Kauf von zwei Artikeln aus dem Handyzubehör mit einer Bruttogewinnspanne von 50%). In diesem Fall können sie einen „Firmenwertfaktor “ einfügen, in Form einer verschobenen Gewinnspanne für solche Kernartikel.

Unserer Erfahrung nach gibt es so viele Prioritätseinstellungen wie Unternehmen, doch die Priorisierung spiegelt den spezifischen Mix wider, der Ihr Unternehmen prägt. Zögern Sie nicht, , wenn Sie Unterstützung benötigen.