Detailforsyningskæde ABM i Python

I denne artikel poster jeg en simpel distributionsforsyningskæde agent-baseret model i Python. Agent-baseret modellering (forkortet til ABM) blev allerede introduceret af mig i forskellige andre blogindlæg. Her er nogle introduktionsreferencer, der får dig i gang.

Jeg har også udviklet en Python-pakke til grid-baserede agent-baserede simuleringer. Denne pakke kan bruges til at implementere ABM’er, der er grid-baserede. Betydning, hvor miljøet, som agenterne befinder sig i, kan modelleres med et gitter. Selv modeller, der ikke kræver en netbaseret model, kan implementeres med en sådan ramme. Pakken er nu tilgængelig fx her:

En grid-baseret model kan være nyttig, da den giver et koncept til at definere afstande (herunder abstrakte afstandsmål som f.eks. social afstand). Desuden giver det et standardiseret koncept til modellering af interaktion mellem agenter. I dette indlæg vil jeg ikke implementere en grid-baseret simuleringsmodel . Dette skyldes, at det ikke er nødvendigt i tilfælde af SCM-distributionsmodellen, der diskuteres her.

Konceptuel forsyningskædemodel

I denne simple model er der to typer logiske flows. Informationsflow og materialeflow:

  • Forhandlere kan afgive ordrer hos distributører. En distributør kan placere ordrer hos producenter. Dette er informationsstrømmen .
  • Producenter kan producere og sende produkter til distributører. Distributøren kan sende produkter til forhandlere. Dette er materialestrømmen .

Dette er detaildistributionsforsyningskæden i sin mest simple form. Tilføjelser til modellen vil så f.eks. være leveringstider, minimumsbestillingsmængder, produktpartistørrelser, lagerpolitikker osv. Alle disse tilføjelser kan tilføjes til en agent-baseret model som den, der er beskrevet i denne artikel.

Supply chain ABM i Python

Ovenstående figur illustrerer den konceptuelle model. Næste afsnit implementerer ovenstående forsyningskæde ABM i Python.

Implementering af supply chain ABM i Python

Nedenfor implementerer jeg forsyningskæden ABM i Python. Først implementerer jeg rammerne for klasser, som jeg vil bruge. Jeg skal bruge en forhandlerklasse , en distributørklasse og en producentklasse . Jeg implementerer disse klasser i koden nedenstående.

# RETAILER class
class Retailer:
    def __init__(self, inventory_level):
        self.inventory_level = inventory_level

    def order_from_distributor(self, quantity):
        if quantity > self.inventory_level:
            order_quantity = quantity - self.inventory_level
            return order_quantity
        else:
            return 0

    def receive_shipment(self, quantity):
        self.inventory_level += quantity

# DISTRIBUTOR class
class Distributor:
    def __init__(self, inventory_level):
        self.inventory_level = inventory_level

    def order_from_manufacturer(self, quantity):
        if quantity > self.inventory_level:
            order_quantity = quantity - self.inventory_level
            return order_quantity
        else:
            return 0

    def receive_shipment(self, quantity):
        self.inventory_level += quantity

# MANUFACTURER class
class Manufacturer:
    def __init__(self, production_capacity):
        self.production_capacity = production_capacity

    def produce_goods(self, quantity):
        if quantity <= self.production_capacity:
            return quantity
        else:
            return self.production_capacity

Dernæst implementerer jeg selve simuleringsmodellen . Til dette skriver jeg en funktion, der tager 4 argumenter. Forhandleren, distributøren, producenten og antallet af iterationer. Jeg bruger det tilfældige modul til at generere tilfældige ordremængder.

import random

# SIMULATION implementation
def simulate_supply_chain(retailer :Retailer, 
                          distributor :Distributor, 
                          manufacturer :Manufacturer, 
                          num_iterations :int
                         ) -> None:
    """ supply chain simulation

    simulates a supply chain with a retailer, a distributor, and a manufacturer;
    simulates over a specified amount of iteration;
    uses random to generate random order quantities

    Args:
    # retailer (Retailer): retailer agent that place orders at distributor
    # distributor (Distributor): distributor that palces order at manufacturer
    # manufacturer (Manufacturer): manufacturer that ships to distrubtor
    # num_iterations (int): 

    Returns:
    # None
    
    """
    for i in range(num_iterations):
        # retailer places order with distributor
        order_quantity = retailer.order_from_distributor(random.randint(5, 15))
        
        # distributor places order with manufacturer
        order_quantity = distributor.order_from_manufacturer(order_quantity)
        
        # manufacturer produces goods and ships to distributor
        shipped_quantity = manufacturer.produce_goods(order_quantity)
        distributor.receive_shipment(shipped_quantity)
        
        # distributor ships goods to retailer
        shipped_quantity = distributor.inventory_level
        retailer.receive_shipment(shipped_quantity)

Dette fuldender min eksemplariske forsyningskæde ABM i Python.

Afsluttende bemærkninger og relateret indhold

En realistisk, kommerciel model ville skulle indeholde mange tilføjelser. Som indledningsvis påpeget, f.eks. leveringstider, ordrepunkter, MOQ’er, partistørrelser osv. Også ordrer i sig selv ville højst sandsynligt ikke blive genereret af en simpel tilfældig talgenerator som i dette tilfælde. Ikke desto mindre illustrerer dette simple eksempel konceptet med agentbaseret modellering til forsyningskædemodellering. Selv en meget kompleks forsyningskæde kan modelleres på denne måde.

Hvis du er interesseret i agentbaseret simulering, kan du overveje at tjekke mine netbaserede agentsimuleringsmodeller :

You May Also Like

Leave a Reply

Leave a Reply

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *

This site uses Akismet to reduce spam. Learn how your comment data is processed.