AnyLogic供应链模型:司机随机开工与固定轮休约束配置求助
AnyLogic司机排班约束解决方案
针对你16司机、10卡车的供应链模型,要实现随机开工日、固定做五休二排班,同时输出最优方案,直接用自定义状态控制比依赖静态Schedule更灵活,以下是落地步骤:
一、给司机代理绑定排班属性
新建Driver代理类,添加3个属性:
int startDay:随机开工日(0=周一,1=周二…6=周日,可按你的时间规则调整)List<Integer> workDays:预计算的固定工作日索引列表boolean isWorkingToday:当日是否可用
二、模型启动时初始化所有司机排班
在Main的On startup事件中写入:
// 遍历资源池内所有司机 for(Driver d : driversPool.getAgents()){ // 随机生成开工日 d.startDay = uniformInt(0, 6); // 计算连续5天的工作日(循环7天周期) d.workDays = new ArrayList<>(); for(int i = 0; i < 5; i++){ d.workDays.add( (d.startDay + i) % 7 ); } }
三、每日更新司机可用性
添加一个每日触发的Event(命名dailyUpdateDriverStatus),首次触发设为模型启动时,重复间隔24小时,事件代码:
// 获取当天的星期索引(0=周一…6=周日,根据你的时间配置调整) int currentDay = (int)timeToDayOfWeek(getTime(), true); // 更新每个司机的可用状态并同步到资源池 for(Driver d : driversPool.getAgents()){ d.isWorkingToday = d.workDays.contains(currentDay); driversPool.setAgentAvailability(d, d.isWorkingToday); }
四、限制订单仅调用可用司机
- 用
Seize块时,在资源池的Filter条件中填写:agent.isWorkingToday - 用代码调用时,写:
Driver availableDriver = driversPool.getAvailableAgent(d -> d.isWorkingToday);
五、输出最优排班方案
通过参数化实验对比不同排班组合的效率:
- 创建
Parameter Variation实验,将随机种子作为变量(控制开工日的分布) - 定义核心指标:
averageOrderWaitTime(订单平均等待时间)、unfulfilledOrders(未完成订单数)、driverUtilization(司机利用率) - 实验结束后导出最优排班:
// 在实验的On stop事件中写入 FileWriter writer = new FileWriter("optimal_driver_schedule.csv"); writer.write("DriverID,StartDay(0=周一)\n"); for(int i = 0; i < driversPool.getAgents().size(); i++){ Driver d = driversPool.getAgents().get(i); writer.write((i+1) + "," + d.startDay + "\n"); } writer.close();
备选:动态生成Schedule元素
如果坚持用AnyLogic自带的Schedule,可在启动时为每个司机创建动态Schedule:
for(Driver d : driversPool.getAgents()){ Schedule driverSched = new Schedule(this); int startDay = uniformInt(0, 6); // 添加循环周期:工作5天,休息2天,7天为一个周期 driverSched.addPeriod(timeFromDayOfWeek(startDay, 0), timeFromDayOfWeek((startDay+5)%7, 0), 1.0, 7, TimeUnit.DAYS); driversPool.setAgentSchedule(d, driverSched); }
注意调整timeFromDayOfWeek的参数,匹配你的模型时间单位。
内容的提问来源于stack exchange,提问作者Christian Enyoghasi
相关产品推荐
相关产品推荐

