如何在AnyLogic的vessel代理内获取QuayCrane资源池可用单元数?
在AnyLogic中动态调整Vessel代理抢占的岸桥数量
这里有三种可行的方法来获取岸桥资源池的可用数量,并调整Vessel代理的QCtoSeize变量:
方法1:直接引用资源池的可用量
AnyLogic的ResourcePool类提供了available()方法,可直接返回当前可用的资源数量。只要岸桥资源池(假设名为quayCranePool)在Vessel代理的可见范围内(比如是主代理中的全局资源池),就可以在Vessel代理内直接调用该方法:
在抢占操作执行前的代码段中(比如服务块的Before seize事件,或Vessel到达服务块的On enter事件)添加以下代码:
// 获取当前可用岸桥数量 int availableQCs = quayCranePool.available(); // 取请求量和可用量的最小值,确保不会请求超过可用的数量 QCtoSeize = Math.min(QCtoSeize, availableQCs);
方法2:传递资源池引用给Vessel代理
如果Vessel代理无法直接访问岸桥资源池(比如资源池在嵌套代理中),可以在创建Vessel时将资源池的引用传递给它:
- 在Vessel代理中添加一个类型为
ResourcePool<QuayCrane>的变量,命名为quayCranePoolRef; - 在创建Vessel的代码中(比如主代理的生成器或触发逻辑里),将资源池赋值给这个变量:
Vessel newVessel = add_vessel(); newVessel.quayCranePoolRef = quayCranePool; - 之后在Vessel代理内,就可以通过
quayCranePoolRef.available()获取可用数量,再调整QCtoSeize,逻辑同方法1。
方法3:通过全局变量同步可用数量
如果不想直接依赖资源池引用,可以在主代理中维护一个全局变量来同步岸桥的可用数量:
- 在主代理中添加一个
int类型的全局变量currentAvailableQCs,初始值设为岸桥资源池的总数量; - 在岸桥资源池的On seize事件中添加代码:
currentAvailableQCs--;; - 在岸桥资源池的On release事件中添加代码:
currentAvailableQCs++;; - 在Vessel代理内直接访问这个全局变量,调整
QCtoSeize:QCtoSeize = Math.min(QCtoSeize, currentAvailableQCs);
注意事项
- 确保代码执行时机在抢占操作之前,避免出现请求量已经提交后才调整的情况;
- AnyLogic的离散事件引擎是单线程执行的,无需担心多线程竞态问题,同一事件步内的操作会按顺序执行。
内容的提问来源于stack exchange,提问作者Scar
相关产品推荐
相关产品推荐

