服务块使用资源池工作者减少延迟时间
Service block reduce delay time using resource pool workers
我有一个资源池和一个服务块。资源池中的算子数量为5,与服务块挂钩。我想以一种方式设置服务,即在服务上工作的工人越多,延迟时间就越短。 (例如:如果 1 名工人工作,则延迟时间为 10 分钟 - 如果 2 名工人工作,则延迟时间为 5 分钟。 - 如果 3 名工人工作,则延迟时间为 3.33 分钟)。我希望最多 5 名操作员根据他们的可用性在服务区同时工作。
Service Block and Resource Pool
我怎样才能做到这一点?
所以您正在尝试使用您的服务块做两件事:
- 占用动态数量的单元(在最简单的情况下,占用所有可用单元)。
- 延迟时间取决于占用的单位数量(最简单的情况下,只是根据资源数量乘法减少)。
对于前者,假设您从单个池中获取,只需在“单位数”中输入一个动态表达式 属性。在最简单的情况下(抓住所有可用的)它只是 pool.idle()
(对于名为 pool
的资源池)但是如果下一个代理到达而第一个正在处理(因为它将被处理因为需要零资源)所以,根据你的需要,你可能需要做一些事情,比如在你的服务块周围放置 RestrictedAreaStart / End 块,这样一次只有一个代理可以在服务块中。
NB:AnyLogic 当前有一个 bug/limitation 资源池的 idle/busy 计数(来自其 idle()
和 busy()
函数)不能保证是正确的,除非你在比seizes/releases发生更晚的模拟时间。 (这是由于隐藏事件 under-the-covers 中的事情是如何解决的。)所以,如果你想使用它们来确定要占用的资源数量,你需要解决这个问题;例如,
- 通过您自己的计数跟踪 busy/idle 单位的数量;
- 改为对池中的单个资源使用
isIdle()
函数(这通常需要确保资源池代理位于自定义群体中,而不是隐藏的默认群体中,因此您可以明确 reference/loop通过他们);
- 一些可怕和骇人听闻的事情,比如在进入服务块之前添加一个 very-small-timeout 延迟块(可能在 RestrictedAreaStart / Ends 内以确保代理不会进入延迟,从而确保服务块的占用机制,直到你希望他们这样做)。
一般来说,将 resources-needed 计算放在函数中(returns 一个 int
并将代理作为参数)放在“单元数”表达式。这样你就可以让计算变得尽可能复杂;看起来你可能需要比仅仅“抓住每个人”更复杂的考虑(例如,如果你了解 to-arrive 代理人等,可能取决于他们的流)。例如,您可能还希望事先将到达的代理保留在 Wait 块中,并且仅在所需资源数量可用时才释放它们。 (您需要提供更准确的关于您的要求的详细信息,以便在此处更加明确。)
对于可变延迟时间,有适当的延迟时间动态表达式;您可以使用 resourceUnits()
函数来获取您的代理占用的资源单元列表。因此,在最简单的情况下(根据资源数量乘法减少)它会类似于 10.0 / agent.resourceUnits().size()
(对于 10 个时间单位的基本延迟)。
我有一个资源池和一个服务块。资源池中的算子数量为5,与服务块挂钩。我想以一种方式设置服务,即在服务上工作的工人越多,延迟时间就越短。 (例如:如果 1 名工人工作,则延迟时间为 10 分钟 - 如果 2 名工人工作,则延迟时间为 5 分钟。 - 如果 3 名工人工作,则延迟时间为 3.33 分钟)。我希望最多 5 名操作员根据他们的可用性在服务区同时工作。 Service Block and Resource Pool 我怎样才能做到这一点?
所以您正在尝试使用您的服务块做两件事:
- 占用动态数量的单元(在最简单的情况下,占用所有可用单元)。
- 延迟时间取决于占用的单位数量(最简单的情况下,只是根据资源数量乘法减少)。
对于前者,假设您从单个池中获取,只需在“单位数”中输入一个动态表达式 属性。在最简单的情况下(抓住所有可用的)它只是 pool.idle()
(对于名为 pool
的资源池)但是如果下一个代理到达而第一个正在处理(因为它将被处理因为需要零资源)所以,根据你的需要,你可能需要做一些事情,比如在你的服务块周围放置 RestrictedAreaStart / End 块,这样一次只有一个代理可以在服务块中。
NB:AnyLogic 当前有一个 bug/limitation 资源池的 idle/busy 计数(来自其 idle()
和 busy()
函数)不能保证是正确的,除非你在比seizes/releases发生更晚的模拟时间。 (这是由于隐藏事件 under-the-covers 中的事情是如何解决的。)所以,如果你想使用它们来确定要占用的资源数量,你需要解决这个问题;例如,
- 通过您自己的计数跟踪 busy/idle 单位的数量;
- 改为对池中的单个资源使用
isIdle()
函数(这通常需要确保资源池代理位于自定义群体中,而不是隐藏的默认群体中,因此您可以明确 reference/loop通过他们); - 一些可怕和骇人听闻的事情,比如在进入服务块之前添加一个 very-small-timeout 延迟块(可能在 RestrictedAreaStart / Ends 内以确保代理不会进入延迟,从而确保服务块的占用机制,直到你希望他们这样做)。
一般来说,将 resources-needed 计算放在函数中(returns 一个 int
并将代理作为参数)放在“单元数”表达式。这样你就可以让计算变得尽可能复杂;看起来你可能需要比仅仅“抓住每个人”更复杂的考虑(例如,如果你了解 to-arrive 代理人等,可能取决于他们的流)。例如,您可能还希望事先将到达的代理保留在 Wait 块中,并且仅在所需资源数量可用时才释放它们。 (您需要提供更准确的关于您的要求的详细信息,以便在此处更加明确。)
对于可变延迟时间,有适当的延迟时间动态表达式;您可以使用 resourceUnits()
函数来获取您的代理占用的资源单元列表。因此,在最简单的情况下(根据资源数量乘法减少)它会类似于 10.0 / agent.resourceUnits().size()
(对于 10 个时间单位的基本延迟)。