供应链与库存优化

供应链的定义因引用的来源而异,但它们都有相同的基本思想。 供应链被定义为“相互连接和相互依赖的组织网络,相互合作,共同控制、管理和改善从供应商到最终用户的材料和信息流。” 供应链的规模和复杂程度各不相同,有些只有几级,有些则有数级。 例如,一个供应链可能由原材料供应商、制造工厂和向消费者销售的零售商组成,如图 1 所示。但是,另一条供应链可能由多个供应商组成,每个供应商都有几个独立的制造流程。 组件、将这些组件组装成成品的制造商、多个配送中心以及全国各地向消费者销售的零售商,如图 2 所示

数学公式、分布和模型

安全库存公式

在给定所需的循环服务水平的情况下,应持有的安全库存水平的方程式在中给出。 假设供应商的补货提前期和客户需求均呈正态分布,并采用持续审查补货政策。 我们将在等式中使用以下符号

$$ S S=Z \cdot \sqrt{L \sigma_{D}^{2}+D^{2} \sigma_{L}^{2}} $$

正态分布

正态(或高斯)分布是一种连续概率分布,以其“钟形”形状而闻名,以分布均值 µ 为中心,标准差为 σ,标准正态分布是 µ = 0 且 σ = 1 的特殊情况。 随机变量 X 在实线上的概率密度函数为正态分布,均值为 µ 和标准差 σ

$$ f(x)=\frac{1}{\sqrt{2 \pi} \sigma} e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^{2}}  $$

格雷夫斯和威廉斯模型

$$ d_{i}(t)=\sum_{(i, j) \in A} \phi_{i j} d_{j}(t) $$

保证服务时间

模型结构

仿真模型

库存模拟示例

RANDOM_SEED = 42
PT_MEAN = 10.0         
PT_SIGMA = 2.0         
MTTF = 300.0          
BREAK_MEAN = 1 / MTTF  
REPAIR_TIME = 30.0     
JOB_DURATION = 30.0    
NUM_MACHINES = 10      
WEEKS = 4              
SIM_TIME = WEEKS * 7 * 24 * 60  

def time_per_part():
   
    return random.normalvariate(PT_MEAN, PT_SIGMA)

def time_to_failure():
    
    return random.expovariate(BREAK_MEAN)

class Machine(object):
    
    def __init__(self, env, name, repairman):
        self.env = env
        self.name = name
        self.parts_made = 0
        self.broken = False

        
        self.process = env.process(self.working(repairman))
        env.process(self.break_machine())

    def working(self, repairman):
       
        while True:
            
            done_in = time_per_part()
            while done_in:
                try:
                    
                    start = self.env.now
                    yield self.env.timeout(done_in)
                    done_in = 0  

                except Interrupt:
                    self.broken = True
                    done_in -= self.env.now - start  

                    
                    with repairman.request(priority=1) as req:
                        yield req
                        yield self.env.timeout(REPAIR_TIME)

                    self.broken = False

            # Part is done.
            self.parts_made += 1

    def break_machine(self):
        
        while True:
            yield self.env.timeout(time_to_failure())
            if not self.broken:
                
                self.process.interrupt()

def other_jobs(env, repairman):
   
    while True:
        
        done_in = JOB_DURATION
        while done_in:
          
            with repairman.request(priority=2) as req:
                yield req
                try:
                    start = env.now
                    yield env.timeout(done_in)
                    done_in = 0
                except Interrupt:
                    done_in -= env.now - start

模型代码

https://embed.notionlytics.com/wt/ZXlKM2IzSnJjM0JoWTJWVWNtRmphMlZ5U1dRaU9pSlhiRWhvWlV4VVQxbHNjMlZYV2tKbU9URndaU0lzSW5CaFoyVkpaQ0k2SWpZM09ETXdOMkprWlRNNFlUUTVNbU01WkdGaE5qVmlZamN5WldRelpqRmhJbjA9