Anylogic 中 rack pick element 如何实现 agents 跨 pallet rack 直接移动
无中转节点的两个托盘货架间直传的Anylogic实现方案
RackPick元素原生UI层的目的地下拉列表确实不会把同模型内的其他PalletRack列为可选项,这是UI层的筛选逻辑限制,不是流程引擎本身不支持跨货架流转。在完全不添加Point、RectangularNode等非货架类中转节点的前提下,有两种可落地的实现方式:
方案1:自定义代码绕过RackPick的目的地校验
- 关闭RackPick元素自带的“Travel to configured destination”流程开关,把拣选完成后的转运逻辑全部写到RackPick的
On exit代码块中,直接给持有货物的搬运agent指定目标货架的空闲货位作为目的地,不触发元素自带的目的地选择流程 - 示例代码片段:
// 替换为模型中实际配置的目标货架对象 PalletRack targetPalletRack = rackArea_2; // 获取当前拣选完成后承载货物的搬运AGV/叉车 MaterialHandlingAgent carrier = agent.getCarrier(); // 直接计算目标货架上匹配货物尺寸的空闲货位,作为agent的最终目的地 Location targetStoragePos = targetPalletRack.getFreeLocation( agent.getSize() ); carrier.setDestination(targetStoragePos);
- 该方式完全跳过RackPick内置的目的地白名单校验,只要两个货架之间的通行路网是连通的,Anylogic的路径计算引擎会自动生成两个货位之间的行驶路径,不需要在路径上插入任何额外中转节点。
方案2:用映射表适配流程的目的地识别规则
- 流程引擎判断目的地是否合法的核心是看对象是否实现了Node接口,
PalletRack本身已经实现了该接口,UI层的下拉筛选只是做了展示过滤,本质上是合法的目的地对象 - 可以在模型初始化时建立一个存储位置映射表,把每个货架对应的货位对象提前存入:
HashMap<PalletRack, Location> rackLocationMap = new HashMap<>(); // 初始化时把货架对象和对应的默认存储位置绑定 rackLocationMap.put(rackArea_1, rackArea_1.getLocation()); rackLocationMap.put(rackArea_2, rackArea_2.getLocation());
- 在流程里给RackPick配置动态目的地时,直接从映射表中取出目标货架对应的位置对象赋值,不依赖UI下拉框的静态配置,就可以实现货物从当前拣选货架直接前往目标货架,不需要任何中间中转节点。
实现时的注意事项
- 必须关闭RackPick原生的自动前往配置目的地的逻辑,否则元素会因为找不到UI层配置的合法目的地抛出运行时报错
- 确保两个货架所在的通行网络没有拓扑断点,Anylogic的搬运agent路径计算基于全局路网连通性,不要求路径上必须逐点串联中转节点
- 如果目标货架没有足够空闲货位,可以在代码中补充货位等待逻辑,不需要额外加暂存点节点
内容的提问来源于stack exchange,提问作者Mohammad Hasan N.
相关产品推荐
相关产品推荐

