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

使用simpy.Resource模拟物流调度:4辆货车调度代码故障排查

修复后的货车调度实现及原代码问题分析

原代码核心问题

  1. 拼写与语法错误:存在slef(应为self)、env.time(70)(应为env.timeout(70))这类低级错误,直接导致代码无法运行。
  2. 错误修改Resource内部逻辑:重写_do_get和_do_put完全没必要,这会破坏SimPy资源的原生管理机制,反而引发异常。
  3. 资源初始化错误:主循环中每次创建新的Car实例,相当于每次都新建4辆货车,完全不符合“复用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:57:19