使用simpy.Resource模拟物流调度:4辆货车调度代码故障排查
修复后的货车调度实现及原代码问题分析
原代码核心问题
- 拼写与语法错误:存在
slef(应为self)、env.time(70)(应为env.timeout(70))这类低级错误,直接导致代码无法运行。 - 错误修改Resource内部逻辑:重写
_do_get和_do_put完全没必要,这会破坏SimPy资源的原生管理机制,反而引发异常。 - 资源初始化错误:主循环中每次创建新的
Car实例,相当于每次都新建4辆货车,完全不符合“复用4辆货车”的需求。 - 逻辑缺失:没有实现按1-4循环派车的逻辑,也没处理货车完成配送后的70分钟冷却等待,同时缺少货车ID的跟踪逻辑。
正确实现代码
import simpy class Truck: def __init__(self, env, truck_id): self.env = env self.id = truck_id self.available = True # 启动货车的状态管理进程 env.process(self._manage_status()) def _manage_status(self): while True: # 等待被调度 while self.available: yield self.env.timeout(1) # 执行配送任务70分钟 yield self.env.timeout(70) print(f"{self.env.now:.1f} - 货车{self.id} 完成配送") # 冷却70分钟后恢复可用 yield self.env.timeout(70) self.available = True print(f"{self.env.now:.1f} - 货车{self.id} 恢复可用") def main(env): # 初始化4辆货车 trucks = [Truck(env, i+1) for i in range(4)] truck_idx = 0 while True: # 每10分钟调度一辆,按1-4循环 yield env.timeout(10) current_truck = trucks[truck_idx] # 等待当前货车可用 while not current_truck.available: yield env.timeout(1) current_truck.available = False print(f"{env.now:.1f} - 调度货车{current_truck.id} 开始配送") # 更新循环索引 truck_idx = (truck_idx + 1) % 4 # 启动仿真 env = simpy.Environment() env.process(main(env)) env.run(until=300) # 运行300分钟,可按需调整
代码说明
- Truck类:每辆货车独立维护自身的
available状态,通过_manage_status进程处理配送、冷却的时间逻辑,状态变化自动触发。 - 主流程:初始化4辆货车后,每10分钟按循环顺序尝试调度货车,若目标货车忙则等待其可用,调度后标记为不可用,触发货车的配送-冷却流程。
- 逻辑匹配:完全符合“每10分钟调度一辆、按1-4循环、配送70分钟、冷却70分钟再复用”的需求。
内容的提问来源于stack exchange,提问作者yu liu
相关产品推荐
相关产品推荐

