AnyLogic中实现货架随机选3个Box并批量调度AGV的问题
AnyLogic AGV随机选取3个Box解决方案
一、AGV依次前往不同货架取3个随机Box
筛选随机Box并记录位置
在AGV任务触发时(比如AGV空闲时的触发代码),用randomSample()函数从货架的Agent集合里随机选3个目标Box。同时给Box添加Location类型参数storageLocation,在Box放入货架时通过rack.getLocation(box)赋值,固定其货架位置:List<Box> availableBoxes = rack.getAgents().stream().filter(b -> !b.isPicked).collect(Collectors.toList()); if(availableBoxes.size() >=3){ List<Box> selectedBoxes = randomSample(availableBoxes, 3); selectedBoxes.forEach(b -> b.isPicked = true); }AGV顺序执行取货任务
在AGV的任务序列中,循环遍历selectedBoxes列表,依次添加rackPick任务,每个任务指定对应Box的storageLocation和目标Agent。取完第三个Box后,直接添加moveTo任务前往卸货区,完成卸货操作。
二、同一货架位置批量取3个随机Box(解决rackPick无法拾取批量Agent问题)
- 调整批量时机:原问题出在提前批量Agent导致其脱离货架,需先取货再批量。
- 具体步骤:
- 用
randomSample()从目标货架位置的Agent中选3个(若该位置数量不足,可随机选多个位置凑数)。 - AGV依次执行
rackPick任务取出这3个Box,将它们送入临时Hold块。 - 设置Hold块的批量触发条件为
agentCount() == 3,批量完成后触发AGV将这批Box运往卸货区。
- 用
关键注意事项
- 给Box添加
isPicked布尔标记,避免重复选取已被取走的Agent。 - 提前判断货架剩余Agent数量,若不足3个可调整取货数量或跳过任务,防止
randomSample()抛出异常。 - AGV任务序列中要同步更新Box的状态,确保后续逻辑不会冲突。
内容的提问来源于stack exchange,提问作者Moritz
相关产品推荐
相关产品推荐

