AnyLogic 中有没有一种方法可以将资源分配给正在使用的大量代理而不是单个代理?

Is there a way in AnyLogic to assign resources to a population of agents in use rather than individual agents?

我有一个餐厅洗碗机的简单例子来说明我遇到的问题。

问题

根据使用的代理数量,如何确保扣押和释放正确数量的洗碗机?

问题

使用分配资源的功能,由于使用和不使用水槽的时间不同,洗碗机的数量并不总是正确的。

例子

主线:

生成盘子并将它们随机分配到出口块中的三个水槽之一。 Sinks 是一群代理人。 dish_washers 是一个容量为 10 的 ResourcePool。

接收器:

菜肴进入队列并使用保留块一次进入一个队列。 一旦盘子被清洗干净,货舱就会畅通无阻地抓取下一个盘子。

详情:

我在餐厅有一个 dish_washers 的共享资源池。 餐厅有 3 个水槽。 生成菜肴并随机分配给每个水槽。

如果只使用 1 个水槽,则需要两个洗碗机。 但是,如果使用 2 个或更多水槽,则洗碗机的数量变为:

numberOfDishWashers = 2 + numberOfSinksInUse;

为了在使用更多接收器时更改 numberOfDishWashers,我创建了一个函数来定义要从 dish_washer 资源池中获取的 numberOfDishWashers。

int numberOfSinksUsed = 0;
int numberOfWorkersToSeize = 0;
int numberOfWorkersAlreadySeized = 0;
int numberOfWorkersToAssign = 0;

ResourcePool[][] dish_washers;

for(Sink curSink : main.sinks){
    if(curSink.queue.size() > 0){
        numberOfSinksUsed += 1;
    }
}

numberOfWorkersAlreadySeized = main.dish_washers.busy();
numberOfWorkersToSeize = 2 + numberOfSinksUsed;
numberOfWorkersToAssign = numberOfWorkersToSeize - numberOfWorkersAlreadySeized;

dish_washers = new ResourcePool[1][numberOfWorkersToAssign];

for(int i = 0; i < numberOfWorkersToAssign; i++){
    dish_washers[0][i] = main.dish_washers;
}

return dish_washers;

错误说明:

但是,根据哪个水槽先完成并释放,分配的洗碗机数量将不正确。接收器进程末尾的 traceln 说明了这一点,其中在出口块上捕获的 numberOfDishWashers 与“2 + numberOfSinksInUse”不匹配。 有一个例子,使用了 3 个水槽,但只抓住了 4 个工人。

Exit, Sink: C Workers Currently Seized: 4
Sinks in Use: 2
Exit, Sink: C Workers Currently Seized: 4
Sinks in Use: 3
Exit, Sink: C Workers Currently Seized: 5
Sinks in Use: 2
Exit, Sink: C Workers Currently Seized: 4
Sinks in Use: 2

另一种看待问题的方式,Excel table 概述了当前的逻辑。 繁忙的工作人员数量与繁忙工作人员的数量不匹配应该基于活跃的接收器数量。

我试过的方法

  1. 自定义函数只释放必要的工人以保持正确的总数。 生成错误,因为资源已分配给 'agent' 或盘子。 当盘子被摧毁时,它附有未释放的资源。
  2. 通过“enter”、“seize”和“exit”块传递“sink”代理以分配 资源到代理“下沉”而不是生成的盘子。 关于“dish”代理在“sink”代理的流程图中的错误,而 “下沉”特工正在抓捕工人。

如何确保始终抓取正确数量的洗碗机?

所以你的根本问题是在水槽里你会抓住一个洗碗机,然后盘子进入延迟(随着洗碗机数量的增加),一旦结束延迟它就会释放它抓住的所有洗碗机...但在延迟期间,情况可能会发生变化,您实际上想为该特定水槽占用不同数量的洗碗机...

你的选择是

  1. 从延迟中取出碗碟,释放正确数量的洗碗机,return返回延迟并延迟剩余时间...

  2. 实现你自己的逻辑。

我会选择选项 2,因为选项 1 意味着您为 AnyLogic 创建的块开发了一个解决方法,您最终将不会按照设计的方式使用这些块,不幸的是 blockification

所以我会在水槽内有一个集合,显示当前分配给该水槽的洗碗机数量。然后,每当新盘子进入水槽时,我们都会重新计算要分配的洗碗机数量(也许在每个水槽?),然后进行正确的分配。

这是一个带有示例代码的示例 - 我没有测试它,但你会有类似的东西