Simpy订单履行模拟问题:实现购物车全清空逻辑
SimPy仿真模型问题解决方案
问题1:用布尔变量结合get()触发购物车清空逻辑
- 为每个订单维护两个核心变量:
- 一个
SimPy.Container实例作为购物车,用来存储商品数量 - 一个布尔变量(比如
ready_to_process),初始设为False
- 一个
- 在商品进入购物车的进程中,每次添加商品后检查当前数量是否达到订单总量的90%:
# 假设order_total是该订单的总商品数 if cart.level >= order_total * 0.9 and not ready_to_process: ready_to_process = True # 触发购物车处理进程 env.process(process_cart(env, cart, order_total)) - 在处理进程中,利用
get()方法循环取出商品,直到购物车为空,同时重置布尔变量:
核心逻辑:仅当def process_cart(env, cart, order_total): global ready_to_process while cart.level > 0: # 模拟单件商品处理耗时 yield env.timeout(1) yield cart.get(1) # 处理完成后重置触发标记 ready_to_process = Falseready_to_process变为True时启动处理,处理过程中持续调用get()直到购物车清空,避免提前终止处理流程。
问题2:确保模型运行至所有购物车清空
- 为每个订单的处理进程创建
SimPy.Event实例,用来标记该订单购物车已清空 - 仿真初始化时,收集所有订单的处理完成事件:
completion_events = [] order_ids = df['order_id'].unique() for order_id in order_ids: order_total = df[df['order_id'] == order_id]['order_quantity'].sum() # 初始化对应订单的购物车 cart = simpy.Container(env, init=0, capacity=order_total) # 启动商品扫描及入车进程 env.process(scan_and_deliver(env, df, order_id, cart, order_total)) # 创建并收集完成事件 complete_event = env.event() completion_events.append(complete_event) # 启动处理进程并绑定完成事件 env.process(process_cart(env, cart, order_total, complete_event)) - 修改
process_cart函数,在购物车清空后触发完成事件:def process_cart(env, cart, order_total, complete_event): global ready_to_process while cart.level > 0: yield env.timeout(1) yield cart.get(1) ready_to_process = False # 触发完成事件,标记该订单处理完毕 complete_event.succeed() - 让仿真环境等待所有完成事件结束:
此操作会让仿真持续运行,直到所有订单的购物车都被完全清空,不会提前终止。yield env.all_of(completion_events)
额外注意事项
- 箱子扫描逻辑:用集合记录已扫描的
box_id,确保每个箱子仅被扫描一次 - 商品入车校验:严格对应
order_id,避免不同订单的商品混放至同一购物车 - 多操作员场景:合理分配SimPy资源,避免处理进程被资源阻塞导致无法完成清空
内容的提问来源于stack exchange,提问作者Erin Walter
相关产品推荐
相关产品推荐

