Simpy供应链模拟报Process与int实例不支持<比较错误如何解决
问题根源
你代码的错误出在warehouse_control函数的补货逻辑行:
yield env.timeout(env.process(supplier(env,warehouse_stock_level)))
SimPy中env.timeout()的入参要求是整数/浮点数类型的等待时长,但你传入了env.process()返回的Process对象,类型不匹配才触发了<运算符不支持的报错(SimPy内部做时间比较时出现类型冲突)。
修正方案
如果你想要等待供应商补货流程执行完毕再继续后续逻辑,不需要套env.timeout,直接yield对应的Process对象即可,将该行修改为:
yield env.process(supplier(env,warehouse_stock_level))
另外你的代码头部缺少依赖导入,需要补充:
import simpy import random import itertools
修正后可运行完整代码
import simpy import random import itertools SAFETY_STOCK_LEVEL = 1000 # SAFETY STOCK LEVEL IN WAREHOUSE CUSTOMER_DEMAND = [200,400] # DEMAND FROM RETAILER THRESHOLD = 60 # in % PRODUCTION_TIME = 5 # DAYS TO PRODUCE GOOD BY SUPPLIER RETAIL_ORDER_TIME = [0,2] # FREQUENCY OF RETAIL ORDER PLACED IN DAYS SIMULATION_TIME = 100 # TIEM TO RUN THE SIMULATION PACK_SEND_TIME = 3 # TIME TO PACK AND SEND TO RETAILER FROM WAREHOUSE def warehouse_packing_activity(env,order_number,goods_demand,warehouse_activity,warehouse_stock_level): """ DO THE PACKING""" print("Order number ", order_number," received with demand ", goods_demand, " at ", env.now, sep="") with warehouse_activity.request() as req: start = env.now yield req yield warehouse_stock_level.get(goods_demand) yield env.timeout(PACK_SEND_TIME) print("Order number ", order_number, "delivered at ", env.now - start) def warehouse_control(env,warehouse_stock_level): while True: print("CHECK", warehouse_stock_level.level) print(warehouse_stock_level.level / warehouse_stock_level.capacity * 100) if ((warehouse_stock_level.level / warehouse_stock_level.capacity) * 100) < THRESHOLD: print("Placing Order to Supplier at ", env.now) yield env.process(supplier(env,warehouse_stock_level)) yield env.timeout(3) #Checking every 3 unit days def supplier(env,warehouse_stock_level): """Supply goods to warehouse when requested""" yield env.timeout(PRODUCTION_TIME) amount = warehouse_stock_level.capacity - warehouse_stock_level.level print("Order quantity is ", amount) yield warehouse_stock_level.put(amount) print("Replenishment order fullfilled at ", env.now) def retail_order_generator(env,warehouse_activity,warehouse_stock_level): """GENERATE ORDER""" for i in itertools.count(): goods_demand = random.randint(*CUSTOMER_DEMAND) env.process(warehouse_packing_activity(env,i,goods_demand,warehouse_activity,warehouse_stock_level)) yield env.timeout(random.randint(*RETAIL_ORDER_TIME)) env = simpy.Environment() warehouse_activity = simpy.Resource(env,1) warehouse_stock_level = simpy.Container(env,SAFETY_STOCK_LEVEL,SAFETY_STOCK_LEVEL) env.process(retail_order_generator(env,warehouse_activity,warehouse_stock_level)) env.process(warehouse_control(env,warehouse_stock_level)) env.run(until=SIMULATION_TIME)
内容的提问来源于stack exchange,提问作者Shubhankar Dhavale
相关产品推荐
相关产品推荐

