我有一个餐馆洗碗机的简单例子来说明我遇到的问题。
问题
如何确保查获正确数量的洗碗机
问题
使用一个函数来分配资源,洗碗机的数量并不总是正确的,因为使用和不使用水槽的时间不同。
实例
主要:
生成盘子并将其随机分配到出口块中的三个水槽之一。汇是一个代理群体。洗碗机是一个容量为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表概述了当前的逻辑。繁忙工作线程的数量与繁忙工作线程的数量不匹配,应基于活动接收器的数量。
我尝试过的方法
如何确保始终抓取正确数量的洗碗机?
所以你这里的基本问题是,在水槽里,你会抓住一个洗碗机,然后盘子进入延迟(随着被抓住的洗碗机的数量),一旦超过延迟,它就会释放它抓住的洗碗机。。。但在这段时间里,情况可能已经发生了变化,你实际上想要为特定的水槽扣押不同数量的洗碗机。。。
你的选择是
>
从延迟中取出碟子,释放正确数量的洗碗机,返回延迟并延迟剩余时间。。。
实现您自己的逻辑。
我会选择选项2,因为选项1意味着您为AnyLogic创建的块开发了一个变通方法,最终您将无法按设计的方式使用这些块,不幸的是,这就是块化的问题
所以我在水槽里有一个集合,显示当前分配给这个水槽的洗碗机数量。然后每当一个新盘子进入水槽,我们都会重新计算要分配的洗碗机数量(也许在每个水槽?),然后进行正确的分配。
下面是一个示例,其中包含一些示例代码-我没有测试它,但您将获得类似的结果