AnyLogic多船舶卸箱仿真问题:AGV调度与空指针报错求助
AnyLogic港口仿真多船并行服务问题解决方案
一、先修复SelectOutput的空指针异常
你的条件语句出现空指针,是因为未提前校验对象是否为空,即使之前无空值,仿真运行中也可能出现临时未赋值的情况。修改条件为:
agent != null && agent.vessel != null && agent.vessel.berth != null && agent.vessel.berth.CargoPoint == CargoPoints.get(0)
其他3个泊位的分支条件同理,仅需把CargoPoints.get(0)替换为get(1)、get(2)、get(3)即可。
二、解决单船独占AGV的核心问题
方案1:通过SelectOutput分流实现泊位级并行调度
- 确保Container与船舶/泊位的关联正确
- 在Split Block的「On create agent」事件中,添加代码:
newAgent.vessel = agent;(此处agent是当前生成集装箱的船舶),保证集装箱能关联到所属船舶。 - 确认在集装箱生成后,已执行
agent.setNetworkNode(agent.vessel.berth.CargoPoint);,确保CargoPoint参数正确赋值。
- 在Split Block的「On create agent」事件中,添加代码:
- 配置SelectOutput分支
- 添加SelectOutput Block,设置4个输出分支(对应4个泊位的CargoPoint)。
- 每个分支的条件按上述修复后的写法配置,分别对应CargoPoints集合中的4个节点。
- 每个分支后接独立的Seize Block(可共享同一个AGV ResourcePool),不同泊位的集装箱会进入各自的等待队列,AGV会同时处理多个队列的请求,避免单船独占。
方案2:无需分流,直接修改Seize Block的排队策略
如果不想拆分流程,可直接调整Seize的调度逻辑:
- 打开Seize Block的设置面板,切换到「Queueing」标签页。
- 将排队策略从默认的「FIFO」改为「By Attribute」,选择属性为
agent.vessel(即集装箱所属的船舶)。 - 策略类型选择「Round Robin」(轮询),系统会轮流处理不同船舶的集装箱,实现多船并行服务。
- 同时确保AGV ResourcePool的数量足够(建议≥4,对应4个泊位),保证有足够资源同时作业。
三、额外校验点
- 检查Berth agent的
CargoPoint参数,确认每个泊位都已正确绑定对应的CargoPoint1~4,无空值。 - 运行仿真时,可添加临时的
trace(agent.vessel.berth.CargoPoint)代码,在集装箱生成时打印参数,验证关联是否正确。
内容的提问来源于stack exchange,提问作者Scar
相关产品推荐
相关产品推荐

