Python 中的零售供应链 ABM

在这篇文章中,我用 Python 发布了一个简单的基于分销供应链代理的模型。基于代理的建模(缩写为 ABM)已经由我在其他各种博客文章中介绍过。以下是一些可以帮助您入门的介绍性参考资料。

我还为基于网格的基于代理的模拟开发了一个 Python 包。该包可用于实施基于网格的 ABM。意思是,代理所在的环境可以用网格建模。即使是不需要基于网格的模型的模型也可以使用这样的框架来实现。该软件包现在可用,例如:

基于网格的模型可能很有用,因为它提供了定义距离的概念(包括抽象距离度量,例如社交距离)。此外,它为代理之间的交互建模提供了一个标准化的概念。在这篇文章中,我不会实施基于网格的仿真模型。这是因为在此处讨论的 SCM 分布模型中没有必要。

概念供应链模型

在这个简单的模型中,有两种类型的逻辑流。信息流和物质流:

  • 零售商可以向分销商下订单。分销商可以向制造商下订单。这就是信息流
  • 制造商可以生产产品并将其运送给分销商。分销商可以将产品运送给零售商。这就是物质流

这是最简单形式的零售分销供应链。然后,模型的添加项将是交货时间、最小订购数量、产品批量大小、库存策略等。所有这些添加项都可以添加到基于代理的模型中,例如本文中讨论的模型。

Python 中的供应链 ABM

上图说明了概念模型。下一节用 Python 实现上述供应链 ABM。

用Python实现供应链ABM

下面我用Python实现供应链ABM。首先,我实现了我将使用的类框架。我需要一个Retailer 类、一个Distributor 类和一个Manufacturer 类。我在下面截取的代码中实现了这些类。

# 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

接下来,我实现仿真模型本身。为此,我编写了一个带有 4 个参数的函数。零售商、分销商、制造商和迭代次数。我使用随机模块生成随机订单数量。

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)

这完成了我在 Python 中的示例性供应链 ABM。

结束语及相关内容

一个现实的商业模型必须包含许多附加功能。正如最初指出的那样,例如交货时间、订单点、最小起订量、批量大小等。此外,订单本身很可能不会像本例中那样由简单的随机数生成器生成。然而,这个简单的例子说明了供应链建模的基于代理的建模概念。即使是非常复杂的供应链也可以用这种方式建模。

如果您对基于代理的模拟感兴趣,可以考虑查看我的基于网格的代理模拟模型示例:

You May Also Like

Leave a Reply

Leave a Reply

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据