在这篇文章中,我用 Python 发布了一个简单的基于分销供应链代理的模型。基于代理的建模(缩写为 ABM)已经由我在其他各种博客文章中介绍过。以下是一些可以帮助您入门的介绍性参考资料。
- 链接: 供应链管理分析师的模拟方法
- 链接: 基于代理的商业模拟
- 链接: Python 中基于代理的建模
我还为基于网格的基于代理的模拟开发了一个 Python 包。该包可用于实施基于网格的 ABM。意思是,代理所在的环境可以用网格建模。即使是不需要基于网格的模型的模型也可以使用这样的框架来实现。该软件包现在可用,例如:
- 链接: 基于代理的 Python 模拟包
- 链接: Python 中基于代理的仿真框架
基于网格的模型可能很有用,因为它提供了定义距离的概念(包括抽象距离度量,例如社交距离)。此外,它为代理之间的交互建模提供了一个标准化的概念。在这篇文章中,我不会实施基于网格的仿真模型。这是因为在此处讨论的 SCM 分布模型中没有必要。
概念供应链模型
在这个简单的模型中,有两种类型的逻辑流。信息流和物质流:
- 零售商可以向分销商下订单。分销商可以向制造商下订单。这就是信息流。
- 制造商可以生产产品并将其运送给分销商。分销商可以将产品运送给零售商。这就是物质流。
这是最简单形式的零售分销供应链。然后,模型的添加项将是交货时间、最小订购数量、产品批量大小、库存策略等。所有这些添加项都可以添加到基于代理的模型中,例如本文中讨论的模型。
上图说明了概念模型。下一节用 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。
结束语及相关内容
一个现实的商业模型必须包含许多附加功能。正如最初指出的那样,例如交货时间、订单点、最小起订量、批量大小等。此外,订单本身很可能不会像本例中那样由简单的随机数生成器生成。然而,这个简单的例子说明了供应链建模的基于代理的建模概念。即使是非常复杂的供应链也可以用这种方式建模。
如果您对基于代理的模拟感兴趣,可以考虑查看我的基于网格的代理模拟模型示例:
- 链接:基于代理的 SIR 模型 Python 示例
- 友情链接:口碑代理销售模式
- 链接:基于代理的隔离模型(Python)
专业领域为优化和仿真的工业工程师(R,Python,SQL,VBA)
Leave a Reply