Anylogic集装箱码头Vessel静态泊位分配求助:实现方案指导
集装箱码头泊位指派与卸货流程解决方案
一、资源池与泊位关联配置
- 把BDrop1至BDrop4这4个泊位代理直接作为资源池的资源,资源池容量设为4,确保每个泊位资源同一时间仅能被一艘船占用。
- 给每个泊位代理添加唯一标识变量(比如
String berthId),分别赋值为"BDrop1""BDrop2"等,后续用来匹配Vessel的Home Location。
二、基于Home Location的泊位抢占逻辑
替换Resource Seize模块的默认任意抢占逻辑,改为精准匹配目标泊位:
- 在Vessel流程中添加「Execute Code」模块,写入以下代码实现定向抢占:
注意替换代码中的// 从资源池筛选与当前船Home Location匹配的泊位 Resource targetBerth = resourcePool.getResources().stream() .filter(r -> ((Berth)r).berthId.equals(this.homeLocation)) .findFirst() .orElse(null); if(targetBerth != null) { resourcePool.seize(this, targetBerth); // 抢占指定泊位 } else { traceln("泊位" + this.homeLocation + "已被占用,进入等待"); // 可在此添加等待队列逻辑,比如将船加入等待集合,泊位释放后重新触发抢占 }resourcePool为你实际的资源池名称,Berth为泊位代理类名,homeLocation为Vessel中存储目标泊位ID的变量。 - 抢占成功后,在「MoveTo」模块的目标位置选择「代码」方式,写入:
确保泊位代理已关联图形元素的位置,或内置((Berth)resourcePool.getSeizedResource(this)).getLocation()Location类型变量存储位置信息。
三、卸货流程与资源释放
- 船抵达泊位后,添加「Delay」模块模拟卸货,时长可根据集装箱数量等参数动态设置。
- 卸货完成后,添加「Resource Release」模块,释放当前占用的泊位资源,供后续船只使用。
四、常见问题排查
- 抢占失败:检查Vessel的
homeLocation与泊位的berthId字符串是否完全匹配(注意大小写、无多余空格)。 - 移动目标无效:确认泊位代理的图形元素位置已正确配置,或在泊位代理中添加
Location变量并赋值。 - 多船冲突:确保资源池的「资源使用模式」设为「独占」,避免同一泊位被多船同时占用。
五、简化替代方案(无需Resource Seize)
如果不需要复杂的资源队列管理,可直接通过泊位状态变量实现:
- 在泊位代理中添加
boolean isOccupied变量,初始值为false。 - Vessel流程中先判断目标泊位状态:
其中Berth targetBerth = findFirst(main.berthCollection, b -> b.berthId.equals(this.homeLocation)); if(!targetBerth.isOccupied) { targetBerth.isOccupied = true; moveTo(targetBerth.getLocation()); // 执行卸货Delay模块 targetBerth.isOccupied = false; } else { // 等待逻辑,比如进入循环等待或加入等待队列 }main.berthCollection是主代理中存储所有泊位的集合(需提前将BDrop1至BDrop4加入该集合)。
内容的提问来源于stack exchange,提问作者Scar
相关产品推荐
相关产品推荐

