You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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时将资源池的引用传递给它:

  1. 在Vessel代理中添加一个类型为ResourcePool<QuayCrane>的变量,命名为quayCranePoolRef;
  2. 在创建Vessel的代码中(比如主代理的生成器或触发逻辑里),将资源池赋值给这个变量:
    Vessel newVessel = add_vessel();
    newVessel.quayCranePoolRef = quayCranePool;
    
  3. 之后在Vessel代理内,就可以通过quayCranePoolRef.available()获取可用数量,再调整QCtoSeize,逻辑同方法1。

方法3:通过全局变量同步可用数量

如果不想直接依赖资源池引用,可以在主代理中维护一个全局变量来同步岸桥的可用数量:

  1. 在主代理中添加一个int类型的全局变量currentAvailableQCs,初始值设为岸桥资源池的总数量;
  2. 在岸桥资源池的On seize事件中添加代码:currentAvailableQCs--;;
  3. 在岸桥资源池的On release事件中添加代码:currentAvailableQCs++;;
  4. 在Vessel代理内直接访问这个全局变量,调整QCtoSeize:
    QCtoSeize = Math.min(QCtoSeize, currentAvailableQCs);
    

注意事项

  • 确保代码执行时机在抢占操作之前,避免出现请求量已经提交后才调整的情况;
  • AnyLogic的离散事件引擎是单线程执行的,无需担心多线程竞态问题,同一事件步内的操作会按顺序执行。

内容的提问来源于stack exchange,提问作者Scar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:25:03