我有一个资源池和一个服务块。资源池中操作员的数量为5,该数量链接到服务块。我想以这样一种方式来设置服务,即更多的工人在该服务上工作,延迟时间会减少。 (例如:如果1名工人工作,延迟时间为10分钟-如果2名工人工作,延迟时间为5分钟-如果3名工人工作,延迟时间为3.33分钟)。我希望有多达5位操作员根据他们的可用性在服务块中同时工作。 Service Block and Resource Pool 我该如何实现?
答案 0 :(得分:0)
因此,您正在尝试对Service块做两件事:
对于前者,假设您正在从单个池中捕获,只需在“ Number of units”属性中输入一个动态表达式。在最简单的情况下(抓住所有可用的资源),它只会是pool.idle()
(对于名为pool
的资源池),但是如果下一个代理在处理第一个代理的同时到达(这将被处理,则是个问题) (因为需要零资源),因此,根据您的需要,您可能需要执行一些操作,例如在Service块周围放置RestrictedAreaStart / End块,以便一次只能在Service块中放入一个代理。
NB :AnyLogic当前存在一个错误/限制,即不能保证资源池的空闲/忙碌计数(来自其idle()
和busy()
函数)是正确的,除非您的模拟时间晚于扣押/释放发生的时间。 (这是由于如何解决隐藏事件中的隐藏事件。)因此,如果要在确定要占用的资源数量时使用它们,则需要解决此问题。例如,通过
isIdle()
函数(这通常需要确保资源池代理位于自定义填充中,而不是隐藏的默认填充中,因此您可以显式引用/循环访问它们); 通常,将需要资源的计算放入您在“单位数”表达式中调用的函数中(返回int
,并将代理作为参数)是有意义的。这样,您可以使计算尽可能复杂。似乎您可能需要的不仅仅是“抢夺所有人”(例如,如果您了解代理人的知识,这取决于要到达的代理人的流向)。例如,也许您还希望将到达的业务代表预先保存在“等待”块中,并且仅在所需数量的资源可用时才释放它们。 (您需要提供关于您的要求的更精确的详细信息,以便在此处更加明确。)
对于可变延迟时间,请为延迟时间提供适当的动态表达式;您可以使用resourceUnits()
函数来获取代理占用的资源单元的列表。因此,在最简单的情况下(根据资源数量成倍地减少),将类似于10.0 / agent.resourceUnits().size()
(对于10个时间单位的基本延迟)。