基于面向对象方法的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
相关产品推荐
相关产品推荐

