# Python仿真二级供应链测试安全库存模型

{% tabs %}
{% tab title="关键词" %}
Python | 概率 | 统计 | 供应链测试 | 安全库存模型 | 数学 | 正态分布 | 格雷夫斯和威廉斯模型 | Sympy
{% endtab %}

{% tab title="梗概" %}
### 供应链与库存优化

供应链的定义因引用的来源而异，但它们都有相同的基本思想。 供应链被定义为“相互连接和相互依赖的组织网络，相互合作，共同控制、管理和改善从供应商到最终用户的材料和信息流。” 供应链的规模和复杂程度各不相同，有些只有几级，有些则有数级。 例如，一个供应链可能由原材料供应商、制造工厂和向消费者销售的零售商组成，如图 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) \$$

#### 保证服务时间

#### 模型结构

### 仿真模型

**库存模拟示例**

```python
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

```

### 模型代码
{% endtab %}
{% endtabs %}

{% content-ref url="../zhi-dian-mi-jin-brief" %}
[zhi-dian-mi-jin-brief](../zhi-dian-mi-jin-brief)
{% endcontent-ref %}
