You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于面向对象方法的Simpy库存离散事件仿真运行异常排查

问题分析与解决:Simpy库存仿真无输出且持续运行

核心问题

你的仿真脚本卡住无输出的根源在于chek_inventory_and_order方法的逻辑缺陷:这个方法里的while True循环没有在if分支外添加yield语句,导致该进程会一直占用CPU执行循环检查,永远不会把控制权交还给Simpy环境,进而使得serve_customer进程完全没有机会启动运行,自然看不到任何输出。

修复步骤

修改chek_inventory_and_order方法,在循环内添加一个短时间的timeout,让进程定期释放控制权,同时保证库存检查逻辑正常执行:

修复后的完整代码

import simpy
import numpy as np

class warehouse(object):

    # 初始化仓库对象
    def __init__(self, env, initial_inv, reorder_point, target_inv, lead_time):
        self.env = env
        self.on_hand_inv = initial_inv
        self.reorder_point = reorder_point
        self.target_inv = target_inv
        self.lead_time = lead_time

        # 启动进程
        self.env.process(self.chek_inventory_and_order())
        self.env.process(self.serve_customer())


    # 客户服务进程
    def serve_customer(self):
        while True:
            interarrival = np.random.exponential(1./5)
            yield self.env.timeout(interarrival)
            demand = np.random.randint(1,5)
            if demand < self.on_hand_inv:
                self.on_hand_inv -= demand
                print("{:.2f}, sold {}".format(self.env.now, demand))
            else:
                print("{:.2f}, sold {} (out of stock)".format(self.env.now, self.on_hand_inv))
                self.on_hand_inv = 0

    # 库存检查与补货进程
    def chek_inventory_and_order(self):
        while True:
            if self.on_hand_inv <= self.reorder_point:
                order_qty = self.target_inv - self.on_hand_inv
                print("{:.2f}, place order of {}".format(self.env.now, order_qty))
                yield self.env.timeout(self.lead_time)
                self.on_hand_inv += order_qty
                print("{:.2f}, order received. {} in inventory".format(self.env.now, self.on_hand_inv))
            # 添加短时间timeout,释放控制权给其他进程
            yield self.env.timeout(0.1)


def run_simulation(print_=False):
    np.random.seed(0)
    env = simpy.Environment()

    s = warehouse(env, 40, 5, 40, 2.)
    env.run(until=10.)

# 调用仿真函数
run_simulation()

额外优化点

  • 拼写修正:将chek_inventory_and_order里的recieved改为received,避免拼写错误
  • 补充函数调用:原代码仅定义了run_simulation但未实际调用,修复后添加run_simulation()确保仿真执行
  • 可调检查间隔:可根据需求修改yield self.env.timeout(0.1)的时长,平衡仿真精度与性能

内容的提问来源于stack exchange,提问作者Nizar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:36:43