首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用资源池工作人员减少延迟时间的服务块

使用资源池工作人员减少延迟时间的服务块
EN

Stack Overflow用户
提问于 2020-10-08 15:18:04
回答 1查看 276关注 0票数 0

我有一个资源池和一个服务块。资源池中的操作符数为5,它链接到服务块。我希望以这样一种方式设置服务,即工作人员越多,延迟时间就越短。(例:如果一名工人工作,则延迟时间为10分钟,如果2名工人工作,则延迟时间为5分钟。-如果3名工人工作,延迟时间为3.33分钟)。我希望多达5个运营商同时在服务块中工作,根据他们的可用性。服务块和资源库我怎样才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-09 12:50:52

因此,您试图用您的服务块做两件事:

  • 抓住一个动态数量的单位(在最简单的情况下,抓住所有可用的单位)。
  • 使延迟时间取决于被缉获单位的数量(在最简单的情况下,只是根据资源的数量成倍减少)。

对于前者,假设您从单个池中捕获,只需在“单元数量”属性中输入一个动态表达式即可。在最简单的情况下(获取所有可用的),它只是pool.idle() (对于一个名为pool的资源池),但如果下一个代理在处理第一个代理时到达(因为它将被视为需要零资源),这就有问题了。因此,根据您的需要,您可能需要在服务块周围放置RestrictedAreaStart / End块,这样就只能有一个代理在服务块中了。

NB:AnyLogic目前有一个错误/限制,即资源池的空闲/繁忙计数(从idle()busy()函数)不能保证是正确的,除非您所处的模拟时间比捕获/发布时要晚。(这是由于隐藏事件是如何在幕后解决的。)因此,如果您想使用它们来确定要占用的资源数量,则需要解决这一问题;例如,通过

  • 通过自己的统计,跟踪繁忙/闲置单元的数量;
  • 对池中的单个资源使用isIdle()函数(这通常需要确保资源池代理处于自定义填充中,而不是隐藏的默认填充中,这样就可以显式地引用/循环它们);
  • 一些可怕和麻烦的东西,比如在进入服务块之前添加一个非常小的超时延迟块(可能在RestrictedAreaStart /End内,以确保代理不会进入延迟,因此也就是服务块的捕捉机制,直到您希望它们进入)。

通常,将所需的资源计算放在一个函数中(该函数返回一个int并以代理作为参数)是有意义的,您可以在“单元数”表达式中调用该函数。这样你就可以让计算尽可能的复杂;看起来你可能需要一个比“抓住每个人”更复杂的考虑因素(例如,如果你知道的话,也许取决于即将到达的代理流,等等)。例如,您可能还希望预先将到达的代理保存在等待块中,并且只在需要的资源数量可用时才释放它们。(您需要对您的需求提供更精确的细节,以便在这里更加明确。)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64265641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档