Anylogic - 创建资源并添加到 ResourcePool

Anylogic - create Resources and add to ResourcePool

我很难找到使用 Resources 和 resourcePools 所需的文档 - 我找不到“资源 API 文档”。

我想以编程方式创建(自定义类型的)静态资源,然后将这些资源添加到资源池中。创建资源时,我希望能够在将它们添加到资源池之前指定它们的 属性 值。在我看来,代码看起来像这样:

Room myRoom;
myRoom = new Room("redRoom", 20);
addTo_myResourcePool(myRoom);

myRoom = new Room("greenRoom", 10);
addTo_myResourcePool(myRoom);

有谁知道有没有办法达到这个目的?

这在 AnyLogic 中有点盲点。只能间接完成:

  1. 使用您的代理类型创建一个空的代理群体
  2. 告诉资源池使用该代理类型
  3. 根据需要设置资源池容量。该池将为您在该人口中创建代理(如果容量大于当前资源数量)

如果要手动创建资源,必须调用myResourcePool.set_Capacity(myResourcePool.getCapacity()+1)

销毁 1 个资源反之亦然。

此外,请确保“在容量减少时销毁资源”,以便从人口中销毁代理人

我为此使用了一个技巧,有时会奏效,但我不会将其概括为最终解决方案...我只在我有几个不同的单位特征时才这样做,这似乎是你的情况.

step 1: create a population of resourcePools...每个资源池都会对应一种agent特性,所有resourcePools使用相同的资源(agent)类型

第2步:在资源池的新单元中,您将使用资源池人口的索引来生成具有特定特征的单元...然后您可以像resourcePool.get( i).set_capacity(whatever) 以生成具有您想要的确切特征的资源单元

第 3 步:当您占用资源时,您将使用备选方案...资源池人口中的每个资源池都将是备选方案中的 1 个选项...您将需要创建一个返回 ResourcePool 的函数[][]

第 4 步:您将使用条件 select 单位根据其特性(自定义资源 selection)

一个选择是创建一个资源代理的群体,我假设它是基于您的代码的房间类型。

然后你有一个函数,可以将新代理添加到总体中,然后 return 将其添加到调用方。

而现在你只需要将这个添加到资源池对象new resource unit中的调用

不要更改“将单位添加到”选项,因为我们已经在函数中这样做了。

我在一个小模型中测试了这个,在执行期间使用两个按钮来增加和减少容量

resourcePool.set_capacity(max(0, resourcePool.size() + 1));

remove_myResource(myResource.get(myResource.size()-1));
resourcePool.set_capacity(max(0, myResource.size()));

这里有几个相关点。

  • AnyLogic 的设计使您只能通过更改资源池的容量来更改资源池中的代理。这可以通过池的 set_capacity 函数 直接 完成(如果池的容量设置为“直接”定义),但更常见的是 间接完成 通过将池的容量链接到时间表(以表示轮班模式或容量随时间的任何其他预定义变化)。

    资源池在容量减少时默认保留代理(即它们存在但'unavailable'),但您可以将其设置为删除它们。您想要什么取决于资源和任何特定资源 attributes/state 代表什么。

  • 如果您需要 address/access 资源池中的代理独立于它们作为 seized/released 资源的使用,您可以让池将它们存储在自定义群体中(而不是通过“将单位添加到”设置将它们与所有其他未在自定义人口中创建的代理一起放入默认人口中。然后,您可以在需要时显式访问该种群(例如,循环遍历它)。否则这方面就没有必要了。

  • 如果您的资源池是带有参数的自定义代理(或其他需要以特定方式初始化的状态),标准方法是让 direct/indirect 容量增加创建单元(使用默认参数值),然后在“在新单元上”操作中进行任何后续初始化(您可以通过 agent 关键字访问新创建的单元)。

    可以 或者通过“新资源单元”的动态表达式来实现(如 Jaco 的回答),但这并没有给你带来任何特别的好处(尽管它同样有效的)。是的,它有点多 'object-oriented',但是 AnyLogic 在以适当的 OO 方式做事时遇到了很多障碍——正如你所说,更多 'obvious' OO 的方法就是有方法在 add/remove 代理的资源池上。基本上,创建代理的块(如资源池或源块)的标准 'design pattern' 是让它使用默认信息创建它们,然后在适当的操作中对其进行自定义。

    您也可以/改为使用资源池代理的“启动时”操作,但通常您会使用来自包含进程的代理的信息来确定新资源代理应具有的状态,即使“启动时”操作用处不大。

    最后(!),如果你有一组不变的资源池代理并且更容易将它们一起初始化(例如,因为所有这些代理都有一些数据库输入数据因此可以循环一次) ,然后只需在包含资源池的代理的“启动时”操作中执行此操作(在资源池初始化并创建默认状态代理后运行)。 在自定义人群中需要它们,因此您可以只循环访问那些代理。但您的问题似乎暗示您担心 动态 添加资源代理。

但是,正如我的其他一些评论所指出的,资源池的工作方式有多种 subtleties/restrictions(实际上是基于它们目前被设计为一个池,其中每个人的明确身份不完全'controllable') 这意味着您实际需要的可能不止于此。

举几个例子:

  • 如果您希望您的资源是明确的个人员工,并且可以跨班次跟踪信息(例如,他们的状态会发生变化以反映他们的经验或他们执行的任务的历史记录),那么问题就复杂了您无法控制 哪些 资源(如果您没有在容量减少时删除它们)'come back' 当容量发生变化时,因此您可能需要更复杂的解决方法,例如为每个不同的班次分配单独的资源池,并从包括所有此类池的资源集中获取 - 只有其中一个(活动班次)在任何给定时间将具有非零容量,除非班次重叠。

  • 如果容量减少(表示班次结束),您无法控制/确定选择哪个 资源代理下班。此外,还有一些关于资源代理的问题,它们在实际 'leave' 之前仍然活跃地完成任务(假设换班结束没有设置为抢占)——因为它们在完成之前仍然存在,如果你增加在他们工作时再次使用容量 AnyLogic 不会创建新的资源代理(它只会将此现有代理添加回池中的 'active' 代理)。所以这让其他事情变得更难......