提问者:小点点

在任何逻辑中,有没有一种方法可以将资源分配给正在使用的代理群体,而不是单个代理?


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

问题

如何确保查获正确数量的洗碗机

问题

使用一个函数来分配资源,洗碗机的数量并不总是正确的,因为使用和不使用水槽的时间不同。

实例

主要:

生成盘子并将其随机分配到出口块中的三个水槽之一。汇是一个代理群体。洗碗机是一个容量为10的资源池。

水槽:

菜进入队列,并使用等待块一次输入一个菜。清洗完盘子后,打开托盘,抓取下一个盘子。

详情:

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

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

numberOfDishWashers = 2 + numberOfSinksInUse;

为了在使用更多水槽时更改NumberofDishchiners,我创建了一个函数,定义要从dish\u垫圈资源池中获取的NumberofDishchiners。

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;

错误描述:

但是,取决于哪个接收器首先完成

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表概述了当前的逻辑。繁忙工作线程的数量与繁忙工作线程的数量不匹配,应基于活动接收器的数量。

我尝试过的方法

  1. 自定义函数,仅释放必要的工人以保持正确的总数。生成错误,因为资源已分配给“代理”或dish。当盘子被销毁时,它会附带未释放的资源

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


共1个答案

匿名用户

所以你这里的基本问题是,在水槽里,你会抓住一个洗碗机,然后盘子进入延迟(随着被抓住的洗碗机的数量),一旦超过延迟,它就会释放它抓住的洗碗机。。。但在这段时间里,情况可能已经发生了变化,你实际上想要为特定的水槽扣押不同数量的洗碗机。。。

你的选择是

>

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

    实现您自己的逻辑。

    我会选择选项2,因为选项1意味着您为AnyLogic创建的块开发了一个变通方法,最终您将无法按设计的方式使用这些块,不幸的是,这就是块化的问题

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

    下面是一个示例,其中包含一些示例代码-我没有测试它,但您将获得类似的结果