AnyLogic中如何访问资源变量及船舶运输仿真问题求助
船舶货物运输模拟解决方案
一、在Service中访问Dock资源的容量并扣除物资
步骤1:给Dock代理添加容量变量
打开你创建的Dock代理类(对应Resource Pool的代理类型),添加以下变量(根据需求调整类型,比如int或double):
currentCapacity:当前可用容量(或当前存储量,依业务逻辑定义)triggerThreshold:触发Deliverer生成的阈值
步骤2:在Service的"On Seize"事件中记录分配的Dock
在Service块的属性面板找到On seize事件,添加代码(替换你的代理类名和Resource Pool名称):
// 获取分配给当前船舶的Dock资源 Dock assignedDock = (Dock) getAssignedResources(this, resourcePool_docks).get(0); // 将Dock实例存入当前Ship代理的变量(需先给Ship代理添加Dock类型变量,比如命名为`assignedDock`) ((Ship)unit).assignedDock = assignedDock;
步骤3:在Service的"On Finish"事件中扣除容量
在Service的On finish事件中,完成物资卸载后的容量扣除:
Ship currentShip = (Ship)unit; // 根据业务逻辑调整加减方向,这里假设是从Dock可用容量中扣除物资量 currentShip.assignedDock.currentCapacity -= currentShip.cargoAmount; // 同步检查是否需要生成Deliverer checkDelivererTrigger(currentShip.assignedDock);
二、当Dock容量达标时触发Deliverer生成
步骤1:配置Deliverer源为手动触发
将生成Deliverer的Source块的Arrival type设置为Manual,关闭随机生成逻辑,并给该Source命名(比如source_deliverers)。
步骤2:实现阈值检查与inject调用
方法一:全局检查方法(主环境中定义)
在主环境的Functions里添加一个全局方法:
public void checkDelivererTrigger(Dock dock) { // 根据你的触发条件调整判断逻辑,比如当可用容量低于阈值时触发 if (dock.currentCapacity <= dock.triggerThreshold) { // 调用Source的inject()生成Deliverer source_deliverers.inject(); // 若需生成多个,可循环调用inject() // for(int i=0; i<N; i++) source_deliverers.inject(); } }
方法二:Dock变量的"On Change"事件触发
在Dock代理类的currentCapacity变量属性中,找到On change事件,添加代码:
// 当容量变化时检查阈值 if (this.currentCapacity <= this.triggerThreshold) { // 通过getMain()获取主环境对象,调用Source的inject() getMain().source_deliverers.inject(); }
新手注意事项
- 确保代理类的变量为public,或添加getter/setter方法(若设为private),否则无法跨代理访问。
- Service块的Resource type需选择你的Dock资源池,且Allocation type设为Seize and hold,确保船舶占用Dock直到卸载完成。
- 若业务逻辑中Dock的"容量"是指存储上限(卸载是往Dock中添加物资),只需调整
currentCapacity的加减方向即可。
内容的提问来源于stack exchange,提问作者Aidan Graef
相关产品推荐
相关产品推荐

