当前位置: 首页 > 知识库问答 >
问题:

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

东门仲卿
2023-03-14

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

问题

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

问题

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

实例

主要:

生成盘子并将其随机分配到出口块中的三个水槽之一。汇是一个代理群体。洗碗机是一个容量为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个答案

慎望
2023-03-14

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

你的选择是

>

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

    实现您自己的逻辑

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

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

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

  •  类似资料:
    • 问题内容: 我非常喜欢Visual Studio在完成已编写的代码和所引用的ALSO代码(各种库/程序集)时为您提供注释文档/参数名称的方式。 在完成代码或将方法悬停在方法上时,是否有一种简单的方法可以在Eclipse中获取内联javadoc /参数名称?通过插件?通过某些设置?使用大量的库(就像在Java中经常发生的那样)然后当您将其放在源jar中时,必须去网站或本地javadoc位置查找信息,

    • 我不确定我的问题是否足够清楚,所以这里有解释:我正在使用opengl开发体素引擎,它工作正常,但我想通过一些优化来改进它。我开始对立方体的顶点使用VBO,我获得了一些fps,所以这很好。但是现在我想用立方体的颜色做同样的事情,我没有找到一个让我满意的答案,因为我需要一些细节: > 我只使用3个浮点数作为颜色,所以即使它工作glVertex AttribPointer()似乎也不是一个好方法,因为如

    • 但我对它并不完全满意,主要有两个原因 我“滥用”了函数。在Stream API中,每个函数都有其明确、明确的用途:被认为是计算最大值,被认为是根据条件进行筛选,被认为是生成增量累加的值,等等。 这样做会阻止我使用Streams强大的机制:如果我想将搜索限制在前两个结果上怎么办? 这里我使用了,因为(据我所知)它是唯一一个允许比较两个值的函数,而这些值可以在某种程度上导致类似于“当前值”和“下一个值

    • 问题内容: 假设我们有这个流 我想在地图中保存几对相邻的字符串,其中第一个以“ err”开头。 我想到的就是这样 但是我对它并不完全满意,主要有两个原因 我在“滥用” 功能。在Stream API中,每个函数都有其明确的定义明确的目的:应该计算最大值,应该根据条件进行过滤,应该产生递增的累加值,依此类推。 这样做会使我无法使用Streams强大的机制:如果我想将搜索范围限制在前两个结果中,该怎么办

    • 我怎么能释放特定的资源在Any逻辑?在我的过程中,我有一个抓住块,它抓住3个替代资源(根据它们的可用性)。接近尾声时,我需要释放释放块中的一个潜在资源,根据被抓住的资源。我必须做什么才能知道哪个资源被扣押了,我如何释放它?我不能使用服务块,因为进程受到限制。 谢谢你的帮助!

    • Go的范围可以在地图和切片上迭代,但我想知道是否有一种方法可以在一系列数字上迭代,比如: 或者有没有一种方法来表示Go中的整数范围,就像Ruby对类范围所做的那样?