我有一个资源池和一个服务块。资源池中的操作符数为5,它链接到服务块。我希望以这样一种方式设置服务,即工作人员越多,延迟时间就越短。(例:如果一名工人工作,则延迟时间为10分钟,如果2名工人工作,则延迟时间为5分钟。-如果3名工人工作,延迟时间为3.33分钟)。我希望多达5个运营商同时在服务块中工作,根据他们的可用性。服务块和资源库我怎样才能做到这一点?
发布于 2020-10-09 12:50:52
因此,您试图用您的服务块做两件事:
对于前者,假设您从单个池中捕获,只需在“单元数量”属性中输入一个动态表达式即可。在最简单的情况下(获取所有可用的),它只是pool.idle()
(对于一个名为pool
的资源池),但如果下一个代理在处理第一个代理时到达(因为它将被视为需要零资源),这就有问题了。因此,根据您的需要,您可能需要在服务块周围放置RestrictedAreaStart / End块,这样就只能有一个代理在服务块中了。
NB:AnyLogic目前有一个错误/限制,即资源池的空闲/繁忙计数(从idle()
和busy()
函数)不能保证是正确的,除非您所处的模拟时间比捕获/发布时要晚。(这是由于隐藏事件是如何在幕后解决的。)因此,如果您想使用它们来确定要占用的资源数量,则需要解决这一问题;例如,通过
isIdle()
函数(这通常需要确保资源池代理处于自定义填充中,而不是隐藏的默认填充中,这样就可以显式地引用/循环它们);通常,将所需的资源计算放在一个函数中(该函数返回一个int
并以代理作为参数)是有意义的,您可以在“单元数”表达式中调用该函数。这样你就可以让计算尽可能的复杂;看起来你可能需要一个比“抓住每个人”更复杂的考虑因素(例如,如果你知道的话,也许取决于即将到达的代理流,等等)。例如,您可能还希望预先将到达的代理保存在等待块中,并且只在需要的资源数量可用时才释放它们。(您需要对您的需求提供更精确的细节,以便在这里更加明确。)
对于可变延迟时间,对延迟时间有一个适当的动态表达式;您可以使用resourceUnits()
函数获取代理所捕获的资源单元的列表。因此,在最简单的情况下(根据资源的数量乘以减少),它将类似于10.0 / agent.resourceUnits().size()
(对于10个时间单位的基本延迟)。
https://stackoverflow.com/questions/64265641
复制相似问题