服务块使用资源池工作者减少延迟时间

时间:2020-10-08 15:18:04

标签: anylogic

我有一个资源池和一个服务块。资源池中操作员的数量为5,该数量链接到服务块。我想以这样一种方式来设置服务,即更多的工人在该服务上工作,延迟时间会减少。 (例如:如果1名工人工作,延迟时间为10分钟-如果2名工人工作,延迟时间为5分钟-如果3名工人工作,延迟时间为3.33分钟)。我希望有多达5位操作员根据他们的可用性在服务块中同时工作。 Service Block and Resource Pool 我该如何实现?

1 个答案:

答案 0 :(得分:0)

因此,您正在尝试对Service块做两件事:

  • 获取动态数量的单元(在最简单的情况下,获取所有可用的单元)。
  • 延迟时间取决于所捕获的单元数(在最简单的情况下,只是根据资源数量成倍地减少)。

对于前者,假设您正在从单个池中捕获,只需在“ Number of units”属性中输入一个动态表达式。在最简单的情况下(抓住所有可用的资源),它只会是pool.idle()(对于名为pool的资源池),但是如果下一个代理在处理第一个代理的同时到达(这将被处理,则是个问题) (因为需要零资源),因此,根据您的需要,您可能需要执行一些操作,例如在Service块周围放置RestrictedAreaStart / End块,以便一次只能在Service块中放入一个代理。

NB :AnyLogic当前存在一个错误/限制,即不能保证资源池的空闲/忙碌计数(来自其idle()busy()函数)是正确的,除非您的模拟时间晚于扣押/释放发生的时间。 (这是由于如何解决隐藏事件中的隐藏事件。)因此,如果要在确定要占用的资源数量时使用它们,则需要解决此问题。例如,通过

  • 通过您自己的计数跟踪忙/闲单元的数量;
  • 改为对池中的各个资源使用isIdle()函数(这通常需要确保资源池代理位于自定义填充中,而不是隐藏的默认填充中,因此您可以显式引用/循环访问它们);
  • 一些可怕的事情,例如在进入Service块之前添加一个非常小的超时Delay块(可能在RestrictedAreaStart / Ends中,以确保代理不会使其进入Delay,从而避免Service块的占用机制,直到您希望他们这样做)。

通常,将需要资源的计算放入您在“单位数”表达式中调用的函数中(返回int,并将代理作为参数)是有意义的。这样,您可以使计算尽可能复杂。似乎您可能需要的不仅仅是“抢夺所有人”(例如,如果您了解代理人的知识,这取决于要到达的代理人的流向)。例如,也许您还希望将到达的业务代表预先保存在“等待”块中,并且仅在所需数量的资源可用时才释放它们。 (您需要提供关于您的要求的更精确的详细信息,以便在此处更加明确。)

对于可变延迟时间,请为延迟时间提供适当的动态表达式;您可以使用resourceUnits()函数来获取代理占用的资源单元的列表。因此,在最简单的情况下(根据资源数量成倍地减少),将类似于10.0 / agent.resourceUnits().size()(对于10个时间单位的基本延迟)。